STM32F429芯片带FIFO的DMA传输实现过程

发布者:自由思考最新更新时间:2024-09-14 来源: elecfans关键字:FIFO  DMA传输  实现过程 手机看文章 扫描二维码
随时随地手机看文章

STM32系列芯片都内置DMA外设,其中很多系列的DMA配备了FIFO。这里以STM32F429芯片及开发板为例,演示一下带FIFO的DMA传输实现过程。


大致情况是这样的,我用TIMER1通道1的比较事件触发DMA,将内存数据写进UART5的数据发送寄存器DR,并将UART5的TX/RX脚物理短接,同时开启UART5的DMA接收模式,即DMA将UART5接收到的数据写到指定的接收内存区。下面重点介绍UART5的DMA方式的接收过程。


首先使用STM32CubeMx完成基本配置。

下面是关于TIM1的相关配置,使用通道1的比较事件触发DMA,将内存数据写入UART的发送数据寄存器。为什么还要搞个定时器来触发,其中一个原因是为了后面好演示结果。

下面是关于UART5的基本配置,并开启其接收的DMA传输。此时配置还没有使用FIFO.

添加用户代码。代码基于STM32Cube库而准备,这里发送端发送17个字节数据出来。

我们不妨先看看基于上面不使用FIFO的配置,即使用DMA 直接传输时的运行结果。

在演示基于FIFO的DMA应用结果之前,不妨简单介绍下FIFO的结构以及DMA传输过程中使用它有什么好处。

对于STM32F4来讲,每个DMA stream都有4个字的FIFO可用。它用来暂存来自DMA源端的数据,每当FIFO里存放的数据达到设定的阈值后,数据就会被移走。阈值可以设置为从1个字到4个字的深度。

启用DMA的FIFO可以最大程度地避免数据传输过程中的溢出问题,可以减少DMA对内存的访问次数从而减少总线访问竞争,通过BURST分组传输优化传输带宽以提升芯片性能。利用FIFO,通过对源端/目标端的数据进行打包或拆包以适应不同数据宽度的访问需求.让DMA的使用更为方便灵活.

这里以UART5的数据接收为例。当启用FIFO时,目的端数据宽度可以从字节/半字/字格式自由设置。首先,当UART5的DMA接收配置成下面这样时,即DMA single模式。

FIFO阈值设置为1/4满,即1个字的深度。运行上面代码,我们可看到来自源端的4个Byte被封装成1个word字。数据会按字方式逐一写入内存。【为看效果,我将定时器的触发放慢后做多次截图】

不过,按照上面方式将4个字节封装成一个字的传输过程中如果发生被打断的情况,此时就会遇到数据损坏的风险。因此就引入了DMA BURST传输,或称DMA节拍传输。即几个数据【4/8/16】被封装成1组,或称1个burst,或称1节。在一节内逐个进行数据传输,每个数据的传输相当于1拍。俨如音乐里的节拍,4拍1节、8拍1节之类的。对于每1节内的数据传输,DMA对总线的占用不会被总线矩阵仲裁器解除或打断,以保证每节数据的可靠完成。

我们还是以上面的应用为例,调整配置并开启BURST模式后具体看看。

我对memory端,也就是这里的目的端启用了BURST节拍传输。因为FIFO深度为1个字,每次源端数据刚好达到FIFO阈值水平时,通过1节4拍即可传输完毕,每拍对应1个byte的传输。基于BUSRT模式配置可以实现跟上面Single模式下同样的效果,而且数据传输更有保障。通过下图可以看出DMA按节进行传输,每节传输4个数据。

针对上述应用,我们还可以再次调整burst配置,比如下面的样子:

此时FIFO阈值为2个字,源端Memory的数据访问宽度为半字,Burst大小为4。这样的话,源端数据达到FIFO阈值时,4个半字数据组成1节分四拍传输完成,其中每拍传输半字数据。我们同样看看慢动作后的结果。

顺便提醒下,我们在做基于FIFO的burst模式的DMA传输时,BURST的大小乘以数据大小不得超过设置的FIFO阈值大小,否则会出错。比方以刚才上面的配置来看。

FIFO阈值为2个字,即8字节。数据宽度为半字,即2字节,Burst大小为4。完全合规。


关键字:FIFO  DMA传输  实现过程 引用地址:STM32F429芯片带FIFO的DMA传输实现过程

上一篇:STM32CUBEMX开发GD32F303(8)----USART收发配置
下一篇:STM32WB如何一次性烧写FUS+STACK+APP?

推荐阅读最新更新时间:2024-11-12 14:39

对UART的FIFO的理解
FIFO的必要性。在进行UART通信时,中断方式比轮询方式要简便且效率高。但是,如果没有收发FIFO,则每传输一个数据(5~8位)都要中断处理一次,效率仍然不高。如果有了收发FIFO,则可以在连续收发若干个数据(可多至14个)后才产生一次中断,然后一起处理。这就大大提高了收发效率。   接收超时问题。如果没有接收超时功能,则在对方已经发送完毕而接收FIFO未填满时并不会触发中断(FIFO满才会触发中断),结果造成最后接收的有效数据得不到处理的问题。有了接收超时功能后,如果接收FIFO未填满而对方发送已经停,则在不超过3个数据的接收时间内就会触发超时中断,因此数据会照常得到处理。   发送时,只要发送FIFO不满
[单片机]
MSP430F5529 多通道ADC定时器触发+DMA传输
竞赛之前学习了一下从没有使用过的MSP430单片机,使用的是MSP430F5529的demo板,这块板子应该是MSP430中比较流行的一块了。使用这块板子实现了一个双通道ADC的定时器触发DMA传输,这里记录一下给别人一点参考,同时也为以后需要用到的时候提供笔记。废话不多说直接上源码,代码如下。 #include msp430.h #include stdint.h int data_buf0 ; int data_buf1 ; /** * main.c */ int main(void) { unsigned int i; WDTCTL = WDTPW | WDTHOLD; // stop watchdog
[单片机]
MSP430F5529 多通道ADC定时器触发+<font color='red'>DMA</font><font color='red'>传输</font>
STM32F4 USART1 TX RX FIFO
USART1 TX RX FIFO /* ********************************************************************************************************* * * 模块名称 : 串口驱动模块 * 文件名称 : bsp_uart.c * 版 本 : V1.0 * 说 明 : 实现printf和scanf函数重定向到串口1,即支持printf信息到USART1 * 实现重定向,只需要添加2个函数: * int fputc(int ch, FILE *f); * int fgetc(FILE
[单片机]
STM32-自学笔记(19.DMA——存储器直接存取,让数据传输更上一层楼)
概述:DMA(存储器直接存取) 一个完整的微控制器(处理器)通常由CPU、存储器和外设等组件构成。这些组件一般在结构和功能上都是独立的,即一个组件能持续正常工作并不一定建立在另一个组件正常工作的前提上,而各个组件之间的协调与交互就由CPU来完成。如此一来,CPU作为整个芯片的“大脑”,其职能范围可谓广阔吗,如CPU先从A外设拿到一个数据送给B外设使用,同时C外设又需要D外设提供一个数据……这样的数据搬运工作使得CPU的负荷显得相当繁重。 严格来说,搬运数据只是CPU众多职能中比较不重要的一种。CPU最重要的工作是进行数据的运算,从加减乘除四种基本运算到一些高级运算,包括浮点、积分、微分、FFT等运算。而在一些嵌入式的实时应
[单片机]
STM32-自学笔记(19.<font color='red'>DMA</font>——存储器直接存取,让数据<font color='red'>传输</font>更上一层楼)
利用无线振动传感器实现连续可靠的过程监控
工厂自动化和总体效率理所当然地受到巨大的关注,原因不仅是生产率提高(哪怕一点点)能带来正面效益,而且同样重要的是,它能降低或消除设备停工造成的严重损失。现在,我们可以不用仰赖分析技术的进步来洞察可用统计数据以预测维护需求,或者简单地依靠加强对技术人员的培训,而是可以通过检测与无线传输技术的进步实现真正实时的分析和控制。 精密的工业生产过程(参见图1)越来越依赖于电机和相关机械设备高效可靠、始终如一的运作。机器设备的不平衡、缺陷、紧固件松动和其它异常现象往往会转化为振动,导致精度下降,并且引发安全问题。如果置之不理,除了性能和安全问题外,若导致设备停机修理,也必然会带来生产率损失。即使设备性能发生微小的改变,这通常很难及时预测,也会迅
[嵌入式]
从恩智浦开发eSIM过程芯片是如何实现集成和融合的
编译自恩智浦官方博客 新技术、案例、应用和用户体验是 NXP 的首要关注点。该公司一直在寻找新的方法来应用其专业知识并为具有挑战性的问题提供创新解决方案。在 2018 年,公司看到了将其 NFC 和嵌入式安全元件 (SE) 技术与新兴的 eSIM 或通用集成电路卡 (UICC) 结合在一起的机会。因此,创建第一个完全集成的 eSIM 的竞赛开始了。 梦开始的地方 在 2018 年首次获得 GSMA 认证之前,eSIM 的概念就已经点燃了业界的想象力。它向消费者承诺了一种替代(或结束)那些难以处理的塑料片(SIM卡),这些塑料片很容易掉落或丢失。对于移动 OEM,它在设计、服务和竞争优势方面提供了新的自由。对于恩智浦来说
[手机便携]
从恩智浦开发eSIM<font color='red'>过程</font>看<font color='red'>芯片</font>是如何<font color='red'>实现</font>集成和融合的
变压器之遗传算法(Genetic Algorithm)的具体实现过程
遗传算法 (Genetic Algorithm)是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。它是由美国的J.Holland教授1975年首先提出,其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。 遗传算法 的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。它是现代有关智能计算中的关键技术。 遗传算法的具体实现过程如下: (1)编码方式编码方式分为二进制编码和实数编码2种,如何选取,因对象而定。本文采用实数
[电源管理]
labview的软件计数器和FIFO BUFFER
PLC编程中有大量的定时器和计数器可用,做工业自动化控制的朋友在LABVIEW编程时经常因为找不到类似熟悉的功能而烦恼,其实LABVIEW本身提供的逻辑功能非常强大,远远超过PLC. 看看加计数器的说明: 它有两个控制端 initialize--是计数器复位端,相当于PLC计数器的reset activate----计数控制端,当ACTIVATE=TRUE时,每调用一次,计数器内部计数加1. 两个输出端: Counter---输出计数器当前计数,U32数据类型,最大计数范围0XFFFFFFFF Overflow---溢出,当超过计数器最大计数,为真,计数器自动复位,重新从1开始计数. 应用举例: 记录
[测试测量]
labview的软件计数器和<font color='red'>FIFO</font> BUFFER
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved