1:初始化ADC所用到的GPIO口
(主要包括使能对应的GPIO时钟,GPIO模块GPIOA或GPIOB等等,GPIO模式(输入或者输出),GPIO的速度,引脚选择)
rcu_periph_clock_enable(RCU_GPIOA);//使能GPIO时钟
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_6 | GPIO_PIN_7| GPIO_PIN_8|);//初始化GPIO引脚
2: 使能ADC时钟和对ADC时钟进行分频
rcu_periph_clock_enable(RCU_ADC0);//使能ADC种用到哪个ADC就使能对应的时钟
rcu_adc_clock_config(RCU_CKADC_CKAHB_DIV5); /*对ADC时钟进行分频,系统时钟的频率为120MHZ ADC时钟频率:AHB=120MHz/5 = 24MHz*/
3:配置ADC同步模式
配置ADC同步模式为独立模式,这时每一个ADC模块(ADC0,ADC1,ADC2)都是独立工作的
adc_mode_config(ADC_MODE_FREE);
4:配置ADC转换模式为非连续转换,扫描模式
(ADC扫描模式,当配置了多个ADC通道时依次采集各个通道的数据)
(ADC非连续转换模式表示ADC触发之后只转换一次,转换结束后要等到下一次触发)
adc_special_function_config(ADCX, ADC_SCAN_MODE, ENABLE);//ADC扫描模式
adc_special_function_config(ADCX, ADC_CONTINUOUS_MODE, DISABLE);//ADC连续转换模式关闭
5:配置ADC采样精度
精度为12位(ADC采集精度有6位,8位,12位)
adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
6:配置ADC数据对齐方式
对齐方式为右对齐
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
7:配置ADC通道
(配置ADC规则组通道,通道数量为3,通过查数据手册获得前面所配置各个GPIO口分别对应的ADC通道,并将各个通道进行排序,排好序后ADC扫描模式就按照排序依次采集)
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 3);(规则组,通道数量为3)
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_6, ADC_SAMPLETIME_13POINT5);(GPIOA6脚对应ADC0的通道6,排序为0,采样时间为13.5个周期)
adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_7, ADC_SAMPLETIME_13POINT5);
adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_8, ADC_SAMPLETIME_13POINT5);
8:使能ADC外部触发,配置外部触发源
使能ADC外部触发(ADC可以通过外部的一些信号来进行触发开始采样),
配置外部触发源(用什么外部信号来触发ADC采样,触发源的选择如下图,不同ADC模块触发源不同)
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);//使能外部触发
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);//选择外部触发方式为软件触发
9:校准ADC
(ADC自带的校准),ADC校准有时间要求所以要加一个延时
usr_DelayMs(1);
adc_calibration_enable(ADC0);//ADC校准
10: 使能DMA模式
(ADC规则组只有一个数据寄存器当配置了多个ADC通道并开启扫描模式时就需要配合DMA,当ADC每采集完一个通道将数据送到数据寄存器中时就使用DMA将数据寄存器中的数据搬到其它地方进行存储(可以自己定义一个数组存储),以免当ADC采集下一个通道将数据送到数据寄存器中时覆盖了上一个通道的数据导致数据丢失)
adc_dma_mode_enable(ADC0);//使能DMA
11:使能ADC(当配置完ADC后还需要使能ADC只有这样触发ADC,ADC才能开始工作)
最终上完整代码
其中ADC使用软件触发还需要添加代码(每运行一次该代码就触发一次ADC采样),该代码可以放到中断函数中那么每进一次中断就会触发一次ADC采样
adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);//ADC采样软件触发
rcu_periph_clock_enable(RCU_GPIOA);
gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_MAX, GPIO_PIN_6 | GPIO_PIN_7| GPIO_PIN_8|);
rcu_periph_clock_enable(RCU_ADC0);
rcu_adc_clock_config(RCU_CKADC_CKAHB_DIV5); /*AHB=120MHz/5 = 24MHz*/
adc_mode_config(ADC_MODE_FREE);
adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 3);
adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_6, ADC_SAMPLETIME_13POINT5);
adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_7, ADC_SAMPLETIME_13POINT5);
adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_8, ADC_SAMPLETIME_13POINT5);
adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL,
ADC0_1_2_EXTTRIG_REGULAR_NONE);
usr_DelayMs(1);
adc_calibration_enable(ADC0);
adc_dma_mode_enable(ADC0);
adc_enable(ADC0);