STM32F429第二十七篇之DMA
Posted 海洋想想
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32F429第二十七篇之DMA相关的知识,希望对你有一定的参考价值。
文章目录
前言
DMA(Direct memory access)用于内存与内存之间或者内存与外设之间的高度数据传输。而且使用DMA进行数据传输不占用CPU任何资源,从而解放CPU去做别的操作。F429中共有两个DMA控制器,每个控制器用户8个数据流。
基本流程
DMA的事务处理就是一系列一定数量的数据传送。传送的数据宽度可以通过编程改变。每个DMA传送都包含以下几个步骤:
- 从外设寄存器或者内存中加载数据,该外设或者内存的地址存储在寄存器DMA_SxPAR 或者 DMA_SxM0AR 中。
- 将数据存储在外设寄存器或者内存中,同样的,地址存放在寄存器DMA_SxPAR 或者 DMA_SxM0AR 中。
- 寄存器DMA_SxNDTR自动递减,该寄存器中数据表示剩余未传输的数据量。
当事件发生时,外设将会向DMA发送请求信号。DMA的响应速度取决于当前外设的优先级大小。一旦DMA响应了该设备,就会向该设备回送一个响应信号。外设获得DMA的响应信号就会释放请求。若外设还要继续请求,则启动下一个事物。
通道选择
每个数据流都包含8个备选的通道,可以通过寄存器 DMA_SxCR的位CHSEL[2:0] 选择。下标表示所有可选情况:
优先级
数据流与数据流之间的传输优先级通过软件和硬件两个方面决定:
- 软件:可以通过DMA_SxCR寄存器配置数据流的优先级,总共有四个等级:非常高、高、中、低。
- 硬件:若两个请求的软件优先级相同时,序号较小的数据流优先级更高。
传输模式
在DMA中,源地址和目的地址可以包含整个4G空间(0x0000 0000 - 0xFFFF FFFF).传输模式通过寄存器DMA_SxCR中位 DIR[1:0]设置,包含以下三种:
- 内存到外设
- 外设到内存
- 内存到内存
外设到内存
如上图所示,当DMA使能时,将 DMA_SxCR 寄存器中的位 EN 置 1。则每当有外设源发送请求时,则数据流就会启动传输。
当多个数据流同时发送传输请求时,仲裁器会根据数据流的优先级确定先响应的数据流。而优先级通过DMA_SxCR寄存器中的PL[1:0]位确定。
在直接模式(当 DMA_SxFCR 寄存器中的 DMDIS 值为“0”时)下,不使用FIFO,每一次外设数据到达FIFO时,直接将相应的数据移送到目标内存中。而在FIFO模式中,数据缓存在FIFO中,直到FIFO达到阈值等级,数据会被一次发送到内存中。
DMA在以下几种情况发生的时候会停止传输:
- DMA_SxNDTR寄存器的值为0
- DMA_SxCR寄存器使能位EN被清零。
- 若外设支持流控制,请求中止传输。
内存到外设
内存到外设和上文基本类似,不再详细介绍。
内存到内存
内存到内存和上文介绍也基本一致,其不同之处在于不存在外设,所以同样的不会存在外设的各种请求。另外还有几点需要注意:
- 直接模式不允许使用
- 循环模式不允许使用
- 只有DMA2可以使用内存到内存模式。
双缓冲区模式
双缓冲区模式通过寄存器DMA_SxCR中的DBM位来使能。该模式适用于DMA1和DMA2。
若DMA被设置成双缓冲区,那么,其自动设置为循环模式。双缓冲区比正常模式多了一个内存指针,当到达传输最后,两个内存指针会发生交换。换言之,DMA控制器在每次事件最后,从一个目标内存指针跳到另一个。这样,就可以当DMA使用其中一块内存的时候,通过软件操作另一块内存。在双缓冲模式中,缓冲内存即可以是源端也可以是目标端。
- 当 DMA_SxCR 寄存器中的 CT 位为“0”时,可以写入 DMA_SxM1AR 寄存器。当 CT =“1”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1,并自动禁止数据流。
- 当 DMA_SxCR 寄存器中的 CT 位为“1”时,可以写入 DMA_SxM0AR 寄存器。当 CT =“0”时,试图写入此寄存器会将错误标志位 (TEIF) 置 1,并自动禁止数据流。
直接模式
默认的情况下,FIFO模式时被禁止,使用的是直接模式,通过寄存器DMA_SxFCR的DMDIS位配置。当对数据传输的实时性要求较高时,可以使用直接模式。
当DMA为直接模式,且数据方向为内存到外设时,DMA会从内存中预加载一个数据到FIFO中,从而保证当外设请求时,会立刻响应。
该模式适用以下情况:
- 源和目的数据宽度是相同的,且通过寄存器DMA_SxCR的PSIZE[1:0] 位设置。(位MSIZE[1:0]被忽略)。
- 突发模式不可用。
- 不用于内存到内存方式。
循环模式
循环模式可用于处理循环缓冲区和连续数据流(例如 ADC 扫描模式)。可以使用 DMA_SxCR 寄存器中的 CIRC 位使能此特性。
当激活循环模式时,要传输的数据项的数目在数据流配置阶段自动用设置的初始值进行加载,并继续响应 DMA 请求。
如果是在非循环模式下配置数据流,传输结束后(即要传输的数据数目达到零),除非软件重新对数据流编程并重新使能数据流(通过将 DMA_SxCR 寄存器中的 EN 位置 1),否则 DMA 即会停止传输(通过硬件将 DMA_SxCR 寄存器中的 EN 位清零)并且不再响应任何 DMA 请求。
DMA中断
对于每个 DMA 数据流,可在发生以下事件时产生中断:
- 达到半传输
- 传输完成
- 传输错误
- FIFO 错误(上溢、下溢或 FIFO 级别错误)
- 直接模式错误
以上是关于STM32F429第二十七篇之DMA的主要内容,如果未能解决你的问题,请参考以下文章