GD32E230 ADC+DMA 单通道

ADC+DMA 多通道采集看这里

ADC.C

 __IO  uint16_t ADCConvertedValue ; 
void ADC_IO_Init(uint8_t adcPin)  
{
  	rcu_periph_clock_enable(RCU_GPIOA);
    rcu_adc_clock_config(RCU_ADCCK_APB2_DIV6);// ADC时钟为 72/6 = 12MHz
	  if(adcPin==0)
		{gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_0);}
		else if(adcPin==1)
		{gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_1);}	
		else if(adcPin==4)
	  {gpio_mode_set(GPIOA, GPIO_MODE_ANALOG, GPIO_PUPD_NONE, GPIO_PIN_4);}	
		else {}
}

 
void   ADC_DMAConfig(void)  
{
    dma_parameter_struct dma_data_parameter;

	  rcu_periph_clock_enable(RCU_DMA);
     rcu_periph_clock_enable(RCU_ADC);
    dma_deinit(DMA_CH0);
    
    dma_data_parameter.periph_addr  = (uint32_t)(&ADC_RDATA);
    dma_data_parameter.periph_inc   = DMA_PERIPH_INCREASE_DISABLE;
    dma_data_parameter.memory_addr  = (uint32_t)(&ADCConvertedValue);
    dma_data_parameter.memory_inc   = DMA_MEMORY_INCREASE_ENABLE;
    dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT;  
    dma_data_parameter.direction    = DMA_PERIPHERAL_TO_MEMORY;
    dma_data_parameter.number       = 1U;
    dma_data_parameter.priority     = DMA_PRIORITY_HIGH;
    dma_init(DMA_CH0, &dma_data_parameter);

    dma_circulation_enable(DMA_CH0);
    dma_memory_to_memory_disable(DMA_CH0);
    dma_channel_enable(DMA_CH0);
}


void   ADC_Config(uint8_t adcPinindex)
{ 
    adc_special_function_config(ADC_SCAN_MODE, DISABLE);
	  adc_special_function_config(ADC_CONTINUOUS_MODE, ENABLE);
  adc_external_trigger_source_config(ADC_REGULAR_CHANNEL, ADC_EXTTRIG_REGULAR_NONE); 
    adc_data_alignment_config(ADC_DATAALIGN_RIGHT);
		/* ADC分辨率 12B */
	  adc_resolution_config(ADC_RESOLUTION_12B);
    /* ADC channel length config */
    adc_channel_length_config(ADC_REGULAR_CHANNEL, 1U);
 
    /* ADC regular channel config */
	 if(adcPinindex == 0)
	 {
     adc_regular_channel_config(0U, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5);
	 }
	 else if(adcPinindex == 1)
	 {
		 	adc_regular_channel_config(0U, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5);
	 }
	 else if(adcPinindex == 4)
	 {
		 	adc_regular_channel_config(0U, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5);
	 }
  else{}	 
	
//    adc_external_trigger_config(ADC_REGULAR_CHANNEL, ENABLE);
    adc_external_trigger_config(ADC_REGULAR_CHANNEL, DISABLE);
    /* enable ADC interface */
    adc_enable();
    delay_1ms(1U);
    /* ADC calibration and reset calibration */
    adc_calibration_enable();

    /* ADC DMA function enable */
    adc_dma_mode_enable();
    /* ADC software trigger enable */
}

void   UserADC_init(uint8_t adcIndex)
{
	ADC_IO_Init(adcIndex);
	ADC_DMAConfig();
	ADC_Config(adcIndex);
}

uint16_t   GetADCVal(void)
{
		return  ADCConvertedValue;
}

项目里一般都要用到定时器,所以就没必要再开一个定时器去外部触发采样了, 50ms 调用一次软件触发采样

//---------------ADC采样-----------------				
			trigger_adc_cnt++;
			if(trigger_adc_cnt>=50)
			{
				trigger_adc_cnt = 0;
			  adc_software_trigger_enable(ADC_REGULAR_CHANNEL);
			}

ADC.H

#ifndef __ADC_H
#define __ADC_H

#include "gd32e23x.h"

 
void   UserADC_init(uint8_t adcIndex) ;
uint16_t   GetADCVal(void);
 

#endif //__ADC_H

在主循环任意地方获取ADC值就好了

Adc_Val =  GetADCVal();
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值