前言
- 软件版本
STM32CubeMX 6.4 0
Keil 531
- 硬件
STM32F103C8T6
1 DMA简介
DMA 全称Direct Memory Access,即直接存储器访问。
DMA传输将数据从一个地址空间复制到另一个地址空间。当CPU初始化这个传输动作,传输动作本身是由DMA控制器来实现和完成的。
DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节。
我们知道,数据传输,首先需要的是数据的源地址、数据传输位置的目标地址、传递数据多少的数据传输量、进行多少次传输的传输模式。DMA所需要的核心参数,便是这四个。每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置。
因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理
DMA传输方式
DMA的作用就是实现数据的直接传输,而去掉了传统数据传输需要CPU寄存器参与的环节,主要涉及四种情况的数据传输,但本质上是一样的,都是从内存的某一区域传输到内存的另一区域(外设的数据寄存器本质上就是内存的一个存储单元)。四种情况的数据传输如下:
- 外设到内存
- 内存到外设
- 内存到内存
- 外设到外设
DMA的主要特征
每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发。这些功能通过软件来配置;
- 在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推);
- 独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐;
- 支持循环的缓冲器管理;
- 每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求;
- 存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输;
- 闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标;
- 可编程的数据传输数目:最大为65535。
2 通过CubeMX创建项目
不懂的步骤可以看我另一篇博客:https://blog.csdn.net/apple_52030329/article/details/127232960
2.1 设置RCC
之后照样配置时钟
2.2 设置USART1
-
选择异步通信,参数选择默认
-
使能串口
-
添加两个通道
2.3 创建项目
老样子配置项目
3 Keil配置项目
打开刚才配置好的项目
3.1 修改main代码
int main(void)
{
HAL_Init();
uint8_t message[] = "DMA communication test\n"; //定义数据发送数组
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
while (1)
{
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)message, sizeof(message));
HAL_Delay(1000);
}
}
3.2 烧录
烧录工具选择 mcuisp
4 实现效果
通过串口调试助手查看,效果如下
总结
串口通信的实现方式有多种,轮询、中断以及使用DMA处理等,各有利弊。本文学习使用了DMA方式,实现了简单的串口通信程序
参考
https://blog.csdn.net/isyuuun/article/details/121074067
https://blog.csdn.net/qq_47281915/article/details/121063896?spm=1001.2014.3001.5501
https://blog.csdn.net/as480133937/article/details/104827639/