DMA 直接存储器访问
DMA传输,将数据从一个地址空间复制到另一个地址空间。-----“数据搬运工”。
DMA传输无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场,它是通过硬件为RAM和IO设备开辟一条直接传输数据的通道,使得CPU的效率,使得CPU的效率大大提高。
STM32F1 DMA框图
1. DMA请求
DMA传输数据,先向DMA控制器发送请求。
2.DMA通道
不同外设向DMA的不同通道发送请求。DMA1有7个通道,DMA2有5个通道。(DMA2仅存在大容量产品和互联型产品)
3.DMA优先级
多个DMA通道同时发来请求时,几句有先后响应处理的顺序问题,这个由仲裁器管理(优先级管理也分成软件阶段和硬件阶段)
DMA处理过程
1.外设想通过DMA发送数据,先发送请求。
2.DMA控制器收到请求后,给外设一个ack
3.外设收到ack后,释放请求
4.外设启动DMA数据传输,直到传输结束
DMA优先级:仲裁器管理DMA通道请求分为两个阶段:软件阶段、硬件阶段
第一阶段(软件阶段):每个通道的优先级可在DMA_CCRx寄存器中设置,由四个等级:最高、高、中、低优先级。
第二阶段(硬件阶段):如果两个请求有相同软件优先级,较低编号的通道有较高的优先级
(大容量芯片中,DMA1控制器拥有高于DMA2控制器的优先级)
DMA的HAL库函数
DMA-串口数据传输
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_EnableIRQ
HAL_NVIC_SetPriority
编写中断服务函数xxx_IRQHandler
实战
1.配置USART1以及相应中断
配置DMA
中断优先级(这里防止HAL_Delay卡死,详细请看 http://t.csdnimg.cn/NQhQV)
生成keil工程后
DMA+串口发送字符串
main函数 while(1)里
DMA+串口接收空闲中断
uart.h、uart.c当中定义接收数组、数据长度、接收完成标志
在uart.c当中的Init函数下添加使能IDLE中断
main.c当中封装接收和发送函数
中断stm32f4xx_it.c中调用 #include "usart.h"
stm32f4xx_it.c中编写中断服务函数
main.c中的while循环内编写发送以及接收标志清除
- 实验现象
- 打开串口,若没有接收到数据时,串口一直会每隔500ms发送SendBuff数组里的数据
- 接收