五、ADC如何使用DMA采集数据
1、DMA数据搬运工
1.1、DMA简介
1.1.1 、DMA的概念
DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,
也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的
通路,能使CPU的效率大为提高。
如果没有DMA那么数据采集的过程全靠CPU,CPU需要开启单独的线程,调用外设比如串口,ADC,I2C,SPI等来读取或者发送数据,这样很浪费CPU时间。
如果有DMA那么数据采集是外设通知DMA,DMA开启申请总线,然后调用外设开始读取或者发送数据,如果读取数据,直接就将数据存储到内存中,应用程序相拥的时候,直接读取对应的内存就可以了。
1.2 、STM32-DMA通道
1.2.1、 STM32F401RET6 DMA 框图
DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO结合在一起,优化了系统带宽。
两个 DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。
1.2.2、 特性
datasheet上其实写的很清楚,我只说经常需要关注的地方
①通道数量 总共有两个DMA ,每个 DMA 控制器有 8 个数据流,每个数据流有多达 8 个通道(或称请求),也就是总共有16个数据流,每个数据流有复用功能
②每个数据流有单独的四级 32 位先进先出存储器缓冲区 (FIFO),可用于 FIFO 模式或直接模式
FIFO 模式:可通过软件将阈值级别选取为 FIFO 大小的 1/4、 1/2 或 3/4
③独立的源和目标传输宽度(字节、半字、字):源和目标的数据宽度不相等时, DMA 自动
封装/解封必要的传输数据来优化带宽。这个特性仅在 FIFO 模式下可用,太阳能使用半字模式
④每个通道5 个事件标志( DMA 半传输、 DMA 传输完成、 DMA 传输错误、 DMA FIFO 错误、直接
模式错误),进行逻辑或运算,从而产生每个数据流的单个中断请求
⑤可编程的数据传输数目0~65536
⑥闪存,SRAM,APB和AHB外设均可作为访问的源和目标
⑦ 它可以执行下列事务:
● 外设到存储器的传输
● 存储器到外设的传输
● 存储器到存储器的传输
1.2.3、 通道选择
每个数据流都与一个 DMA 请求相关联,此 DMA 请求可以从 8 个可能的通道请求中选出。
此选择由 DMA_SxCR 寄存器中的 CHSEL[2:0] 位控制。
1.2.4、DMA通道优先级
仲裁器根据优先管理着通道的请求和启动外设/存储访问
优先级管理分两个方面:
①软件:可通过DMA_CCRx寄存器配置每个通道的优先级,优先级分4个等级如下:
最高优先级
高优先级
中等优先级
低优先级
②硬件:如果2个请求有相同的软件优先级,则较低编号的通道比较高编号的通道有较高的优先权。举个例子,通道2优先于通道4
即:DMA 数据流请求之间的优先级可用软件编程(4 个级别:非常高、高、中、低),在软件优先级相同的情况下可以通过硬件决定优先级(例如,请求 0 的优先级高于请求 1)
1.3、STM32-DMA传输
1.3.1、DMA传输模式
DMA1 控制器 AHB 外设端口与 DMA2 控制器的情况不同,不连接到总线矩阵,因此,仅 DMA2 数据流能够执行存储器到存储器的传输。
DMA1传输模式:
● 外设到存储器的传输
● 存储器到外设的传输
DMA2传输模式:
● 外设到存储器的传输
● 存储器到外设的传输
● 存储器到存储器的传
1.3.2、DMA传输的源、目的、长度
①DMA_CPARx寄存器:设置外设寄存器地址
②DMA_CMARx寄存器:设置存储器地址
③DMA_CCRx寄存器:配置数据的传输方向
如果是寄存器到存储器模式,需要配置DMA_CCRx的MEM2MEM位
④DMA_CNDTRx寄存器:写入需要传输的数据量,(0到65535)
⑤DMA_CCRx寄存器中的PSIZE和MSIZE位:
设置源和目的的数据宽度,两边的位宽尽量保持一致。要不然就会出问题,太阳能AD采用的12位,2个字节,因此此处数据设置应该也是2个字节
1.3.3、DMA传输的增量设置
①通过设置DMA_CCRx寄存器中的PINC和MINC标志位,外设和存储器的指针在每次传输后可以有选择的完成自动增量
②当设置为增量模式时,下一个要传输的地址将是前一个地址加上增量值,增量值取决于所选的数据宽度1、2或4 太阳能应该配置为2
1.3.4、DMA循环模式
①循环模式用于处理循环缓冲区和连续的数据传输(如ADC的扫描模式)。在DMA_CCRx寄存器中的CIRC位用于开启这一功能。
②当启动了循环模式,一组的数据传输完成时,计数器寄存器将会自动地被恢复成配置该通道时设置的初值,DMA操作将会继续进行。
1.4、STM32-DMA中断