main.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. ///*
  2. // * Copyright (c) 2021 HPMicro
  3. // *
  4. // * SPDX-License-Identifier: BSD-3-Clause
  5. // *
  6. // */
  7. //#include <stdio.h>
  8. //#include "board.h"
  9. //#include "test.h"
  10. //#ifdef TEST_EN
  11. //#include "bsp_V8M_YY_led.h"
  12. //#include "bsp_V8M_YY_pwm.h"
  13. //#include "bsp_V8M_YY_adc.h"
  14. //#include "hard_system.h"
  15. //#include "hard_system_time.h"
  16. //#include "hard_system_delay.h"
  17. //#include "hard_system_timer.h"
  18. //#include "hard_imu_uart3.h"
  19. //#include "hard_rc_sbus.h"
  20. //#include "hard_can.h"
  21. //#include "hard_sbus_out.h"
  22. //#include "main.h"
  23. //#endif
  24. ///*
  25. //1 手册:中断源优先级,有效值为 0 到 7。
  26. //2 注意:内存缓存问题 catch
  27. // 如果DMA要访问​ → 必须用非缓存宏
  28. // 如果多核要共享​ → 必须用非缓存宏
  29. // 如果频繁被中断更新​ → 建议用非缓存宏
  30. // 其他情况​ → 不用修饰,让编译器优化
  31. //3 注意配置顺序 IO-时钟-外设
  32. //4 XDMA,作为主设备连接到 AXI 系统总线 HDMA,作为主设备连接到 AHB 外设总线
  33. // 当 XDMA 的 destination 为 DRAM 时,如果 burst 大于等于 16,那 destsize 必须为 64bit。
  34. // DMAMUX 的输出 0∼7 连接到外设总线 DMA 控制器 HDMA,DMAMUX 的输出 8∼15 连接到系统总线 DMA 控制器 XDMA
  35. // 它们都连接在统一的 DMAMUX(DMA 多路复用器)
  36. // DMAMUX将所有外设的 DMA 请求(Request)统一管理,然后根据你的配置分配给 HDMA 或 XDMA 的任意空闲通道
  37. //*/
  38. //static void test_hard(void)
  39. //{
  40. // // v8m_yy_led_test();
  41. // // v8m_yy_motor_pwm_test();
  42. // v8m_yy_adc_test();
  43. // // timer0_test();
  44. // // cpu_delay_test();
  45. // // timer1_test();
  46. // // can2_test();
  47. // // imu_uart3_test();
  48. // // uart2_sbus_test();
  49. // // system_test();
  50. // // sbus_uart2_out_test();
  51. //}
  52. //int main(void)
  53. //{
  54. // board_init();
  55. // printf("hello world\n");
  56. // test_hard();
  57. // return 0;
  58. //}
  59. //// DMA 最大4k
  60. /*
  61. * Copyright (c) 2021-2024 HPMicro
  62. *
  63. * SPDX-License-Identifier: BSD-3-Clause
  64. *
  65. */
  66. #include "board.h"
  67. #include "hpm_debug_console.h"
  68. #include "hpm_adc12_drv.h"
  69. #include "hpm_pwm_drv.h"
  70. #include "hpm_trgm_drv.h"
  71. #include "hpm_trgmmux_src.h"
  72. #define __ADC12_USE_SW_TRIG
  73. #ifndef APP_ADC12_CORE
  74. #define APP_ADC12_CORE BOARD_RUNNING_CORE
  75. #endif
  76. #define APP_ADC12_CH_SAMPLE_CYCLE (20U)
  77. #define APP_ADC12_CH_WDOG_EVENT (1 << BOARD_APP_ADC12_CH_1)
  78. #define APP_ADC12_SEQ_START_POS (0U)
  79. #define APP_ADC12_SEQ_DMA_BUFF_LEN_IN_4BYTES (1024U)
  80. #define APP_ADC12_SEQ_IRQ_EVENT adc12_event_seq_single_complete
  81. #define APP_ADC12_HW_TRIG_SRC_PWM_REFCH_A (8U)
  82. #define APP_ADC12_HW_TRIG_SRC BOARD_APP_ADC12_HW_TRIG_SRC
  83. #define APP_ADC12_HW_TRGM BOARD_APP_ADC12_HW_TRGM
  84. #define APP_ADC12_HW_TRGM_IN BOARD_APP_ADC12_HW_TRGM_IN
  85. #define APP_ADC12_HW_TRGM_OUT_SEQ BOARD_APP_ADC12_HW_TRGM_OUT_SEQ
  86. #define APP_ADC12_HW_TRGM_OUT_PMT BOARD_APP_ADC12_HW_TRGM_OUT_PMT
  87. #define APP_ADC12_PMT_TRIG_CH BOARD_APP_ADC12_PMT_TRIG_CH
  88. #define APP_ADC12_PMT_DMA_BUFF_LEN_IN_4BYTES ADC_SOC_PMT_MAX_DMA_BUFF_LEN_IN_4BYTES
  89. #define APP_ADC12_PMT_IRQ_EVENT adc12_event_trig_complete
  90. #ifndef APP_ADC12_TRIG_SRC_FREQUENCY
  91. #define APP_ADC12_TRIG_SRC_FREQUENCY (20000U)
  92. #endif
  93. ATTR_PLACE_AT_NONCACHEABLE_WITH_ALIGNMENT(ADC_SOC_DMA_ADDR_ALIGNMENT) uint32_t seq_buff[APP_ADC12_SEQ_DMA_BUFF_LEN_IN_4BYTES];
  94. ATTR_PLACE_AT_NONCACHEABLE_WITH_ALIGNMENT(ADC_SOC_DMA_ADDR_ALIGNMENT) uint32_t pmt_buff[APP_ADC12_PMT_DMA_BUFF_LEN_IN_4BYTES];
  95. uint8_t seq_adc_channel[] = {BOARD_APP_ADC12_CH_1};
  96. uint8_t trig_adc_channel[] = {BOARD_APP_ADC12_CH_1};
  97. __IO uint8_t seq_complete_flag;
  98. __IO uint8_t trig_complete_flag;
  99. __IO uint32_t res_out_of_thr_flag;
  100. static uint8_t get_adc_conv_mode(void)
  101. {
  102. uint8_t ch;
  103. while (1) {
  104. printf("1. Oneshot mode\n");
  105. printf("2. Period mode\n");
  106. printf("3. Sequence mode\n");
  107. printf("4. Preemption mode\n");
  108. printf("Please enter one of ADC conversion modes above (e.g. 1 or 2 ...): ");
  109. printf("%c\n", ch = getchar());
  110. ch -= '0' + 1;
  111. if (ch > adc12_conv_mode_preemption) {
  112. printf("The ADC mode is not supported!\n");
  113. } else {
  114. return ch;
  115. }
  116. }
  117. }
  118. SDK_DECLARE_EXT_ISR_M(BOARD_APP_ADC12_IRQn, isr_adc12)
  119. void isr_adc12(void)
  120. {
  121. uint32_t status;
  122. status = adc12_get_status_flags(BOARD_APP_ADC12_BASE);
  123. /* Clear status */
  124. adc12_clear_status_flags(BOARD_APP_ADC12_BASE, status);
  125. if (ADC12_INT_STS_SEQ_CVC_GET(status)) {
  126. /* Set flag to read memory data */
  127. seq_complete_flag = 1;
  128. }
  129. if (ADC12_INT_STS_TRIG_CMPT_GET(status)) {
  130. /* Set flag to read memory data */
  131. trig_complete_flag = 1;
  132. }
  133. if (ADC12_INT_STS_WDOG_GET(status) & APP_ADC12_CH_WDOG_EVENT) {
  134. adc12_disable_interrupts(BOARD_APP_ADC12_BASE, APP_ADC12_CH_WDOG_EVENT);
  135. res_out_of_thr_flag = ADC12_INT_STS_WDOG_GET(status) & APP_ADC12_CH_WDOG_EVENT;
  136. }
  137. }
  138. hpm_stat_t process_seq_data(uint32_t *buff, uint32_t start_pos, uint32_t len)
  139. {
  140. adc12_seq_dma_data_t *dma_data = (adc12_seq_dma_data_t *)buff;
  141. if (ADC12_IS_SEQ_DMA_BUFF_LEN_INVLAID(len)) {
  142. return status_invalid_argument;
  143. }
  144. for (uint32_t i = start_pos; i < start_pos + len; i++) {
  145. printf("Sequence Mode - %s - ", BOARD_APP_ADC12_NAME);
  146. printf("Cycle Bit: %02d - ", dma_data[i].cycle_bit);
  147. printf("Sequence Number:%02d - ", dma_data[i].seq_num);
  148. printf("ADC Channel: %02d - ", dma_data[i].adc_ch);
  149. printf("Result: 0x%04x\n", dma_data[i].result);
  150. }
  151. return status_success;
  152. }
  153. hpm_stat_t process_pmt_data(uint32_t *buff, int32_t start_pos, uint32_t len)
  154. {
  155. adc12_pmt_dma_data_t *dma_data = (adc12_pmt_dma_data_t *)buff;
  156. if (ADC12_IS_PMT_DMA_BUFF_LEN_INVLAID(len)) {
  157. return status_invalid_argument;
  158. }
  159. for (uint32_t i = start_pos; i < start_pos + len; i++) {
  160. if (dma_data[i].cycle_bit) {
  161. printf("Preemption Mode - %s - ", BOARD_APP_ADC12_NAME);
  162. printf("Trigger Channel: %02d - ", dma_data[i].trig_ch);
  163. printf("Cycle Bit: %02d - ", dma_data[i].cycle_bit);
  164. printf("Sequence Number: %02d - ", dma_data[i].seq_num);
  165. printf("ADC Channel: %02d - ", dma_data[i].adc_ch);
  166. printf("Result: 0x%04x\n", dma_data[i].result);
  167. dma_data[i].cycle_bit = 0;
  168. } else {
  169. printf("invalid data\n");
  170. }
  171. }
  172. return status_success;
  173. }
  174. void init_trigger_source(PWM_Type *ptr)
  175. {
  176. pwm_cmp_config_t pwm_cmp_cfg;
  177. pwm_output_channel_t pwm_output_ch_cfg;
  178. int mot_clock_freq;
  179. mot_clock_freq = clock_get_frequency(BOARD_APP_ADC12_HW_TRIG_SRC_CLK_NAME);
  180. /* reload value */
  181. pwm_set_reload(ptr, 0, (mot_clock_freq/APP_ADC12_TRIG_SRC_FREQUENCY) - 1);
  182. /* Set a comparator */
  183. memset(&pwm_cmp_cfg, 0x00, sizeof(pwm_cmp_config_t));
  184. pwm_cmp_cfg.enable_ex_cmp = false;
  185. pwm_cmp_cfg.mode = pwm_cmp_mode_output_compare;
  186. pwm_cmp_cfg.update_trigger = pwm_shadow_register_update_on_shlk;
  187. /* Select comp8 and trigger at the middle of a pwm cycle */
  188. pwm_cmp_cfg.cmp = ((mot_clock_freq/APP_ADC12_TRIG_SRC_FREQUENCY) - 1) >> 1;
  189. pwm_config_cmp(ptr, APP_ADC12_HW_TRIG_SRC_PWM_REFCH_A, &pwm_cmp_cfg);
  190. /* Issue a shadow lock */
  191. pwm_issue_shadow_register_lock_event(APP_ADC12_HW_TRIG_SRC);
  192. /* Set comparator channel to generate a trigger signal */
  193. pwm_output_ch_cfg.cmp_start_index = APP_ADC12_HW_TRIG_SRC_PWM_REFCH_A; /* start channel */
  194. pwm_output_ch_cfg.cmp_end_index = APP_ADC12_HW_TRIG_SRC_PWM_REFCH_A; /* end channel */
  195. pwm_output_ch_cfg.invert_output = false;
  196. pwm_config_output_channel(ptr, APP_ADC12_HW_TRIG_SRC_PWM_REFCH_A, &pwm_output_ch_cfg);
  197. /* Start the comparator counter */
  198. pwm_start_counter(ptr);
  199. }
  200. void init_trigger_mux(TRGM_Type *ptr, uint8_t input, uint8_t output)
  201. {
  202. trgm_output_t trgm_output_cfg;
  203. trgm_output_cfg.invert = false;
  204. trgm_output_cfg.type = trgm_output_same_as_input;
  205. trgm_output_cfg.input = input;
  206. trgm_output_config(ptr, output, &trgm_output_cfg);
  207. }
  208. void init_trigger_target(ADC12_Type *ptr, uint8_t trig_ch)
  209. {
  210. adc12_pmt_config_t pmt_cfg;
  211. pmt_cfg.trig_len = sizeof(trig_adc_channel);
  212. pmt_cfg.trig_ch = trig_ch;
  213. for (int i = 0; i < pmt_cfg.trig_len; i++) {
  214. pmt_cfg.adc_ch[i] = trig_adc_channel[i];
  215. pmt_cfg.inten[i] = false;
  216. }
  217. pmt_cfg.inten[pmt_cfg.trig_len - 1] = true;
  218. adc12_set_pmt_config(ptr, &pmt_cfg);
  219. }
  220. hpm_stat_t init_common_config(adc12_conversion_mode_t conv_mode)
  221. {
  222. adc12_config_t cfg;
  223. /* initialize an ADC instance */
  224. adc12_get_default_config(&cfg);
  225. cfg.res = adc12_res_12_bits;
  226. cfg.conv_mode = conv_mode;
  227. cfg.diff_sel = adc12_sample_signal_single_ended;
  228. cfg.adc_clk_div = adc12_clock_divider_3;
  229. cfg.sel_sync_ahb = (clk_adc_src_ahb0 == clock_get_source(BOARD_APP_ADC12_CLK_NAME)) ? true : false;
  230. if (cfg.conv_mode == adc12_conv_mode_sequence ||
  231. cfg.conv_mode == adc12_conv_mode_preemption) {
  232. cfg.adc_ahb_en = true;
  233. }
  234. /* adc12 initialization */
  235. if (adc12_init(BOARD_APP_ADC12_BASE, &cfg) == status_success) {
  236. /* enable irq */
  237. intc_m_enable_irq_with_priority(BOARD_APP_ADC12_IRQn, 1);
  238. return status_success;
  239. } else {
  240. printf("%s initialization failed!\n", BOARD_APP_ADC12_NAME);
  241. return status_fail;
  242. }
  243. }
  244. void channel_result_out_of_threshold_handler(void)
  245. {
  246. adc12_channel_threshold_t threshold;
  247. uint32_t i = 31;
  248. if (res_out_of_thr_flag) {
  249. while (i--) {
  250. if ((res_out_of_thr_flag >> i) & 0x01) {
  251. adc12_get_channel_threshold(BOARD_APP_ADC12_BASE, i, &threshold);
  252. printf("Warning - %s [channel %02d] - Sample voltage is out of the thresholds between 0x%04x and 0x%04x !\n", BOARD_APP_ADC12_NAME, i, threshold.thshdl, threshold.thshdh);
  253. }
  254. }
  255. res_out_of_thr_flag = 0;
  256. adc12_enable_interrupts(BOARD_APP_ADC12_BASE, APP_ADC12_CH_WDOG_EVENT);
  257. }
  258. }
  259. void init_oneshot_config(void)
  260. {
  261. adc12_channel_config_t ch_cfg;
  262. /* get a default channel config */
  263. adc12_get_channel_default_config(&ch_cfg);
  264. /* initialize an ADC channel */
  265. ch_cfg.ch = BOARD_APP_ADC12_CH_1;
  266. ch_cfg.diff_sel = adc12_sample_signal_single_ended;
  267. ch_cfg.sample_cycle = APP_ADC12_CH_SAMPLE_CYCLE;
  268. adc12_init_channel(BOARD_APP_ADC12_BASE, &ch_cfg);
  269. adc12_set_nonblocking_read(BOARD_APP_ADC12_BASE);
  270. }
  271. void oneshot_handler(void)
  272. {
  273. uint16_t result;
  274. if (adc12_get_oneshot_result(BOARD_APP_ADC12_BASE, BOARD_APP_ADC12_CH_1, &result) == status_success) {
  275. if (adc12_is_nonblocking_mode(BOARD_APP_ADC12_BASE)) {
  276. adc12_get_oneshot_result(BOARD_APP_ADC12_BASE, BOARD_APP_ADC12_CH_1, &result);
  277. }
  278. printf("Oneshot Mode - %s [channel %02d] - Result: 0x%04x\n", BOARD_APP_ADC12_NAME, BOARD_APP_ADC12_CH_1, result);
  279. }
  280. }
  281. void init_period_config(void)
  282. {
  283. adc12_channel_config_t ch_cfg;
  284. adc12_prd_config_t prd_cfg;
  285. /* get a default channel config */
  286. adc12_get_channel_default_config(&ch_cfg);
  287. /* initialize an ADC channel */
  288. ch_cfg.ch = BOARD_APP_ADC12_CH_1;
  289. ch_cfg.diff_sel = adc12_sample_signal_single_ended;
  290. ch_cfg.sample_cycle = APP_ADC12_CH_SAMPLE_CYCLE;
  291. adc12_init_channel(BOARD_APP_ADC12_BASE, &ch_cfg);
  292. prd_cfg.ch = BOARD_APP_ADC12_CH_1;
  293. prd_cfg.prescale = 22; /* Set divider: 2^22 clocks */
  294. prd_cfg.period_count = 5; /* 104.86ms when AHB clock at 200MHz is ADC clock source */
  295. adc12_set_prd_config(BOARD_APP_ADC12_BASE, &prd_cfg);
  296. }
  297. void period_handler(void)
  298. {
  299. uint16_t result;
  300. adc12_get_prd_result(BOARD_APP_ADC12_BASE, BOARD_APP_ADC12_CH_1, &result);
  301. printf("Period Mode - %s [channel %02d] - Result: 0x%04x\n", BOARD_APP_ADC12_NAME, BOARD_APP_ADC12_CH_1, result);
  302. }
  303. void init_sequence_config(void)
  304. {
  305. adc12_seq_config_t seq_cfg;
  306. adc12_dma_config_t dma_cfg;
  307. adc12_channel_config_t ch_cfg;
  308. /* get a default channel config */
  309. adc12_get_channel_default_config(&ch_cfg);
  310. /* initialize an ADC channel */
  311. ch_cfg.diff_sel = adc12_sample_signal_single_ended;
  312. ch_cfg.sample_cycle = APP_ADC12_CH_SAMPLE_CYCLE;
  313. for (uint32_t i = 0; i < sizeof(seq_adc_channel); i++) {
  314. ch_cfg.ch = seq_adc_channel[i];
  315. adc12_init_channel(BOARD_APP_ADC12_BASE, &ch_cfg);
  316. }
  317. /* Set a sequence config */
  318. seq_cfg.seq_len = sizeof(seq_adc_channel);
  319. seq_cfg.restart_en = false;
  320. seq_cfg.cont_en = true;
  321. #ifndef __ADC12_USE_SW_TRIG
  322. seq_cfg.hw_trig_en = true;
  323. seq_cfg.sw_trig_en = false;
  324. #else
  325. seq_cfg.hw_trig_en = false;
  326. seq_cfg.sw_trig_en = true;
  327. #endif
  328. for (int i = APP_ADC12_SEQ_START_POS; i < seq_cfg.seq_len; i++) {
  329. seq_cfg.queue[i].seq_int_en = false;
  330. seq_cfg.queue[i].ch = seq_adc_channel[i];
  331. }
  332. /* Enable the single complete interrupt for the last conversion */
  333. seq_cfg.queue[seq_cfg.seq_len - 1].seq_int_en = true;
  334. /* Initialize a sequence */
  335. adc12_set_seq_config(BOARD_APP_ADC12_BASE, &seq_cfg);
  336. /* Set a DMA config */
  337. dma_cfg.start_addr = (uint32_t *)core_local_mem_to_sys_address(APP_ADC12_CORE, (uint32_t)seq_buff);
  338. dma_cfg.buff_len_in_4bytes = sizeof(seq_adc_channel);
  339. dma_cfg.stop_en = false;
  340. dma_cfg.stop_pos = 0;
  341. /* Initialize DMA for the sequence mode */
  342. adc12_init_seq_dma(BOARD_APP_ADC12_BASE, &dma_cfg);
  343. /* Enable sequence complete interrupt */
  344. adc12_enable_interrupts(BOARD_APP_ADC12_BASE, APP_ADC12_SEQ_IRQ_EVENT);
  345. #ifndef __ADC12_USE_SW_TRIG
  346. /* Trigger mux initialization */
  347. init_trigger_mux(APP_ADC12_HW_TRGM, APP_ADC12_HW_TRGM_IN, APP_ADC12_HW_TRGM_OUT_SEQ);
  348. /* Trigger source initialization */
  349. init_trigger_source(APP_ADC12_HW_TRIG_SRC);
  350. #endif
  351. }
  352. void sequence_handler(void)
  353. {
  354. #ifdef __ADC12_USE_SW_TRIG
  355. /* SW trigger */
  356. adc12_trigger_seq_by_sw(BOARD_APP_ADC12_BASE);
  357. #endif
  358. while (seq_complete_flag == 0) {
  359. }
  360. /* Process data */
  361. process_seq_data(seq_buff, APP_ADC12_SEQ_START_POS, sizeof(seq_adc_channel));
  362. /* Clear the flag */
  363. seq_complete_flag = 0;
  364. }
  365. void init_preemption_config(void)
  366. {
  367. adc12_channel_config_t ch_cfg;
  368. /* get a default channel config */
  369. adc12_get_channel_default_config(&ch_cfg);
  370. /* initialize an ADC channel */
  371. ch_cfg.diff_sel = adc12_sample_signal_single_ended;
  372. ch_cfg.sample_cycle = APP_ADC12_CH_SAMPLE_CYCLE;
  373. for (uint32_t i = 0; i < sizeof(trig_adc_channel); i++) {
  374. ch_cfg.ch = trig_adc_channel[i];
  375. adc12_init_channel(BOARD_APP_ADC12_BASE, &ch_cfg);
  376. }
  377. /* Trigger target initialization */
  378. init_trigger_target(BOARD_APP_ADC12_BASE, APP_ADC12_PMT_TRIG_CH);
  379. /* Set DMA start address for preemption mode */
  380. adc12_init_pmt_dma(BOARD_APP_ADC12_BASE, core_local_mem_to_sys_address(APP_ADC12_CORE, (uint32_t)pmt_buff));
  381. /* Enable trigger complete interrupt */
  382. adc12_enable_interrupts(BOARD_APP_ADC12_BASE, APP_ADC12_PMT_IRQ_EVENT);
  383. #ifndef __ADC12_USE_SW_TRIG
  384. /* Trigger mux initialization */
  385. init_trigger_mux(APP_ADC12_HW_TRGM, APP_ADC12_HW_TRGM_IN, APP_ADC12_HW_TRGM_OUT_PMT);
  386. /* Trigger source initialization */
  387. init_trigger_source(APP_ADC12_HW_TRIG_SRC);
  388. #endif
  389. }
  390. void preemption_handler(void)
  391. {
  392. #ifdef __ADC12_USE_SW_TRIG
  393. /* SW trigger */
  394. adc12_trigger_pmt_by_sw(BOARD_APP_ADC12_BASE, APP_ADC12_PMT_TRIG_CH);
  395. #endif
  396. /* Wait for a complete of conversion */
  397. while (trig_complete_flag == 0) {
  398. }
  399. /* Process data */
  400. process_pmt_data(pmt_buff, APP_ADC12_PMT_TRIG_CH * sizeof(adc12_pmt_dma_data_t), sizeof(trig_adc_channel));
  401. /* Clear the flag */
  402. trig_complete_flag = 0;
  403. }
  404. int main(void)
  405. {
  406. uint8_t conv_mode;
  407. /* Bsp initialization */
  408. board_init();
  409. /* ADC pin initialization */
  410. board_init_adc12_pins();
  411. /* ADC clock initialization */
  412. board_init_adc_clock(BOARD_APP_ADC12_BASE, true);
  413. printf("This is an ADC12 demo:\n");
  414. while (1) {
  415. /* Get a conversion mode from a console window */
  416. conv_mode = get_adc_conv_mode();
  417. /* ADC12 common initialization */
  418. init_common_config(conv_mode);
  419. /* ADC12 read patter and DMA initialization */
  420. switch (conv_mode) {
  421. case adc12_conv_mode_oneshot:
  422. init_oneshot_config();
  423. break;
  424. case adc12_conv_mode_period:
  425. init_period_config();
  426. break;
  427. case adc12_conv_mode_sequence:
  428. init_sequence_config();
  429. break;
  430. case adc12_conv_mode_preemption:
  431. init_preemption_config();
  432. break;
  433. default:
  434. break;
  435. }
  436. /* Main loop */
  437. while (1) {
  438. channel_result_out_of_threshold_handler();
  439. if (conv_mode == adc12_conv_mode_oneshot) {
  440. oneshot_handler();
  441. } else if (conv_mode == adc12_conv_mode_period) {
  442. period_handler();
  443. } else if (conv_mode == adc12_conv_mode_sequence) {
  444. sequence_handler();
  445. } else if (conv_mode == adc12_conv_mode_preemption) {
  446. preemption_handler();
  447. } else {
  448. printf("Conversion mode is not supported!\n");
  449. }
  450. if (console_try_receive_byte() == ' ') {
  451. break;
  452. }
  453. }
  454. }
  455. }