五、ADC如何使用DMA采集数据

1、DMA数据搬运工

1.1、DMA简介

1.1.1 、DMA的概念

                     DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU直接控制传输,

            也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的

            通路,能使CPU的效率大为提高。

             五、ADC如何使用DMA采集数据

             

               如果没有DMA那么数据采集的过程全靠CPU,CPU需要开启单独的线程,调用外设比如串口,ADC,I2C,SPI等来读取或者发送数据,这样很浪费CPU时间。

                 如果有DMA那么数据采集是外设通知DMA,DMA开启申请总线,然后调用外设开始读取或者发送数据,如果读取数据,直接就将数据存储到内存中,应用程序相拥的时候,直接读取对应的内存就可以了。

1.2 、STM32-DMA通道

 1.2.1、 STM32F401RET6 DMA 框图

五、ADC如何使用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] 位控制。

五、ADC如何使用DMA采集数据

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中断

 五、ADC如何使用DMA采集数据

2、ADC_DMA多路采集实例

2.1 、STM32CubeMx 如何配置通过DMA多路采集ADC

2.1.1 AD基本功能配置

五、ADC如何使用DMA采集数据

 2.1.2 、使用DMA多路采集AD配置

五、ADC如何使用DMA采集数据

 2.1.3 、NVIC 配置

五、ADC如何使用DMA采集数据

2.2、 keil5的代码实现

五、ADC如何使用DMA采集数据

五、ADC如何使用DMA采集数据

2.3、 如何跟踪到的回调函数void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)

五、ADC如何使用DMA采集数据

五、ADC如何使用DMA采集数据