GD32的ADC例程分享

[复制链接]
3720|9
 楼主| laocuo1142 发表于 2020-11-10 14:55 | 显示全部楼层 |阅读模式
ADC, IO, pi, ni, gp
​static VOID ADC_GpioConfig(VOID)
{
    GPIO_InitPara GPIO_InitStructure;
  
    GPIO_InitStructure.GPIO_Pin = GPIO_PIN_3;
    GPIO_InitStructure.GPIO_Speed = GPIO_SPEED_50MHZ;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AIN;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}

static VOID ADC_AdcConfig(VOID)
{
    ADC_InitPara ADC_InitStructure;
   
    ADC_InitStructure.ADC_Mode = ADC_MODE_INDEPENDENT;
    ADC_InitStructure.ADC_Mode_Scan = DISABLE;
    ADC_InitStructure.ADC_Mode_Continuous = ENABLE;
    ADC_InitStructure.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
    ADC_InitStructure.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
    ADC_InitStructure.ADC_Channel_Number = 1 ;
    ADC_Init(ADC1, &ADC_InitStructure);
  
    ADC_RegularChannel_Config(ADC1, ADC_CHANNEL_13, 1, ADC_SAMPLETIME_71POINT5);
    ADC_Enable(ADC1, ENABLE);
    ADC_Calibration(ADC1);
    ADC_SoftwareStartConv_Enable(ADC1, ENABLE);
}

VOID DRV_ADC_Init(VOID)
{
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_GPIOC , ENABLE);
    RCC_APB2PeriphClock_Enable(RCC_APB2PERIPH_ADC1, ENABLE);
    RCC_ADCCLKConfig(RCC_ADCCLK_APB2_DIV12);
   
    ADC_GpioConfig();
    ADC_AdcConfig();
}

U16 DRV_ADC_GetConversionValue(VOID)
{
    return ADC_GetConversionValue(ADC1);
}
wowu 发表于 2020-12-4 10:10 | 显示全部楼层
代码风格良好 非常容易读懂
xiaoqizi 发表于 2020-12-4 11:09 | 显示全部楼层
配置的非常详细  没有任何疏漏
木木guainv 发表于 2020-12-4 11:18 | 显示全部楼层
这个代码非常的实用  我收藏了
磨砂 发表于 2020-12-4 11:22 | 显示全部楼层
感觉比工具生成的代码还好
晓伍 发表于 2020-12-4 11:23 | 显示全部楼层
楼主有其他采集模式的代码吗
小景报到 发表于 2021-6-21 23:50 | 显示全部楼层
本帖最后由 小景报到 于 2021-7-29 13:03 编辑

我也来个代码分享,测试ADC+DMA正常运行

  1. uint16_t adc_value[8];

  2. void rcu_config(void);
  3. void gpio_config(void);
  4. void dma_config(void);
  5. void adc_config(void);

  6. /*!
  7.     \brief      main function
  8.     \param[in]  none
  9.     \param[out] none
  10.     \retval     none
  11. */

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

  42. /*!
  43.     \brief      configure the different system clocks
  44.     \param[in]  none
  45.     \param[out] none
  46.     \retval     none
  47. */
  48. void rcu_config(void)
  49. {
  50.     /* enable GPIOA clock */
  51.                 rcu_periph_clock_enable(RCU_GPIOA);
  52.     rcu_periph_clock_enable(RCU_GPIOC);
  53.     /* enable ADC clock */
  54.     rcu_periph_clock_enable(RCU_ADC0);
  55.     /* enable DMA0 clock */
  56.     rcu_periph_clock_enable(RCU_DMA0);
  57.     /* config ADC clock */
  58.     rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8);
  59. }

  60. /*!
  61.     \brief      configure the GPIO peripheral
  62.     \param[in]  none
  63.     \param[out] none
  64.     \retval     none
  65. */
  66. void gpio_config(void)
  67. {
  68.     /* config the GPIO as analog mode */
  69.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
  70.     gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5);
  71.     gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4);
  72.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3);
  73.                 gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  74.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);
  75.     gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0);
  76.     gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_1);

  77. }

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

  108. /*!
  109.     \brief      configure the ADC peripheral
  110.     \param[in]  none
  111.     \param[out] none
  112.     \retval     none
  113. */
  114. void adc_config(void)
  115. {
  116.     /* reset ADC */
  117.     adc_deinit(ADC0);
  118.     /* ADC mode config */
  119.     adc_mode_config(ADC_MODE_FREE);
  120.     /* ADC contineous function enable */
  121.     adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE,ENABLE);
  122.     /* ADC scan mode enable */
  123.     adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
  124.     /* ADC data alignment config */
  125.     adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  126.     /* ADC channel length config */
  127.     adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 8);

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

  147.     /* ADC DMA function enable */
  148.     adc_dma_mode_enable(ADC0);
  149.     /* ADC software trigger enable */
  150.     adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
  151. }

  152. /* retarget the C library printf function to the USART */
  153. int fputc(int ch, FILE *f)
  154. {
  155.     usart_data_transmit(EVAL_COM0, (uint8_t)ch);
  156.     while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE));
  157.     return ch;
  158. }

评论

@Leviathan1024 :配置为ENABLE,ADC采集后的数据会不准确,你测试下看看  发表于 2021-6-27 15:11
请教一下ADC0可以使用ADC2无法正常使用的原因是什么  发表于 2021-6-24 11:13
ADC_SCAN_MODE 你配置的DISABLE ,不应该是ENABLE么  发表于 2021-6-22 12:50
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1296

主题

6239

帖子

15

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