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通道句柄

浙公网安备 33010602011771号