目录
stm32的DMA通信
- 目录
- 一、关于DMA
- 二、工程建立
- 三、结果展示
- 四、总结
- 五、参考
一、关于DMA
DMA定义
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
外设到内存 内存到外设 内存到内存 外设到外设
DMA传输参数
我们知道,数据传输,首先需要的是1 数据的源地址 2 数据传输位置的目标地址 ,3 传递数据多少的数据传输量 ,4 进行多少次传输的传输模式 DMA所需要的核心参数,便是这四个
当用户将参数设置好,主要涉及源地址、目标地址、传输数据量这三个,DMA控制器就会启动数据传输,当剩余传输数据量为0时 达到传输终点,结束DMA传输 ,当然,DMA 还有循环传输模式 当到达传输终点时会重新启动DMA传输。
也就是说只要剩余传输数据量不是0,而且DMA是启动状态,那么就会发生数据传输。
DMA的主要特征
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;
在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
支持循环的缓冲器管理;
每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
可编程的数据传输数目:最大为65535。
二、工程建立
我们通过hal库实现DMA传输的时候可以用cubeMX简单的初始化部分引脚。
具体步骤如下
1.选择时钟模式
2.设置串口
3.设置DMA
4.设置时钟源
5.创建工程
三、结果展示
我们在main函数中加上一个输出试一下:
在main.C中添加:
/* USER CODE BEGIN Init */uint8_t Senbuff[] = "\r\n**** Serial Output Message by DMA ***\r\n UART DMA Test \r\n Zxiaoxuan"; //定义数据发送数组
while循环:
while (1){/* USER CODE END WHILE */HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));HAL_Delay(1000);/* USER CODE BEGIN 3 */}
编译烧录后的现象如下
DMA
四、总结
在单片机的串口通信中,DMA的特点是明显,即无需CPU的干预。相关的使用函数也比较具象,理解起来比中断的要轻松。
五、参考
1.https://blog.csdn.net/weixin_44793491/article/details/107564370
2.https://blog.csdn.net/as480133937/article/details/104827639/
3.https://www.bilibili.com/video/BV1th411z7sn?p=23&vd_source=2ed968bffd4cf5758431b45852b18164