上一次我们通过HAL库的串口中断回调函数,基本能够实现简单的不定长度读写收发的功能。这一次用DMA来实现,先了解一下DMA。DMA 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU的干预,通过DMA数据可以快速地移动。这就节省了CPU的资源来做其他操作。CUBEMX中的设置大概如下,其他默认值(记得要开启串口中断)  
什么是DMA —- Directional Memory Access, 直接存储器存取用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作我们通过以下几方面学习串口DMA: 一、如何理解DMA 对于DMA,打个比方就很好理解: 角色预设: 淘宝店主 —
本文在前两篇USART串口通信的基础上,使用DMA控制器来实现串口通信 文章目录一、DMA1.DMA简介2.DMA主要特性3.部分代码原理二、实验代码三、实验结果四、总结 一、DMA1.DMA简介DMA全称Direct Memory Access,即直接存储器访问。直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。DMA传输方式无需CPU直接控制传输,也没有中
转载
2024-07-12 04:30:15
473阅读
项目场景:stm32H743使用串口MDA发送数据,减轻MCU负担问题描述通过stm32cubeMX配置串口3,使用DMA发送数据,生成工程后DMA发送数据没问题,但是发送的数据全部为0x00,并不是我发的数据,通过仿真查看发现直到DMA发送函数内部数组的数据都是正确的,但是发出来的数据就变成了0x00,经过各种查找,网上搜索终于发现问题。 参考文章: 1、没修改前串口3DMA发送的数据如下图:
赠人玫瑰,手有余香;很感谢网上其他楼主的分享;我这个贴子是关于STM32 DMA USART 发送模式的调试分享,我为什么要建这个帖子呢,因为我不想看到还有其他人跟我一样,为了调通DMA串口,而花上大半天的时间,这很不利于大家高效率的开发,网上的经验都是从头教到尾的,内容极多,对于有点小经验的人,或者是想很快达到目的的人,这个很不适合他们;我的这个很简单(本帖不适合不熟悉配置STM32串口的玩
DMA,全称Direct Memory Access,即直接存储器访问, DMA 传输方式无需 CPU 干预,通过硬件为 RAM 和 I/O 设备开辟一条直接传送数据的通路,能大大提高CPU的运行效率。下面介绍stm32单片机的USART和DMA的配置过程:step1:STM32串口配置 使用串口初始化函数来配置:void usart_init(void)
{
//第一步:GPIO复用端口设置
接着上一篇关于STM32H7串口收发问题,继续说,上一篇里边提供了中断接收方式,最大的缺点就是中断过于频繁,为了解决这个问题那就把DMA搬过来,它不就是专门搬用数据的嘛,不用多可惜。首先我们需要大致了解,DMA和外设传送数据,例如串口,我们希望,当一帧数据接收完毕了,有个东西告诉主程序,串口接收到了一帧n个字节的数据存在某个地方,接收过程中你丫别打搅我。DMA就能胜任这个工作,他可以以中断的形式告
在使用串口时,一般采用查询发送,中断接收。但当要接收一串很长的数据时,每收到一个字节进入一次串口中断,有可能会导致中断占用时间过长。如果有一种方式,能够让串口收完一串数据,才进一次中断,那将是对写底层驱动的人来说,是极其好的一件事。经过查资料看手册,发现可以采用串口空闲中断和DMA接收来实现这个功能。具体更详细的说明后续补充,现只贴出代码,以供参考。 调试的过程中发现几个问题: 1、要串口初始化
转载
2024-10-19 21:51:41
220阅读
本节目标:通过DMA,无需中断,接收不定时长的串口数据 描述:当在串口多数据传输下,CPU会产生多次中断来接收串口数据,这样会大大地降低CPU效率,同时又需要CPU去做其它更重要的事情,我们应该如何来优化?比如四轴飞行器,当在不停地获取姿态控制方向时,又要去接收串口数据.答:使用DMA,无需CPU中断便能实现接收串口数据1.DMA介绍DMA,全称为: Direct Memory Access,即
一、什么是DMA1.1 基本概念DMA(Direct Memory Access,直接存储器访问) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。1.2原理DMA 传输将数据从一个地址空间复制
转载
2024-06-14 11:04:01
361阅读
引言:最近在做串口实验,总结了两种串口收发的方法,第一种是用定时器定的,第二种是使用空闲中断。第一种 使用定时器具体做法是在串口接收数据时启动定时器,每接收一帧数据要复位定时值以保证定时器不会溢出。根据波特率计算出大概什么时候接收数据完成,什么时候,缓存数组溢出。比如波特率是115200bit/s,就是1s钟传输115200位,每传输一位就是0.00868ms,一个字符占8位加上起始位和停止位一共
写在前面,我STM32系列所有博客都是用的HAL库:即通过STM32CubeMX生成代码框架,基于代码框架继续开发。本文主要阐述, STM32芯片使用HAL库,如何用DMA的方式,来实现串口接收功能。(接收的数据长度是固定的)STM32CubeMX的配置这里就不赘述了。上俩图吧目录核心代码第一处:核心代码第二处:代码分为两处:核心代码第一处:main.c (主要注意 “// ▲”注释)
STM32 使用 DMA可以节省大量的CPU资源。。。。(巴拉巴拉。。。) 空闲中断可以在数据接受完成后中断(水字数)1.需要开启的时钟RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //DMA1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);//IO时钟
RCC_A
1.简介<1>:DMA,全称为:Direct Memory Access,即直接存储器访问。实际上,DMA作为一个硬件电路,实现在无CPU干预的情况下,内存(memory)和外设之间的联系<2>:STM32最多有两个DMA的控制器,DMA1有7个通道,DMA2有5个通道,也存在一个仲裁器来判断优先级(共四级 很高 高 中 低)<3>:DMA的通道连接着专用硬件的
STM32F4 + DMA +SPI 通讯(打开收发功能) // 开启SPI DMA SPI_DMACmd(SPI2, SPI_DMAReq_Rx, DISABLE); SPI_DMACmd(SPI2, SPI_DMAReq_Tx, ENABLE); SPI在DMA发送时,同时DMA也在接收;需注意DMA发送同时,也要接收;否正 将进入 RXNE请求;
1)实验平台:正点原子stm32mini 开发板 第二十三章 DMA 实验本章我们将向大家介绍 STM32 的 DMA。在本章中,我们将利用 STM32 的 DMA 来实现串口数据传送,并在 TFTLCD 模块上显示当前的传送进度。本章分为如下几个部分:23.1 STM32 DMA 简介23.2 硬件设计23.3 软件设计23.4 下载验证23.1 STM32 DMA 简介DMA,全称为:Dire
第一步 使用stm32cubeMX配置串口可以在NVIC里面设置串口的优先级,避免bug的出现。第二步 生成代码并修改串口打印重定向在usart.c里面添加/** * @brief 串口重定向 */#include <stdio.h>int fputc(int ch, FILE *f){ HAL_UART_Transmit(&huart2, (uint8_t *)&ch, 1, 0xFFFF); return ch;}在使用的地方要
原创
2021-06-08 14:41:03
3615阅读
参考资料:1、ST HAL库官网资料 2、一、STM32CubeMX配置外部时钟注意在进行外部时钟配置时,即“High Speed Clock”和“Low Speed Clock”需配置成“Crytal/Ceramic Resonator(低温/陶瓷谐振器)”不能配置为"BY
目录一、所需环境软硬件1、软件2、硬件二、DMA基本介绍三、STM32CubeMX新建项目四、Keil编写代码和烧录1、Keil编写代码2、烧录程序3、实现效果 一、所需环境软硬件1、软件STM32CubeMX Keil FlyMcu FireTools野火多功能调试助手2、硬件STM32F103最小系统板一块 面包板一块 导线若干 USB转TTL接口二、DMA基本介绍1、什么是DMA? DMA
前言本实验是在原子哥的DMA实验的基础上进行修改,添加了DMA串口数据接收功能。接收到指定数据时LED1的状态翻转。内附源码下载链接:添加链接描述注意:在编写DMA串口数据收发时,DMA发送和接收传输的数据量需要单独进行初始化,在每次传输数据时都需要进行初始化。 如下图所示:一、STM32 DMA介绍**DMA详尽介绍可网上查找,这里就不在细说。**
如果对DMA不是很了解可参考另一位博主的文章,
转载
2024-09-30 10:09:01
345阅读