再造STM32---第十八部分:DMA—直接存储区访问

本章参考资料:《STM32F4xx 中文参考手册》 DMA 控制器章节。
学习本章时,配合《STM32F4xx 中文参考手册》 DMA 控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说明的部分。本章内容专业名称较多,内容丰富也较难理解,但非常有必要细读研究。
特别说明,本章内容是以 STM32F42xxx 系列资源讲解。
 

18.1 DMA简介:

DMA: Data Memory Access,直接存储器访问
DMA1: P->M, M->P,
DMA2: P->M, M->P, M->M

再造STM32---第十八部分:DMA—直接存储区访问_第1张图片

1-通道+流
2-仲裁器
3-FIFO
4-存储器接口
5-外设接口
6-编程接口

流: 是数据传输的一条链路,每个DMA控制器有8条独立的数据流,每次传输的数据量最大为65535,如果数据的单位为字的话,那一次可以传输256KB。
通道: 每个数据流有8个通道选择,每个通道对应不同的DMA请求。


DMA1请求映射

再造STM32---第十八部分:DMA—直接存储区访问_第2张图片

DMA2请求映射
再造STM32---第十八部分:DMA—直接存储区访问_第3张图片

通道选择, DMA_SxCR:CHSEL
再造STM32---第十八部分:DMA—直接存储区访问_第4张图片

多个DMA请求一起来,怎么办?


1、软件阶段, DMA_SxCR: PL
2、硬件阶段,数据流编号小的优先级大

同一个数据流只能使用一个通道,同一个DMA控制器可以使用多个数据流。

 

FIFO 源和目标之间的一个数据中转站。

1-每个数据流有4 字 FIFO,阈值级别有 1/4、 1/2、3/4 或满, DMA_SxFCR:FTH。
2-在开启FIFO的时候,直接模式要禁止, MA_SxFCR:DMDIS


阈值级别: DMA_SxFCR:FTH;突发配置: DMA_SxCR:MBURST
再造STM32---第十八部分:DMA—直接存储区访问_第5张图片

1-FIFO大小: 4个字, 16个字节,半字即2个字节,字即4个字节
2-节拍:即MSIZE的单位

 

再造STM32---第十八部分:DMA—直接存储区访问_第6张图片

1-M接口
2-P接口
3-编程接口

18.2 DMA初始化结构体讲解:

再造STM32---第十八部分:DMA—直接存储区访问_第7张图片
DMA_Channel: DMA 请求通道选择,可选通道 0 至通道 7,每个外设对应固定的通道, DMA_SxCR :CHSEL[2:0]。
DMA_PeripheralBaseAddr: 外设地址, DMA_SxPAR。
DMA_Memory0BaseAddr: 存储器 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_BufferSize: 设定一次传输的数据个数, DMA_SxNDTR 。
DMA_MemoryDataSize: 存储器数据宽度,可选字节(8 位)、半字(16 位)和字(32位), DMA_SxCR :MSIZE[1:0]。
DMA_Mode : DMA 传 输 模 式 选 择 , 可 选 一 次 传 输 或 者 循环 传 输 , DMA_SxCR :CIRC 位的值。
DMA_Priority: 优先级,非常高、高、中和低, DMA_SxCR :PL[1:0] 。
DMA_FIFOMode: FIFO 模式使能, DMA_SxFCR :DMDIS 。
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] 。

 

18.3 编程时需要用到的固件库函数:

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);

 

18.4 代码讲解:

1-M to M: FLASH to SRAM,把内部FLASH的数据传输到内部的SRAM。
2-M to P: SRAM to 串口,同时LED灯闪烁,演示DMA传数据不需要占用CPU。

 

M To M 编程要点:

1-在FLASH中定义好要传输的数据,在SRAM中定义好用来接收FLASH数据的变量。
2-确定使用DMA2,哪个数据流,哪个通道?然后定义成宏,方便修改。
3-初始化DMA,主要是配置DMA初始化结构体。

参考《STM32F4XX参考手册》 9.3.17 流的配置过程
4-编写数据比较函数。
5-编写main函数

 

M To P 编程要点:

1-初始化串口(从现有的例程移植过来)
2-配置DMA初始化结构体。
3-编写主函数(开启串口发送DMA请求)。

你可能感兴趣的:(再造STM32)