STM32串口DMA

一、什么是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键,添加引脚

整体设置如图所示:

STM32串口DMA

 

然后按照前两篇文章的方式,生成项目和代码

在main.c文件中的while循环中的代码如下:

while (1)
  {
   uint8_t send_char[]="所想要发送的内容\n";//发送的字符串
    HAL_UART_Transmit_DMA(&huart1,(uint8_t *)send_char,0xc);//DMA发送
        HAL_Delay(500);//延时
 

 

 STM32串口DMA

 

 结果如图所示

三、总结

相比普通的串口通信,这种数据传输不经过CPU,是一种比串口通信更快速更高效的方式。

 

上一篇:基于PYQT5+STM32单片机雷达视频一体机实现过程


下一篇:STM32之DMA实现串口通信