9、DMA

1 DMA基本情况

1.1 DMA简介

Direct Memory Access(DMA),即直接储存器访问。可以将数据从一个地址空间直接复制到另一个地址空间而不需要占用CPU资源。

1.2 DMA传输过程

1、外设向DMA控制器发送请求

2、DMA控制器接收请求,向外设返回应答信号

3、外设接收信号,释放请求

4、外设启动DMA传输(三要素:源地址、目标地址、传输数量)

1.3 DMA优先级

1、软件优先级:可在DMA_CCRx寄存器中设置,分为最高、高、中和低四个优先级

2、硬件优先级:若两个请求有相同的软件优先级,则比较硬件优先级。通道编号小的有更高的优先级

1.4 DMA相关寄存器

寄存器

名称

作用

DMA_CCRx

DMA通道x配置寄存器

配置DMA基本参数

DMA_ISR

DMA中断状态寄存器

查询当前DMA传输状态

DMA_IFCR

DMA中断标志清除寄存器

清除ISR寄存器中的对应位

DMA_CNDTRx

DMA通道x传输数量寄存器

设置DMA通道x传输数据量

DMA_CPARx

DMA通道x外设地址寄存器

储存外设地址

DMA_CMARx

DMa通道x存储器地址寄存器

用于存放存储器地址

USART_CR3

USART控制寄存器3

使能串口DMA发送

2 DMA配置

2.1 DMA配置步骤

1、使能DMA时钟:__HAL_RCC_DMAx_CLK_ENABLE()

2、初始化DMA:HAL_DMA_Init()

3、配置中断(可选):若要使用中断,需要配置NVIC

4、启动传输:HAL_UART_Transmit_DMA()

2.2 DMA相关函数

1、初始化函数HAL_DMA_Init(),函数原型为

HAL_StatusTypeDef HAL_DMA_Init(DMA_HandleTypeDef *hdma)

其中hdma为DMA控制器句柄,其核心成员有用于存放寄存器基地址的Instance和配置结构体DMA_InitTypeDef Init,配置结构体成员如下:

成员

功能

可选参数

Direction

设置DMA传输方向

外设到内存:DMA_PERIPH_TO_MEMORY

内存到外设:DMA_MEMORY_TO_PERIPH

内存到内存:DMA_MEMORY_TO_MEMORY

PeriphInc

设置外设地址是否递增

递增:DMA_PINC_ENABLE

非递增:DMA_PINC_DISABLE

MemInc

设置内存地址是否递增

递增:DMA_MINC_ENABLE

非递增:DMA_MINC_DISABLE

PeriphDataAlignment

设置外设数据宽度

1字节:DMA_PDATAALIGN_BYTE

2字节:DMA_PDATAALIGN_HALFWORD

4字节:DMA_PDATAALIGN_WORD

Mode

设置DMA工作模式

正常模式:DMA_NORMAL

循环传输:DMA_CIRCULAR

Priority

设置软件优先级

低:DMA_PRIORITY_LOW

中:DMA_PRIORITY_MEDIUM

高:DMA_PRIORITY_HIGH

最高:DMA_PRIORITY_VERY_HIGH

2、启动DMA传输函数HAL_DMA_Start_IT(),函数原型为

HAL_StatusTypeDef HAL_DMA_Start_IT(DMA_HandleTypeDef *hdma, uint32_t SrcAddress, uint32_t DstAddress, uint32_t DataLength)

其中SrcAddress为源地址,DstAddress为目标地址,DataLength为传输的数据量大小。

3、外设与DMA连接宏__HAL_LINKDMA(),宏原型为

void __HAL_LINKDMA(__HANDLE__, __PPP_DMA_FIELD__, __DMA_HANDLE__);

其中__HANDLE__是外设句柄的地址,__PPP_DMA_FIELD__是外设句柄结构体中DMA句柄指针成员名字,__DMA_HANDLE__是DMA句柄变量名

4、DMA发送函数HAL_UART_Transmit_DMA(),函数原型为

HAL_StatusTypeDef HAL_UART_Transmit_DMA(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)

其中huart为初始化串口句柄,pData为待发送数据缓冲区的指针,Size为要发送数据的字节数。

5、查询DMA状态标志宏__HAL_DMA_GET_FLAG(),宏原型为

__HAL_DMA_GET_FLAG(__HANDLE__, __FLAG__)

其中__HANDLE__为DMA通道句柄,__FLAG__为待查询标志,可选值有

DMA_FLAG_TCx:传输完成标志

DMA_FLAG_HTx:半传输完成标志

DMA_FLAG_TEx:传输错误标志

DMA_FLAG_GLx:全局中断标志

其中x代表DMA通道的1 ~ 7编号,该宏返回值有SET(标志置1)和RESET(标志清零)两种状态

6、DMA使能宏__HAL_DMA_ENABLE(),宏原型为

__HAL_DMA_ENABLE(__HANDLE__)

其中__HANDLE__为DMA通道句柄

posted @ 2026-08-18 14:24  老鼠学32  阅读(17)  评论(0)    收藏  举报