一、什么是DMA
1.1 基本概念
DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。
1.2原理
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。 在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。- 请求
- 响应
- 传输
- 结束
DMA传输的四个要素
- 传输源 :DMA数据传输的来源
- 传输目标:DMA数据传输的目的
- 传输数量:DMA传输数据的数量
- 触发信号:启动一次DMA数据传输的动作
1.3 特点
每个控制器有8个数据流,每个数据流可以映射到8个通道(或请求);
每一个DMA控制器用于管理一个或多个外设的存储器访问请求,并通
过总线仲裁器来协调各个DMA请求的优先级;
数据流(stream)是用于连接传输源和传输目标的数据通路,每个数据流可以配置为不同的传输源和传输目标,这些传输源和传输目标称为
通道(Channel);
具备16字节的FIFO。使能FIFO功能后,源数据先送入FIFO,达到FIFO的触发阈值后,再传送到目标地址。
1.4 传输方式
- 普通模式:传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。
- 循环模式:传输结束后(即要传输数据的数量达到零),将不再产生DMA操作。若开始新的DMA传输,需在关闭DMA通道情况下,重新启动DMA传输。
二、实现用DMA连续向上位机发送数据
打开CUBRMX新建项目,将PA9和PA10选择为USART1_RX和USART1_TX,然后再点击左边的USART1,将mode置为异步通信模式,我们这里只需要接收,不需要发送,后面再点击add键,添加引脚
整体设置如图所示:
然后按照前两篇文章的方式,生成项目和代码
在main.c文件中的while循环中的代码如下:
while (1) { uint8_t send_char[]="所想要发送的内容\n";//发送的字符串 HAL_UART_Transmit_DMA(&huart1,(uint8_t *)send_char,0xc);//DMA发送 HAL_Delay(500);//延时
结果如图所示
三、总结
相比普通的串口通信,这种数据传输不经过CPU,是一种比串口通信更快速更高效的方式。