再造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

函数

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

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


DMA1请求映射

DMA2请求映射

通道选择, DMA_SxCR:CHSEL

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


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

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

 spa

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

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


阈值级别: DMA_SxFCR:FTH;突发配置: DMA_SxCR:MBURST
接口

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

 ip

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

18.2 DMA初始化结构体讲解:


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/四、 1/二、 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] 。

 it

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

 io

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请求)。