串口DMA发送和接收

AI助手已提取文章相关产品:


一、介绍DMA

1.什么是DMA

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

2.DMA的原理

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

3.DMA工作原理图

在这里插入图片描述

二、通过STMCude生成芯片代码

1.设置RCC

在这里插入图片描述## 2.设置USART
在这里插入图片描述
在这里插入图片描述

3.DMA设置

在这里插入图片描述

4.DMA基础设置

点击右侧System Core找到DMA
在这里插入图片描述
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指针递增设置
在这里插入图片描述

5.时钟设置

在这里插入图片描述

6.创建项目

在这里插入图片描述
注意文件名不能含有中文
在这里插入图片描述
在这里插入图片描述

三、调制KEIL代码

打开main.c
在main函数添加下列函数
在这里插入图片描述
在while循环中添加
在这里插入图片描述

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

在这里插入图片描述

五、结果展示

在这里插入图片描述

六、参考

https://baike.baidu.com/item/DMA/2385376#%E4%BC%A0%E9%80%81%E6%96%B9%E5%BC%8F

您可能感兴趣的与本文相关内容

串口通信中使用DMA(直接内存访问)可以显著提高数据传输效率并减少CPU的负担。以下是在串口通信中实现DMA发送接收数据的基本方法: ### 串口DMA发送数据的实现 在发送数据时,DMA可以用来将数据从内存直接传输到串口发送寄存器。这通常涉及到以下步骤: 1. 配置DMA通道以用于串口发送。这包括设置源地址(内存中的缓冲区)、目标地址(串口的数据寄存器)以及要传输的数据量。 2. 在DMA传输开始前,关闭DMA通道以便进行配置。 3. 设置DMA的数据传输计数器,指定需要发送的字节数。 4. 启用DMA通道,开始数据传输。 5. 当DMA传输完成后,可能会产生一个中断来通知CPU传输已经完成。 示例代码片段展示了如何初始化并启动DMA发送过程,假设使用的是STM32F103系列微控制器USART1: ```c void USART1_DMA_Begin_Send(uint8_t *send_buffer, uint16_t nSendBytes) { if (nSendBytes < USART1_DMA_TX_BUFFER_MAX_LENGTH) { memcpy(USART1_DMA_TX_Buffer, send_buffer, nSendBytes); DMA_Cmd(DMA1_Channel4, DISABLE); // 关闭DMA传输 DMA_SetCurrDataCounter(DMA1_Channel4, nSendBytes); // 设置数据传输量 DMA_Cmd(DMA1_Channel4, ENABLE); // 开启DMA传输 } } ``` ### 串口DMA接收数据的实现 对于接收数据,DMA同样可以用来将数据从串口接收寄存器直接传输到内存中的缓冲区。实现细节与发送类似,但方向相反: 1. 配置DMA通道以用于串口接收。设置源地址为串口的数据寄存器,目标地址为内存中的缓冲区,并且指定最大接收数据量。 2. 在DMA传输开始之前,同样需要先关闭DMA通道进行配置。 3. 设置DMA的数据传输计数器,指定可以接收的最大字节数。 4. 启用DMA通道,等待数据的到来。 5. 当DMA接收到指定数量的数据或检测到传输结束条件时,会触发一个中断来通知CPU处理接收到的数据。 为了处理不定长数据,通常会在DMA配置中使用循环模式或者在接收到特定的结束符后停止DMA传输。 ### 使用DMA的好处 - **减少CPU中断次数**:相比于每次发送接收一个字节就触发一次中断,DMA可以在整个数据块传输完毕后仅触发一次中断。 - **提高数据吞吐量**:由于DMA可以在没有CPU干预的情况下完成数据传输,因此可以大大提高系统的数据处理能力。 通过上述方法,可以在串口通信中有效地利用DMA技术来优化数据传输性能[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值