DMA (串口DMA发送接收)

一、DMA介绍

1、DMA基本定义

DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。
在这里插入图片描述

2、DMA传输方式

DMA技术的出现,使得外围设备可以通过DMA控制器直接访问内存,与此同时,CPU可以继续执行程序。那么DMA控制器与CPU怎样分时使用内存呢?
通常采用以下三种方法:
(1)停止CPU访问内存;
(2)周期挪用;
(3)DMA与CPU交替访问内存。

3、DMA传输原理

DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
在这里插入图片描述

4、DMA主要特征

·每个通道都直接连接专用的硬件DMA请求,每个通道都同样支持软件触发,这些功能通过软件来配置。
·在同一个DMA模块上,多个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),优先权设置相等时由硬件决定(请求0优先于请求1,依此类推)。
·独立数据源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和目标地址必须按数据传输宽度对齐。
·支持循环的缓冲器管理。
·每个通道都有3个事件标志(DMA半传输、DMA传输完成和DMA传输出错),这3个事件标志逻辑或成为一个单独的中断请求。
·存储器和存储器间的传输、外设和存储器、存储器和外设之间的传输。
·闪存、SRAM、外设的SRAM、APB1、APB2和AHB外设均可作为访问的源和目标。
·可编程的数据传输数目:最大为65535(0xFFFF)。

5、DMA工作原理框图

在这里插入图片描述

二、通过STMCude生成芯片代码

1、设置RCC

如图:
在这里插入图片描述

2、设置USART

选择到USART1,如图设置
在这里插入图片描述
点击旁边的NVIC Setting,进行如下设置
在这里插入图片描述

3、DMA设置

如图
在这里插入图片描述

(1)、DMA基础设置

在右侧System Core找到DMA
如图
在这里插入图片描述
DMA Request : DMA传输的对应外设

注意: 如果你是在DMA设置界面添加DMA 而没有开启对应外设的话 ,默认为MENTOMEN

Channel DMA传输通道设置
DMA1 : DMA1 Channel 0~DMA1 Channel 7
DMA2: DMA2 Channel 1~DMA1 Channel 5

Dirction : DMA传输方向
四种传输方向:

外设到内存 Peripheral To Memory
内存到外设 Memory To Peripheral
内存到内存 Memory To Memory
外设到外设 Peripheral To Peripheral
Priority: 传输速度

最高优先级 Very Hight
高优先级 Hight
中等优先级 Medium
低优先级;Low
2DMA传输模式
在这里插入图片描述
Normal:正常模式
当一次DMA数据传输完后,停止DMA传送 ,也就是只传输一次

Circular: 循环模式

传输完成后又重新开始继续传输,不断循环永不停止

3DMA指针递增设置
在这里插入图片描述
Increment Address:地址指针递增(上方有介绍)。

左侧Src Memory 表示外设地址寄存器

功能:设置传输数据的时候外设地址是不变还是递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,右侧Dst Memory 表示内存地址寄存器

功能:设置传输数据时候内存地址是否递增。如果设置 为递增,那么下一次传输的时候地址加 Data Width个字节,这个Src Memory一样,只不过针对的是内存。

3、时钟设置

在这里插入图片描述

4、创建项目生成代码

在这里插入图片描述
同样的保存路径和文件名不能出现中文,否则代码保存会出错 ,IDE选择MDK-ARM
在这里插入图片描述
将这两个勾选上后,就可以保存文件生成代码了。

三、调制keil代码

打开刚刚生成的文件,找到main.c文件并打开
在main函数中添加

 /* USER CODE BEGIN Init */
	uint8_t Senbuff[] = "\r\n**** Serial Output Message by DMA ***\r\n   UART DMA Test \r\n   Zxiaoxuan";  //定义数据发送数组
  /* USER CODE END Init */

在while循环中添加

  while (1)
  {
    
    
    /* USER CODE END WHILE */
			HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
	        HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }

四、使用mcuisp烧录代码到芯片

在这里插入图片描述
烧录完成后,可在串口助手中查看情况

五、结果展示

在这里插入图片描述

六、参考

https://blog.csdn.net/as480133937/article/details/104827639/
https://baike.baidu.com/item/DMA/2385376#%E4%BC%A0%E9%80%81%E6%96%B9%E5%BC%8F
https://blog.csdn.net/as480133937/article/details/98845509

猜你喜欢

转载自blog.csdn.net/qq_54761976/article/details/127472644
DMA
今日推荐