STM32——DMA
一.基本介绍
DMA:全称Direct Memory Access,即直接存储器访问。将数据从一个地址空间复制到另一个地址空间。
DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场过程,通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率大大提高
![](https://i-blog.csdnimg.cn/blog_migrate/cb6d990965efd263033eb5601222017b.png)
二.DMA框架
![](https://i-blog.csdnimg.cn/blog_migrate/7f3ec920ef549b76615ac606445d06fe.png)
DMA请求:DMA传输数据,先向DMA控制器发送请求
DMA通道:不同外设向DMA的不同通道发送请求DMA1有7个通道,DMA2有5个通道DMA2仅存在大容量产品和互联型产品
DMA优先级:多个DMA通道同时发来请求时,就有先后响应处理的顺序问题,这个由仲裁器管理(优先级管理也分软件阶段和硬件阶段)
2.1DMA处理过程
![](https://i-blog.csdnimg.cn/blog_migrate/e56e5b3d213a0731fc4c119d12217cf0.png)
DMA通道:
![](https://i-blog.csdnimg.cn/blog_migrate/d20314cb31bb2f0eb9143cc3189c5a18.png)
每个通道用来管理来自于一个或多个外设对存储器访问的请求。且都有一个仲裁器,用于处理DMA请求间的优先级。
2.2DMA优先级
![](https://i-blog.csdnimg.cn/blog_migrate/9cb2b9523de463d9ddae63dd0fb17baf.png)
仲裁器管理DMA通道请求分为两个阶段:软件阶段(1)、硬件阶段(2)
第一阶段(软件阶段):每个通道的优先级可在DMA_CCRx寄存器中设置,有四个等级:最高、高、中和低优先级。
第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道比较高编号的通道有较高的优先级。
(大容量芯片中,DMA1控制器拥有高于DMA2控制器的优先级)
三.DMA的HAL库
步骤 | 操作 | 函数 |
1 | 使能DMA时钟 | __HAL_RCC_DMA1_CLK_ENABLE |
2 | 初始化DMA | HAL_DMA_Init函数初始化DMA相关参数__HAL_LINKDMA函数连接DMA和外设 |
3 | 使能串口的DMA发送,启动传输 | HAL_UART_Transmit_DMA |
4 | 查询DMA传输状态 | HAL_DMA_GET_FLAG 查询通道传输状态HAL_DMA_GET_COUNTER 获取当前传输剩余数据量 |
5 | DMA中断使用 | HAL_NVIC_Enable IRQHAL_NVIC_SetPriority编写中断服务函数 xxx_IRQHandler |
驱动函数 | 关联寄存器 | 功能描述 |
__HAL_RCC_DMAx_CLK_ENABLE(…) | RCC_AHBENR | 使能DMAx时钟 |
HAL_DMA_Init**(…)** | DMA_CCR | 初始化DMA |
HAL_DMA_Start_IT**(…)** | DMA_CCR/CPAR/CMAR/CNDTR | 开始DMA传输 |
__HAL_LINKDMA(…) | 用来连接DMA和外设句柄 | |
HAL_UART_Transmit_DMA**(…)** | CCR/CPAR/CMAR/CNDTR/USART_CR3 | 使能DMA发送,启动传输 |
__HAL_DMA_GET_FLAG(…) | DMA_ISR | 查询DMA传输通道的状态 |
__HAL_DMA_ENABLE(…) | DMA_CCR(EN) | 使能DMA外设 |
__HAL_DMA_DISABLE(…) | DMA_CCR(EN) | 失能DMA外设 |