STM32的DMA中FIFO和突发模式理解

STM32的DMA中FIFO和突发模式理解
学习stm32DMA时遇到了FIFO和突发配置的疑惑,看手册完全云里雾里,节拍是什么等等都不清楚。
首先理解什么是突发,突发传输就是两个设备进行数据传输,一个设备发数据,一个设备接收数据,或者像是CPU到内存进行读取数据,肯定是每读取一个字节,读取指针就会自增一次,如果每次读一个字节,还要到程序里面执行一个指针自增指令的话,那CPU岂不是时时刻刻都在读取内存然后指针自增指令执行,那也太蠢了,CPU利用率太低了,所以出现了突发模式,我设定为CPU进行读内存,我指定一个宽度,每次读取都读这一个宽度的数据,比如为128B,每次读取,指针会自己增加,读取满了这128B再告诉CPU读了一次,那么这个128B就是一次突发的大小,只是进行简单的封装,突发不管每次传输多少,突发规定的是指针每次增加的单位宽度是多少,就像上面的我读取内存,规定每次读取1280B,那么一次读取就是10次突发,相当于读写指针按每次自增128进行了10次。突发就是这么个意思,是为了方便传输时指针自增进行的优化操作,将每次指针自增由指令控制,封装为硬件突发模式进行。
在这里插入图片描述
上图就是stm32里面突发和FIFO配置的表。
突发模式一定是与FIFO一起使用的,突发的意思就是打包,而且只针对接收端的配置,与发送端没有关系,这么理解,突发的节拍即按接收端数据宽度作为单位,突发可以选择4、8、16节拍进行打包,跟架子鼓一样,每4秒敲一次,这里就是接收端按接收宽度,每收到4次该宽度作为一次突发,那么就是4节拍一次突发。
如果接收端数据宽度为byte,选择4节拍一次突发,如果将每次突发封装为一个突发包的话,那么就是一个突发包大小为4字节,每次突发发送一个突发包,意思就是每发送4字节即4次接收端的数据宽度,进行一次打包突发,对应到FIFO上面就是,FIFO选择的阈值是满了就发送给接收端,但是一次传输必须是以突发包大小作为单位来进行,所以选择1/4阈值,则满1/4就进行传输,正好满一次突发;按1/2阈值,满1/2传输一次,正好是2个突发包,那么就是传输一次突发两次,以此类推;
所以选择突发计算的是突发包的位宽,即突发包大小=节拍*接收端数据宽度,每次FIFO传输的大小由FIFO自己的阈值决定,但是每次传输的大小一定要大于突发包才行,因为突发包是最小的单位,一次传输内进行几次突发不重要,系统会自己配置,但是需要注意的是,一次FIFO传输必须是整数个突发包的大小宽度,不能切分突发;
突发和数据宽度紧密联系的根本原因,就像是C指针一样,char指针自增是+1,而int* 增长是+4每次,所以突发就跟指针增长一样,是指针增长的封装,
实际例子:
配置突发为4节拍,这是确定一次突发的大小宽度是多少,假如接收端端口数据宽度配置为半字(2B)那么一次突发就是8B,切记一次突发不是一次传输,一次传输包含多次突发,突发本质上是指针增长,即接收端地址自增,每次传输由FIFO决定,FIFO如果选择的阈值为1/4,那么就是说FIFO每装满1个字,就触发传输,传输1个字,但是这里突发的最小单位为8B,而一次传输却是4B,肯定不行。打个比方,我设定指针每自增一次最小增量为8字节,但是现在你却要让指针自增一次只移位4B,肯定不行,因为我已经规定了指针最小的自增长度为8。突发就是这个意思,突发就是为了地址接收数据的同时进行指针偏移,突发包的大小就是指针每次偏移的最小位移,所以FIFO阈值最小只能是1/2,所以一次FIFO传输为1/2*4字=2字=8B的数据,正好一次突发,而3/4又不行,因为3/4阈值FIFO一次传输为12B,而我每次指针自增宽度就是突发包的大小为8B,你说这次传输为12B,我不能是指针自增1.5吧,有见过int * +1.5的么,肯定没有。
最后,还有一点,那就是记住,突发次数是不需要你管的,一次传输有几次突发系统会自动算出来,一次传输的大小一定是有FIFO阈值决定的,你只需要确保,每次传输的大小一定是整数个突发大小就行,每次传输就行几次突发不需要你管。

  • 28
    点赞
  • 97
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: STM32DMA(直接内存访问)是一种高效的数据传输机制,它可以以较少的CPU干预完成大量的数据传输。 DMA FIFODMA传输的一个缓冲区,它可以储存数据以便DMA直接从读取和写入数据。DMA FIFO可以大大提升DMA传输的效率,因为它可以避免DMA频繁访问内存,从而减少CPU的干预,提升数据传输的速率。 在STM32,不同的DMA通道都有自己独立的DMA FIFODMA FIFO可以通过编程控制其大小和数据传输的方向。此外,DMA FIFO还支持半总线传输和内存突发传输等高级功能,以进一步提高数据传输的效率。 需要注意的是,DMA FIFO的大小不能太小,否则会影响传输速度。同时,在使用DMA FIFO时,需要注意内存的地址对齐,否则会影响DMA传输的效率。 总之,STM32 DMA FIFO是一种高效的DMA缓冲区,它能够大大提高数据传输的效率,减少CPU的干预,是STM32高效数据传输的重要手段之一。 ### 回答2: STM32 DMA FIFO是一种在STM32微控制器内部使用的先进的数据传输机制,旨在提高数据传输的效率和可靠性。DMA(FIFO)是指直接内存存储器访问(FIFO)的简称,这种传输方式可以通过DMA控制器自动处理,而无需CPU的干预。 STM32 DMA FIFO可以通过提供缓存缓冲区来处理和管理数据传输,这些缓存区是可以在存储器或外设之间共享数据的独立存储器区域。缓存区的大小和数量可以根据应用程序的数据传输速率和带宽要求进行配置。通过使用FIFO机制,可以缓解传输速率不匹配的问题,并且可以在数据传输时提供额外的保密性。 STM32 DMA FIFO的优点包括高效的数据传输速率,使得数据传输更加快速和可靠;同时,它还可以减少CPU的负担,提高程序执行效率。STM32 DMA FIFO对于大数据传输、高速传输以及多模块数据传输等应用非常有用。 因此,STM32 DMA FIFO已经成为了STM32微控制器的一个标准组件,许多工业自动化、智能制造和物联网应用程序,都广泛采用了这种数据传输机制。 ### 回答3: STM32 DMA FIFOSTM32微控制器的一种DMA传输方式,它使用了FIFO缓冲区来提高DMA传输效率。FIFO(First-In-First-Out)的缓冲区可以在一端输入数据,在另一端输出数据,所有数据按照入队的顺序依次出队。在DMA传输FIFO缓冲区可以减少DMA传输对CPU的干扰,并且可以缓存大量的数据,以增强数据传输的连续性与稳定性。通过使用DMA FIFO,可以在DMA传输期间减少数据丢失和重复读取以及提高数据传输的吞吐量。 STM32 DMA FIFO的主要特点包括: 1. 多通道支持:STM32 DMA FIFO可以支持多个通道同时进行DMA传输,并且可以进行通道间的数据拷贝。 2. 高效传输:使用DMA FIFO可以减少CPU的干扰,并且可以增强数据传输的连续性,从而提高数据传输的效率。 3. 灵活配置:STM32 DMA FIFO可以通过编程的方式配置传输方式、传输数据长度、传输地址等参数,以适应不同的应用场景。 总之,STM32 DMA FIFO是一种高效的DMA传输方式,适用于需要高效、稳定、连续的数据传输场景,例如音频、视频、存储器等大量数据传输场景。它可以提高数据传输效率,减少CPU的负担,提高系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值