提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
GD32 ADC驱动-多通道DMA软件触发
0 参考文档
GD32F30x_User_Manual_CN_v2.2 章节12.4
1 基础知识点
a. 规则通道、注入通道
规则组:regular, 16个通道共用一个存储寄存器,ADC采集的结果都放入该寄存器中。例如,当通道1的采集后数据未被取出,通道2采集后将覆盖该数据。
注入组:inserted, 4个通道都有独立的存储寄存器,数据不会被覆盖
b. 触发方式
外部触发、内部定时器触发、软件触发
![在这里插入图片描述](https://img-blog.csdnimg.cn/a653ad6071604069bf5f3ed2156861f9.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAbGdwMzMz,size_11,color_FFFFFF,t_70,g_se,x_16#pic_center
图1
c. 单次转换模式、扫描模式
单次转换模式:只转换一个通道(配置的rank 0)
扫描模式 : SCAN, 转换一个通道组,包含多个通道
d. 连续模式、间断模式
连续模式:Continuous, 只需一次外部触发,可以在转换完成后,自动进行下一次转换
间断模式: 每次采集都需要外部触发。
两者独立配置可以组成四种组合:单次间断、单次连续、扫描间断、扫描连续
e. 序列长度、序列等级
序列长度:length, 见【图2】23:20 RL[3:0]的定义。扫描模式时,会转换多个通道,具体几个则是由配置的序列长度决定的,即多 = length
序列等级:rank ,见【图3】RSQ0[4:0] .换多个通道时,会按照rank映射的顺序进行转换,而非实际的channel顺序。
图2
图3
f . 实际例子
i. 配置规则通道,单次间断,(单通道间断)length = 1, (rank = 0,channel = 2)
图4
ii.配置规则通道,单次连续,(单通道连续),length = 1, (rank = 0,channel = 2)
图5
iii. 配置规则通道,扫描间断,length = 8
(rank = 0,channel = 2)
(rank = 1, channel = 1 )
(rank = 2, channel = 5 ),
(rank = 3, channel = 7 ),
(rank = 4, channel = 11 ),
(rank = 5, channel = 16 ),
(rank = 6, channel = 12 ),
(rank = 7, channel = 17 ),
最后的结果是如下图6
图6
iii. 配置规则通道,扫描连续,length = 5。rank=0,1,2,3,4, chanel = 2,1,5,7,11
图7
2 多通道转换代码配置
a. 连续转换 与 扫描模式配置
adc_special_function_config(adc_x, ADC_CONTINUOUS_MODE, ENABLE);
adc_special_function_config(adc_x, ADC_SCAN_MODE, ENABLE);
需要强调,连续转换失能 = 间断模式 , 扫描模式使能 = 单次转换。两者独立配置可以组成四种组合:单次间断、
单次连续、扫描间断、扫描连续
b. 触发配置
/* ADC trigger config */
adc_external_trigger_source_config(adc_x, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
触发配置为外部触发无,即是软件触发
c. 序列长度和等级配置
/* ADC channel length config */
adc_channel_length_config(adc_x, ADC_REGULAR_CHANNEL, rank_length);
/* ADC regular channel config */
for(rank=0;rank<rank_length;rank++){
adc_regular_channel_config(adc_x, rank, adc_channel, ADC_SAMPLETIME_239POINT5);
adc_external_trigger_config(adc_x, ADC_REGULAR_CHANNEL, ENABLE);
}
d. 触发启动
本项目使用软件触发,可根据实际情况选择调用位置。
/* ADC software trigger enable */
adc_software_trigger_enable(adc_x, ADC_REGULAR_CHANNEL);
e. DMA配置
除了常规配置,如果是规则组多通道转换,需要使能Memory increase, 同时数组的个数要大于转换的通道数,否则有可能内存溢出
dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE;