突发模式[编辑]
数据块合二为一。 一旦DMA被CPU传到总线上,它就将总线数据块中的所有字节数据传回到CPU,但CPU的时间很长。 该模式也是“块模式”。 它还用于停止数据。
循环模式[编辑]
循环模式用于 CPU 不适合突发模式的情况。 在循环模式下,DMA到总线的方式与突发模式下相同,使用BR(Bus)和BG(Bus Grant),这是CPU和DMA的两个。 ,在循环模式下,一个字节的数据后,总线的经BG到CPU。
然后再次通过BR,每一个字节的数据,直到数据块已经完成。 由总线、DMA 和数据组成。 CPU 一个,然后 DMA 一个数据值,依此类推。 一方面数据块不像突发模式那样循环模式,但另一方面CPU也不像突发模式那么长时间空闲。 循环模式适用于实时数据。
模式[编辑]
模式花费最多的时间来处理一个数据块,但它也是最多的模式。 在DMA模式下,只有当CPU不使用总线时才传输数据。 模式是CPU永远不会停止它并且DMA在时间上是空闲的,而模式是当CPU不使用总线时需要,这可以是。
以下是我的理解
维基百科上有三种传输模式:
突发模式 循环传输模式 透明模式
DMA和CPU共享总线,因此这三种模式提供了三种方法来解决如何共享总线。
突发模式:当DMA成功申请总线后,会不断地传输数据,不给CPU使用总线的机会,直到数据传输完成。 例如STM32设置突发传输为4节拍,传输宽度为8位。 那么一个DMA请求会连续传输4个字节,是单次传输的4倍。
循环传输模式:这应该是常用的DMA模式,即一个DMA请求申请一次总线,传输1个字节。
透明模式:DMA在总线空闲时传输。 stm32不应该有这个模式。
至于何时使用突发模式,应该是《stm32参考手册》中提到的封装/解封装:
在封装/解封装数据的过程中,如果在数据完全封装/解封装之前中断操作,则存在数据损坏的风险。
因此,为了保证数据的一致性,可以将数据流配置为产生突发传输:在这种情况下,
每组传输都是不可分割的(参见第 8.3.11 节:单次和突发传输)。
为什么封装/解封装时存在数据损坏的风险? 例如,外设中有一组寄存器是实时链接的,即随着时间的变化,这组寄存器会发生变化。 如果我们在第一时刻取寄存器前半部分的值,在稍后时刻取寄存器后半部分的值,那么将两者封装起来就会损坏数据。 所以我们需要同时取出所有的值。 这时候我们就需要使用突发传输,因为传输时只有dma使用总线,寄存器不会改变。
另外,源数据宽度和目标数据宽度何时会不同? 例如,如果您有一个小型外部RAM,它只有8位数据线; 有一个外设寄存器,缺少一些低地址线,只能以32位访问,所以。 。 。 。
以上都是我自己纸上的想法,没有在板上测试过,所以只能提供一个想法。