DMA简介:
DMA : Data Memory Access ,直接存储器访问
DMA1: P->M, M->P, P为外设数据,M为SRAM
DMA2: P->M, M->P, M->M,P为外设数据,M为SRAM,M为flash
DMA功能框图
通道和流
流:是数据传输的一条链路, 每个 DMA 控制器有 8 条独立的数据流,每次传输的数据量最大为 65535,如果数据的单位为字的话,那一次可以传输 256KB。
通道:每个数据流有 8 个通道选择,每个通道对应不同的 DMA 请求。
DMA2
通道选择,DMA_SxCR:CHSEL
仲裁器
多个 DMA 请求一起来, 怎么办?
1、软件阶段, DMAS XCR:PL
2、硬件阶段,数据流编号小的优先级大同一个数据流只能使用一个通道, 同一个 DMA 控制器可以使用多个数据流。
FIFO
FIFO:源和目标之间的一个数据中转站。
1-每个数据流有 4 字 FIFO,阈值级别有 1/4、1/2、
3/4 或满,DMA_SxFCR:FTH。
2-在开启 FIFO 的时候,直接模式要禁止,MA_SxFCR:DMDIS 在存储器到存储器传输的时候会自动启动 FIFO 模式,软件禁止不了。
FIFO 阈值与突发配置
1-FIFO 大小:4 个字,16 个字节,半字即 2 个字节,字即 4 个字节
2-节拍:即 MSIZE 的单位
DMA初始化结构体简介
DMA_Channel:DMA 请求通道选择,可选通道 0 至通道 7,每个外设对应固定的通道,DMA_SxCR:CHSEL[2:0]。
DMA Peripheral Base Addr:
外设地址
DMA_Sx PAR。
DMA_Memory O Base Addr:存储器 0 地址, DMA_SxM0AR。
DMA_DIR:传输方向选择, 可选外设到存储器、存储器到外设以及存储器到存储器,DMA_SxCR:DIR[1:0]
DMA_BufferSize:设定一次传输的数据个数,DMA_SxNDTR。
DMA_PeripheralInc:外设地址是否递增,DMA_SxCR: PINC。
DMA_MemoryInc:存储器地址是否递增,DMA_SxCR: MINC。
DMA_PeripheralDataSize:外设数据宽度,可选字节 (8 位)、半字 (16 位) 和字 (32 位), DMA_SxCR : PSIZE[1:0]。
DMA_Mode: DMA 传输模式选择,可选一次传输或者循环传输, DMA_SxCR : CIRC 位的值。在存储器到存储器模式的时候,只能是一次传输,即 DMA_Mode_Normal 模式。
DMA_Priority:优先级,非常高、高、中和低,DMA_SxCR : PL[1:0]。
DMA_FIFOMode:FIFO 模式使能,DMA_SxFCR:DMDIS。在存储器到存储器传输的时候,FIFO 自动开启,软件禁止不了。
DMA_FIFOThreshold:FIFO 阈值选择,1/4、1/2、3/4 和满,DMA_SxFCR : FTH[1:0]。
DMA_MemoryBurst:存储器突发模式选择,单次模式、4 节拍、
8 节拍、16 节拍 , DMA_SxCR:MBURST[1:0]。
DMA_PeripheralBurst:外设突发模式选择,单次模式、4 节拍、
8 节拍、16 节拍 , DMA_SxCR :PBURST[1:0] 。
编程时需要用到的固件库函数
1-初始化 DMA 的寄存器到复位状态
DMA_DeInit (DMA_Stream_TypeDef* DMAy_Streamx);
2-DMA 初始化函数
void DMA_Init (DMA_Stream_TypeDef* DMAy_Streamx, DMA_InitTypeDef* DMA_InitStruct);
3-DMA 使能函数
DMA_Cmd (DMA_Stream_TypeDef* DMAy_Streamx, FunctionalState NewState);
实验1:1-M to M: FLASH to SRAM,把内部 FLASH 的数据传输到内部的 SRAM。
const uint32_t temp1=1; //存储在Flash中
uint32_t temp;//定义全局变量储存在SRAM中
1-在 FLASH 中定义好要传输的数据, 在 SRAM 中定义好用来接收 FLASH 数据的变量。
2-确定使用 DMA 2, 哪个数据流, 哪个通道?然后定义成宏,方便修改。
3-初始化 DMA, 主要是配置 DMA 初始化结构体。
4-编写数据比较函数。
5-编写 main 函数
问题:MToM 只能使用 DMA2 控制器,那数据流和通道应该如何选择?
STM32F407的DMA2控制器支持存储器到存储器(mem-to-mem)模式,可以在内存之间传输数据。在配置DMA2通道时,需要注意以下几点:
- 数据流选择
DMA2控制器提供了不同的数据流(stream),每个数据流都有一组DMA通道可以使用。在选择数据流时,需要考虑到数据传输的大小和优先级。如果需要高优先级的数据传输,可以选择更低的数据流编号,例如0或1。如果传输的数据量比较大,建议选择更高编号的数据流(2-7),可以提高数据传输的效率,减少CPU的处理负担。
- 通道选择
在DMA2控制器中,每个数据流都有多个DMA通道可以使用。通常情况下,建议选择DMA2通道0或1,这两个通道支持循环模式,并且具有高优先级。如果需要同时进行多个数据传输,可以选择使用不同的通道来避免冲突。
- 传输模式
在存储器到存储器模式下,可以选择普通模式或者循环模