##### 循环模式
循环模式可用于处理循环缓冲区或连续数据流,比如ADC的多通道连续扫描。当Enable循环模式时,要传输的数据项的数目,在数据流配置阶段自动用设置的初始值进行加载,并持续响应 DMA 的请求。
注意在循环模式下,如果同时为存储器配置了突发模式,那么必须遵循下列规则:
DMA_SxNDTR = ((Mburst 节拍 ) × (Msize)/(Psize)) 的倍数
其中,
- DMA_SxNDTR = AHB 外设端口上要传输的数据项的数目
- (Mburst 节拍 ) = 4、8 或 16(取决于 DMA_SxCR 寄存器中的 MBURST 位)
- ((Msize)/(Psize)) = 1、2、4、1/2 或 1/4(Msize 和 Psize 表示 DMA_SxCR 寄存器中的 MSIZE 和 PSIZE 位。它们与字节相关)
例如:
Mburst 节拍 = 8 (INCR8),MSIZE =“00”(字节)和 PSIZE =“01”(半字),则可以计数得到:DMA_SxNDTR 必须是 (8 × 1/2 = 4) 的倍数,否则 DMA 行为和数据完整性得不到保证。
> NDTR 还必须是外设突发大小与外设数据大小乘积的倍数,否则会导致错误的 DMA 行为
##### 直接模式
直接模式在每个外设请求时,都会立即启动对存储器传输的单次传输。同时要求源地址和目标地址的数据宽度必须一致,所以只有PSIZE 控制,而MSIZE 值会被忽略。默认情况下,DMA 工作在直接模式,不使能FIFO 阈值级别。
> 直接模式不能用于存储器到存储器传输。
##### 双缓冲模式
在此模式下,每次DMA事务结束时,DMA 控制器都从当前目标存储器转换到另一个目标存储器。 这样,当软件在处理当前存储器区域的同时,DMA 传输还可以填充或使用第二个存储器区域。以加快传输速度。
> 1.使能双缓冲区模式时,自动使能循环模式,所以也不适用于M2M模式
> 2.双缓冲模式在I2S解码或传输PDM信号时经常使用,使用该模式去播放音频时可以减少不流畅现象
#### 传输模式
##### 外设到存储器
1.FIFO模式
每次产生外设请求,数据流都会启动数据源到 FIFO 的传输。当数据量达到 FIFO 所设定的阈值级别时,FIFO 的内容将移出并存储到目标中。
2.直接模式
每完成一次从外设到 FIFO 的数据传输后,相应的数据立即就会移出并存储到目标中。
> 不使用 FIFO 的阈值级别控制功能
两种模式下,如果 DMA_SxNDTR 寄存器计数到零,或外设请求传输终止(在使用外设流控制器的情况下)或 DMA_SxCR 寄存器中的 EN 位由软件清零,传输都会立即停止。
##### 存储器到外设
1.FIFO模式
数据流会立即启动传输,从存储器源完全填充到FIFO中。每次发生外设请求,FIFO 的内容都会移出并存储到目标中。
> 当 FIFO 的级别小于或等于预定 义的阈值级别时,将使用存储器中的数据完全重载 FIFO
2.直接模式
该模式下,一旦使能了数据流,DMA便会预装载第一个数据,将其传输到内部 FIFO。这时当发生外设请求数据传输,DMA便会将预装载的值传输到配置的目标。紧接着,DMA会使用要传输的下一个数据再次重载内部空 FIFO。预装载的数据大小为 DMA_SxCR 寄存器中 PSIZE 位字段的值。
两种模式下,如果 DMA_SxNDTR 寄存器计数到零,或外设请求传输终止(在使用外设流控制器的情况下)或 DMA_SxCR 寄存器中的 EN 位由软件清零,传输都会立即停止。
##### 存储器到存储器
默认使用FIFO模式,当使能数据流时,数据流会立即开始填充 FIFO,直至达到阈值级别。达到阈值级**,FIFO 的内容便会移出,并存储到目标中。
如果 DMA_SxNDTR 寄存器计数到零,或外设请求传输终止(在使用外设流控制器的情况下)或 DMA_SxCR 寄存器中的 EN 位由软件清零,传输都会立即停止。
> 1.该模式下,不允许使用循环模式和直接模式,所以也不能使用双缓冲区模式(自动启用循环模式)
> 2.只有 DMA2 控制器能够执行存储器到存储器的传输
##### “外设到外设”
参考手册中没有提到这个模式,但DMA的本质是“地址到地址”。 如果源地址是外设,目标地址是内存,那么传输模式就是外设到内存; 如果源地址是外设,目标地址也是外设,那传输模式就是外设到外设。
例如用DMA把ADC数据寄存器的值直接传送到SPI数据寄存器,即属于“外设”到“外设”的传输模式。
### 传输类型
#### 单次
当 AHB 外设端口被配置为单次传输时,根据 DMA_SxCR 寄存器 PSIZE[1:0] 位的值,每个 DMA 请求产生一次字节、半字或字的数据传输。
> 单次传输时必须通过AHB 的总线仲裁多次控制才传输完成
#### 突发
突发传输就是用非常短时间结合非常高数据信号率传输数据,相对正常传输速度,突发传输就是在传输阶段把速度瞬间提高,实现高速传输,在数据传输完成后恢复正常速度。
DMA 控制器可以产生单次传输或 4 个、8 个和 16 个节拍的增量突发传输。当 AHB 外设端口被配置为突发传输时,根据 DMA_SxCR 寄存器 PBURST[1:0] 和PSIZE[1:0] 位的值,每个 DMA 请求相应地生成 4 个、8 个或 16 个节拍的字节、半字或字的传输。
突发模式下,当DMA请求总线成功后会连续传送数据,而不给CPU使用总线的机会,直到数据传送完毕。比如设置了4个节拍的突发传输,而传输宽度位为8 bit,则一个DMA请求会连续传送4个字节,是单次传输的4倍,大提高了传输的速度。
突发传输需要结合FIFO 使用,具体配置可看FIFO阈值与突发配置章节。
> 1.在直接模式下,数据流只能生成单次传输,而 MBURST[1:0] 和 PBURST[1:0] 位由硬件强制配置
>
> 2.突发传输过程会一直占用AHB 总线,保证每个数据项在传输过程不被分割
### 中断类型
对于每个 DMA 数据流,可在发生以下事件时产生中断:
- 达到半传输
DMA 数据传输达到一半时,HTIF 标志位会被置位。
- 传输完成
DMA 数据传输完成时,TCIF 标志位会被置位。
- 传输错误
DMA 访问总线发生错误或者在双缓冲模式下试图访问“受限”存储器地址寄存器时,TEIF 标志位被置位。
- FIFO 错误(上溢、下溢或 FIFO 级别错误)
发生FIFO 下溢或者上溢时FEIF 标志位被置位。
- 直接模式错误
在外设到存储器的直接模式下,因为存储器总线没得到授权,使得先前数据没有完成被传输到存储器空间上,此时DMEIF 标志位被置1。
> 在将使能控制位置‘1’前,应将相应的事件标志清零,否则会立即产生中断
## 03 DMA的配置和应用
### DCMI + LCD DMA传输应用
这里应用了“外设”到“存储器”的方式,把DCMI->DR寄存器的数据直接传送到挂在FSMC总线的LCD数据地址上。开启循环模式和FIFO,并将外设设为单次传输,而存储器设为8个节拍的突发传输。在字节宽度的设置上,DCMI的数据寄存器宽度为32bit,而LCD端的RGB565,宽度为16bit。使用了如下图红框所示的配置。