【本文发布于https://blog.youkuaiyun.com/Stack_/article/details/115948212,未经许可不得转载,转载须注明出处】
在GD32F30x中,ADC0对应DMA0的通道0.
在初始化了ADC0和DMA0_CH0后,ADC0每转换完规则组中的一个通道,将转换结果存至RDATA寄存器,并向DMA0发出请求。
DMA0响应,从ADC0_RDATA寄存器读走AD值并存入我们预先开辟的一段内存空间(例如定义的一个数组),并将地址指向下一个数据位以备下一次写入(如此次从RDATA读出存入数组array[0],下次存入array[1])。
然后ADC0继续转换规则组中的下一个通道,转换完成再次发起dma请求,直到该规则组所有ADC通道被转换完。如果ADC0使能了连续模式,DMA使能了循环模式,将不断自动扫描AD通道并更新数组中的数据。
ADC规则组举例说明作用:
向规则序列寄存器写入该序列的待转换通道数量,并写入各个通道编号。
如RL写入4(表明该序列有5个待转换通道),RSQ0-RSQ4依次写入编号ADC_CHANNEL_11,ADC_CHANNEL_1,ADC_CHANNEL_3,ADC_CHANNEL_12,ADC_CHANNEL_13共5个通道)
然后将ADC配置为扫描模式,ADC将依次转换该序列的通道CH_11,CH_1,CH_3,CH12,CH_13。
编程实现ADC0自动扫描5个通道,AD值由DMA0自动转运至数组中,CPU直接从数组中读取对应通道AD值。
一、ADC0配置
- 使能ADC0扫描模式;
- 使能ADC0的DMA请求;
- 允许连续模式(ADC0扫描至RSQ4并完成之后自动折返从RSQ0开始顺序转换);
- 如上面所述配置规则组;
二、DMA0通道0配置
- 选择数据搬运方向为外设到存储器;
- 将ADC0_RDATA寄存器(AD转换结果寄存器)的地址写入DMA0通道0的外设基地址寄存器;
- 定义一个全局数组如uint16_t array[5] = {0x00};并将该数组的首地址写入DMA0通道0的存储器基地址寄存器;
- 配置数据传输总量(和ADC0规则组通道数对应);
- 使能循环模式(写到array[4]后折返array[0]继续写);
- 外设地址算法选择固定模式,因为固定从RDATA读出数据;
- 存储器地址算法选择增量模式即自动增加,写入array[0]后自动指向array[1]以备下次写入;
- 外设和存储器位宽均选择16位,因为为12位AD值,所以定义的数组为uint16_t;
三、使能ADC0和DMA0通道0
四、如果只需要一直转换AD值,则使能ADC0外部触发并向ETSRC写入7触发转换(软件触发)。
STM32配置此功能的步骤与上述类似。