[研电赛技术支持] GD32F303 ADC DMA 软件触发

[复制链接]
4757|10
 楼主| EDAStarer 发表于 2020-7-8 10:39 | 显示全部楼层 |阅读模式
怎样实现GD32F303 的ADC(DMA) 软件触发。需要哪个函数来控制哪个信号来触发ADC
sonicll 发表于 2020-7-8 11:15 | 显示全部楼层
官方固件库里的example里就有一个软件触发ADC,使用DMA的例子
 楼主| EDAStarer 发表于 2020-7-8 13:28 | 显示全部楼层
sonicll 发表于 2020-7-8 11:15
官方固件库里的example里就有一个软件触发ADC,使用DMA的例子

while(1){
        /* delay 1s */
        delay_1ms(1000);
        /* ADC software trigger enable */
        adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);      
    }
 楼主| EDAStarer 发表于 2020-7-8 13:29 | 显示全部楼层
sonicll 发表于 2020-7-8 11:15
官方固件库里的example里就有一个软件触发ADC,使用DMA的例子

是用 adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL)吗
aoyi 发表于 2020-8-3 18:21 | 显示全部楼层
还没有用过dma啊
drer 发表于 2020-8-3 18:21 | 显示全部楼层
有相关的库函数?
gwsan 发表于 2020-8-3 18:22 | 显示全部楼层
是怎么样启动的吧 楼主想问的是
kxsi 发表于 2020-8-3 18:22 | 显示全部楼层
有官方例程的
nawu 发表于 2020-8-3 18:22 | 显示全部楼层
能发一下例程连接吗
小景报到 发表于 2021-6-21 23:45 | 显示全部楼层
  1. #include "gd32f10x.h"
  2. #include "systick.h"
  3. #include <stdio.h>
  4. #include "gd32f10x_eval.h"

  5. //#define BOARD_ADC_CHANNEL           ADC_CHANNEL_13
  6. //#define ADC_GPIO_PORT               GPIOC
  7. //#define ADC_GPIO_PIN                GPIO_PIN_3

  8. uint16_t adc_value[8];

  9. void rcu_config(void);
  10. void gpio_config(void);
  11. void dma_config(void);
  12. void adc_config(void);

  13. /*!
  14.     \brief      main function
  15.     \param[in]  none
  16.     \param[out] none
  17.     \retval     none
  18. */

  19. int main(void)
  20. {
  21.     /* system clocks configuration */
  22.     rcu_config();
  23.     /* systick configuration */
  24.     systick_config();  
  25.     /* GPIO configuration */
  26.     gpio_config();
  27.     /* DMA configuration */
  28.     dma_config();
  29.         /* configure COM port */
  30.     gd_eval_com_init(EVAL_COM0);
  31.     /* ADC configuration */
  32.     adc_config();
  33.   
  34.     while(1){
  35.                         delay_1ms(1000);
  36.                         printf("\r\n //*******************************//");
  37.                         printf("\r\n PA2 regular channel data = %04d", adc_value[0]);
  38.                         printf("\r\n PC5 regular channel data = %04d", adc_value[1]);
  39.                         printf("\r\n PC4 regular channel data = %04d", adc_value[2]);
  40.                         printf("\r\n PA3 regular channel data = %04d\r\n", adc_value[3]);
  41.                         printf("\r\n PC0 regular channel data = %04d", adc_value[4]);
  42.                         printf("\r\n PA1 regular channel data = %04d", adc_value[5]);
  43.                         printf("\r\n PA0 regular channel data = %04d", adc_value[6]);
  44.                         printf("\r\n PC1 regular channel data = %04d\r\n", adc_value[7]);
  45.                        
  46.                        
  47.     }
  48. }

  49. /*!
  50.     \brief      configure the different system clocks
  51.     \param[in]  none
  52.     \param[out] none
  53.     \retval     none
  54. */
  55. void rcu_config(void)
  56. {
  57.     /* enable GPIOA clock */
  58.                 rcu_periph_clock_enable(RCU_GPIOA);
  59.     rcu_periph_clock_enable(RCU_GPIOC);
  60.     /* enable ADC clock */
  61.     rcu_periph_clock_enable(RCU_ADC0);
  62.     /* enable DMA0 clock */
  63.     rcu_periph_clock_enable(RCU_DMA0);
  64.     /* config ADC clock */
  65.     rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
  66. }

  67. /*!
  68.     \brief      configure the GPIO peripheral
  69.     \param[in]  none
  70.     \param[out] none
  71.     \retval     none
  72. */
  73. void gpio_config(void)
  74. {
  75.     /* config the GPIO as analog mode */
  76.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  77.     gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
  78.     gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
  79.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
  80.                 gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  81.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
  82.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  83.     gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);

  84. }

  85. /*!
  86.     \brief      configure the DMA peripheral
  87.     \param[in]  none
  88.     \param[out] none
  89.     \retval     none
  90. */
  91. void dma_config(void)
  92. {
  93.     /* ADC_DMA_channel configuration */
  94.     dma_parameter_struct dma_data_parameter;
  95.    
  96.     /* ADC DMA_channel configuration */
  97.     dma_deinit(DMA0, DMA_CH0);
  98.    
  99.     /* initialize DMA single data mode */
  100.     dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA(ADC0));
  101.     dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
  102.     dma_data_parameter.memory_addr  = (uint32_t)(&adc_value);
  103.     dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
  104.     dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  105.     dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  
  106.     dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
  107.     dma_data_parameter.number       = 8;
  108.     dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
  109.     dma_init(DMA0, DMA_CH0, &dma_data_parameter);
  110.     dma_circulation_enable(DMA0, DMA_CH0);
  111.   
  112.     /* enable DMA channel */
  113.     dma_channel_enable(DMA0, DMA_CH0);
  114. }

  115. /*!
  116.     \brief      configure the ADC peripheral
  117.     \param[in]  none
  118.     \param[out] none
  119.     \retval     none
  120. */
  121. void adc_config(void)
  122. {
  123.     /* reset ADC */
  124.     adc_deinit(ADC0);
  125.     /* ADC mode config */
  126.     adc_mode_config(ADC_MODE_FREE);
  127.     /* ADC contineous function enable */
  128.     adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE,ENABLE );
  129.     /* ADC scan mode disable */
  130.     adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE);
  131.     /* ADC data alignment config */
  132.     adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  133.     /* ADC channel length config */
  134.     adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 8);

  135.     /* ADC regular channel config */
  136.     /* ADC regular channel config */
  137.     adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_2, ADC_SAMPLETIME_239POINT5);
  138.     adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_15, ADC_SAMPLETIME_239POINT5);
  139.     adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_14, ADC_SAMPLETIME_239POINT5);
  140.     adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_239POINT5);
  141.         adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_10, ADC_SAMPLETIME_239POINT5);
  142.     adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_1, ADC_SAMPLETIME_239POINT5);
  143.     adc_regular_channel_config(ADC0, 6, ADC_CHANNEL_0, ADC_SAMPLETIME_239POINT5);
  144.     adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_11, ADC_SAMPLETIME_239POINT5);
  145.     /* ADC trigger config */
  146.     adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
  147.     adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
  148.    
  149.     /* enable ADC interface */
  150.     adc_enable(ADC0);
  151.     delay_1ms(1);
  152.     /* ADC calibration and reset calibration */
  153.     adc_calibration_enable(ADC0);

  154.     /* ADC DMA function enable */
  155.     adc_dma_mode_enable(ADC0);
  156.     /* ADC software trigger enable */
  157.     adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
  158. }

  159. /* retarget the C library printf function to the USART */
  160. int fputc(int ch, FILE *f)
  161. {
  162.     usart_data_transmit(EVAL_COM0, (uint8_t)ch);
  163.     while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));
  164.     return ch;
  165. }
QQ2224043166 发表于 2021-12-9 19:01 | 显示全部楼层
adc_software_trigger_enable()
您需要登录后才可以回帖 登录 | 注册

本版积分规则

12

主题

52

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部