本文在前两篇USART串口通信的基础上,使用DMA控制器来实现串口通信 文章目录一、DMA1.DMA简介2.DMA主要特性3.部分代码原理二、实验代码三、实验结果四、总结 一、DMA1.DMA简介DMA全称Direct Memory Access,即直接存储器访问。直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA传输方式无需CPU直接控制传输,也没有中
项目场景:stm32H743使用串口MDA发送数据,减轻MCU负担问题描述通过stm32cubeMX配置串口3,使用DMA发送数据,生成工程后DMA发送数据没问题,但是发送的数据全部为0x00,并不是我发的数据,通过仿真查看发现直到DMA发送函数内部数组的数据都是正确的,但是发出来的数据就变成了0x00,经过各种查找,网上搜索终于发现问题。 参考文章: 1、没修改前串口3DMA发送的数据如下图:
  什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作我们通过以下几方面学习串口DMA: 一、如何理解DMA 对于DMA,打个比方就很好理解: 角色预设: 淘宝店主 —
转载 6月前
139阅读
接着上一篇关于STM32H7串口收发问题,继续说,上一篇里边提供了中断接收方式,最大的缺点就是中断过于频繁,为了解决这个问题那就把DMA搬过来,它不就是专门搬用数据的嘛,不用多可惜。首先我们需要大致了解,DMA和外设传送数据,例如串口,我们希望,当一帧数据接收完毕了,有个东西告诉主程序,串口接收到了一帧n个字节的数据存在某个地方,接收过程中你丫别打搅我。DMA就能胜任这个工作,他可以以中断的形式告
上一次我们通过HAL库的串口中断回调函数,基本能够实现简单的不定长度读写收发的功能。这一次用DMA来实现,先了解一下DMADMA 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。CUBEMX中的设置大概如下,其他默认值(记得要开启串口中断)  &nbsp
在使用串口时,一般采用查询发送,中断接收。但当要接收一串很长的数据时,每收到一个字节进入一次串口中断,有可能会导致中断占用时间过长。如果有一种方式,能够让串口收完一串数据,才进一次中断,那将是对写底层驱动的人来说,是极其好的一件事。经过查资料看手册,发现可以采用串口空闲中断和DMA接收来实现这个功能。具体更详细的说明后续补充,现只贴出代码,以供参考。 调试的过程中发现几个问题: 1、要串口初始化
转载 2024-10-19 21:51:41
220阅读
本节目标:通过DMA,无需中断,接收不定时长的串口数据 描述:当在串口多数据传输下,CPU会产生多次中断来接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何来优化?比如四轴飞行器,当在不停地获取姿态控制方向时,又要去接收串口数据.答:使用DMA,无需CPU中断便能实现接收串口数据1.DMA介绍DMA,全称为: Direct Memory Access,即
  赠人玫瑰,手有余香;很感谢网上其他楼主的分享;我这个贴子是关于STM32 DMA USART 发送模式的调试分享,我为什么要建这个帖子呢,因为我不想看到还有其他人跟我一样,为了调通DMA串口,而花上大半天的时间,这很不利于大家高效率的开发,网上的经验都是从头教到尾的,内容极多,对于有点小经验的人,或者是想很快达到目的的人,这个很不适合他们;我的这个很简单(本帖不适合不熟悉配置STM32串口的玩
引言:最近在做串口实验,总结了两种串口收发的方法,第一种是用定时器定的,第二种是使用空闲中断。第一种 使用定时器具体做法是在串口接收数据时启动定时器,每接收一帧数据要复位定时值以保证定时器不会溢出。根据波特率计算出大概什么时候接收数据完成,什么时候,缓存数组溢出。比如波特率是115200bit/s,就是1s钟传输115200位,每传输一位就是0.00868ms,一个字符占8位加上起始位和停止位一共
写在前面,我STM32系列所有博客都是用的HAL库:即通过STM32CubeMX生成代码框架,基于代码框架继续开发。本文主要阐述, STM32芯片使用HAL库,如何用DMA的方式,来实现串口接收功能。(接收的数据长度是固定的)STM32CubeMX的配置这里就不赘述了。上俩图吧目录核心代码第一处:核心代码第二处:代码分为两处:核心代码第一处:main.c  (主要注意 “// ▲”注释)
转载 1月前
435阅读
DMA,全称Direct Memory Access,即直接存储器访问, DMA 传输方式无需 CPU 干预,通过硬件为 RAM 和 I/O 设备开辟一条直接传送数据的通路,能大大提高CPU的运行效率。下面介绍stm32单片机的USART和DMA的配置过程:step1:STM32串口配置 使用串口初始化函数来配置:void usart_init(void) { //第一步:GPIO复用端口设置
转载 8月前
660阅读
STM32 使用 DMA可以节省大量的CPU资源。。。。(巴拉巴拉。。。) 空闲中断可以在数据接受完成后中断(水字数)1.需要开启的时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //DMA1时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//IO时钟 RCC_A
参考资料:1、ST HAL库官网资料                  2、一、STM32CubeMX配置外部时钟注意在进行外部时钟配置时,即“High Speed Clock”和“Low Speed Clock”需配置成“Crytal/Ceramic Resonator(低温/陶瓷谐振器)”不能配置为"BY
一、什么是DMA1.1 基本概念DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。1.2原理DMA 传输将数据从一个地址空间复制
转载 2024-06-14 11:04:01
359阅读
前言本实验是在原子哥的DMA实验的基础上进行修改,添加了DMA串口数据接收功能。接收到指定数据时LED1的状态翻转。内附源码下载链接:添加链接描述注意:在编写DMA串口数据收发时,DMA发送和接收传输的数据量需要单独进行初始化,在每次传输数据时都需要进行初始化。 如下图所示:一、STM32 DMA介绍**DMA详尽介绍可网上查找,这里就不在细说。** 如果对DMA不是很了解可参考另一位博主的文章,
转载 2024-09-30 10:09:01
342阅读
使用DMA串口发送数据,UART1发送数据(串口1)1、STM32CubeMX引脚设置和代码生成1.相关定时器的知识点:2.相关参数选择与设置:2、编写相关中断的C文件1.相关串口发送函数:2.相关串口发送函数的编写:3.改进相关串口发送函数:3、编译工程文件,使用ST-Link烧录,测试串口数据的发送 1、STM32CubeMX引脚设置和代码生成1.相关定时器的知识点:串口有三种传输方式: 1
转载 2024-07-13 09:17:13
535阅读
STM32--DMA一、DMA简介二、DMA功能框图工作模式 基于平台:stm32f407ZGT6开发板 STM32DMA一、DMA简介DMA是什么DMA,全称为:Direct Memory Access,即直接存储器访问。其主要功能作用是用于数据传输并且不占用CPU。DMA传输数据功能很强、很高效。为什么说DMA传输数据是高效的呢?这是因为DMA在传输实现高速数据移动过程无需任何 CPU 操
  文章目录一、串口通信简介1.1 百度百科解释1.2 通信接口1.3 串口通信分类1.4 STM32串行通信的通信方式二、STM32串口通信2.1 功能引脚2.2 数据寄存器2.3 控制器2.4 小数波特率生成三、总结 一、串口通信简介 1.1 百度百科解释来源百度百科 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并
串口通讯最主要的就是要不丢数据,不丢帧,基本设想就是建立一个大的串口缓冲区,串口接收到的数据使用循环队列的方式全部往这个缓冲区放,不过这种方式需要把串口缓冲区弄大一点,防止数据覆盖。在stm32中,利用DMA+空闲中断很容易做到这一点。只需要将DMA设置为循环模式,如下图: 也就是说,在循环模式下,当DMA传输了一个数据,DMA_CNDTRx传输数量寄存器相应减一,当DMA_CNDTRx传输数量寄
目录1、什么是DMA2、DMA特性3、请求映射表3.1、DMA1请求映射表3.2、DMA2请求映射表4、软件实现4.1 串口的初始化4.2 DMA初始化1)使能 DMA 时钟2)初始化 DMA 通道 4 参数4.3 主函数1、什么是DMADMA全称是Direct Memory Access,即是直接存储器访问。 DMA 传输方式无需 CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的
  • 1
  • 2
  • 3
  • 4
  • 5