STM32之DMA通信原理及编程实验

本文主要介绍DMS通信原理,STM32采用串口DMA方式,用115200bps或更高速率向上位机连续发送数据。

目录

一、DMA

1 DMA简介

2 DMA背景

3 DMA特点

4 DMA框图

二、stm32tubemx创建DMA工程

三、代码部分

四、参考网站 


一、DMA

1 DMA简介

DMA,全称Direct Memory Access,即直接存储器访问。DMA 传输方式无需 CPU 直接 控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为 RAM 与 I/O 设备 开辟一条直接传送数据的通路,能使 CPU 的效率大为提高。 

DMA传输将数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。
DMA传输过程的初始化和启动由CPU完成,传输过程由DMA控制器来执行,无需CPU参与,从而节省CPU资源,提高利用率。

2 DMA背景

我们知道CPU有转移数据、计算、控制程序转移等很多功能,系统运作的核心就是CPU,

CPU无时不刻的在处理着大量的事务,但有些事情却没有那么重要,比方说数据的复制和存储数据,如果我们把这部分的CPU资源拿出来,让CPU去处理其他的复杂计算事务,是不是能够更好的利用CPU的资源呢?

因此:转移数据(尤其是转移大量数据)是可以不需要CPU参与。比如希望外设A的数据拷贝到外设B,只要给两种外设提供一条数据通路,直接让数据由A拷贝到B 不经过CPU的处理。

DMA就是基于以上设想设计的,它的作用就是解决大量数据转移过度消耗CPU资源的问题。有了DMA使CPU更专注于更加实用的操作–计算、控制等。

3 DMA特点

STM32 的 DMA 有以下一些特性:

●每个通道都直接连接专用的硬件 DMA 请求,每个通道都同样支持软件触发。这些功能 通过软件来配置。

●在七个请求间的优先权可以通过软件编程设置(共有四级:很高、高、中等和低),假如 在相等优先权时由硬件决定(请求 0 优先于请求 1,依此类推) 。

●独立的源和目标数据区的传输宽度(字节、半字、全字),模拟打包和拆包的过程。源和 目标地址必须按数据传输宽度对齐。

●支持循环的缓冲器管理

●每个通道都有 3 个事件标志(DMA 半传输,DMA 传输完成和 DMA 传输出错),这 3 个 事件标志逻辑或成为一个单独的中断请求。

●存储器和存储器间的传输

●外设和存储器,存储器和外设的传输

●闪存、SRAM、外设的 SRAM、APB1 APB2 和 AHB 外设均可作为访问的源和目标。

●可编程的数据传输数目:最大为 65536

4 DMA框图

二、stm32tubemx创建DMA工程

新建过程不再赘述,不懂的可以看我前面的博客,我们直接来到外设设置

设置RCC

设置串口
1点击USATR1
2设置MODE为异步通信(Asynchronous)
3基础参数:波特率为115200 Bits/s。传输数据长度为8 Bit。奇偶检验无,停止位1 接收和发送都使能
4GPIO引脚自动设置 USART1_RX/USART_TX

 使能中断

DMA设置
点击DMA Settings的Add添加通道,传输速率设置为中速Medium

模式设置为Normal,右侧选择Memory 

 在System view下选择DMA

 时钟设置

 设置名称与IDE版本

点击右上角GENERATE CODE,完成,导出Keil工程文件即可

三、代码部分

main.c文件添加代码

uint8_t Senbuff[] = "Hello world!";  //定义数据发送数组

 

HAL_UART_Transmit_DMA(&huart1, (uint8_t *)Senbuff, sizeof(Senbuff));
  HAL_Delay(1000);

 

 编译无误后烧录即可

 打开XCOM串口助手,打开串口即可接收信号

这样就完成了~

ps:本次实验主要用了DMA的方式进行通信,相比普通的串口通信,这种数据传输不经过CPU,是个更高效的方式。

四、参考网站 

https://blog.csdn.net/as480133937/article/details/104927922icon-default.png?t=LA46https://blog.csdn.net/as480133937/article/details/104927922https://blog.csdn.net/as480133937/article/details/104827639/icon-default.png?t=LA46https://blog.csdn.net/as480133937/article/details/104827639/

 

 

 

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值