直接存储器访问(Direct Memory Access,DMA)是实现存储器与外设、存储器与存储器之间高效数据传输的方法。
一、DMA功能概述
1、1DMA简介
(1)DMA控制器
(2)DMA流,进行DMA数据传输的链路。一个DMA控制器有8个DMA流,每个DMA流有独立的4级32位FIFO缓冲区。
(3)DMA请求。外设或寄存器发起的DMA传输需求。每个DMA流最多有8个可选地DMA请求。
(4)仲裁器,提供基于优先级别的DMA请求管理。流编号小优先级大。
1、2DMA传输特性
(1)外设到存储器,ADC采集的数据存入内存的缓冲区
(2)存储器到外设,通过UART接口发出内存的数据
(3)存储器到存储器,将外部SRAM中的数据复制到内存中
1、3DMA工作模式
(1)正常模式,传输完一个缓冲区的数据后就停止了
(2)循环模式,接收满一个缓冲区的数据后,产生DMA传输完成事件中断。
当DMA传输的源和目标的数据宽度不同时,FIFO传输模式更好。
二、DMA的程序
初始化要设置:DMA流和通道、传输方向、工作模式(循环或正常)、源和目标数据宽度、DMA流优先级别等参数;
UART使用DMA方式传输数据时,UART的全局中断要打开,但是UART的接收完成和发送完成中断事件源可以关闭。
UART的DMA传输函数
HAL_UART_Transmit_DMA()
HAL_UART_Receive_DAM()
cubemx设置
在USART1增加DMA设置
DMA Request:外设或存储器的DMA请求
Stream:DMA流。
Direction:传输方向
Priority:优先级别
USART1和两个DMA的中断抢占优先级都设置为1,在他们的中断处理函数里会用到函数HAL_Delay();
当UART以DMA方式发送或接收数据时,DMA流的传输完成事件中断的回调函数就是UART的回调函数;
发送使用正常模式,接收使用循环模式,串口输入连续监测。