【EDMA】DMA_TCDn_NBYTES寄存器的多种映射解析

背景

K64的EDMA一章中,在DMA_CR寄存器的总体说明中介绍了小循环(Minor)的详细工作过程,同时还说明了打开和关闭小循环映射(在不同DMA_CR[EMLM]值)的情况下,对DMA_TCDn_NBYTE寄存器的不同用法。

  • DMA_TCDn_NBYTES_MLNO
  • DMA_TCDn_NBYTES_MLOFFYES
  • DMA_TCDn_NBYTES_MLOFFNO

解析

关于EDMA地址偏移功能(大小循环的OFFSET),源地址和目的地址的地址指针寄存器即使在没有任何OFFSET的情况下也会自动递增并回存,所谓的偏移,都是在自动递增之后再进行额外的地址计算。即,若没有指定偏移,则EDMA的地址指针寄存器是连续递增的,若有指定的偏移,则本次大小循环结束之后,在正常的递增之外再进行地址跳跃,在下一次大小循环之前重新设定地址指针。

在默认情况下,小循环映射功能是不启用的(DMA_CR[EMLP]=0),即,DMA_TCDn_NBYTES寄存器就当成一个基本的用来设定NBYTES的寄存器来使用,不能使用小循环偏移功能让源地址和目标地址进行大尺度跳跃。此时,所有TCD中的DMA_TCDn_NBYTES寄存器将用完整的32 bit描述一个小循环(响应一个传输请求)连续传输的字节数。传完这NBYTES个字节之后,源地址和目标地址不会自动回到最初的位置。在这种情况下,DMA_TCDn_NBYTES寄存器使用一个别名——DMA_TCDn_NBYTES_MLNO(Minor Loop NO)。

PS:即使不使用小循环偏移,用先天的大循环偏移也能搞定将地址回到最初位置的问题。

当启用了小循环映射功能(DMA_CR[EMLP]=1)时,所有TCD中的DMA_TCDn_NBYTES中字段设置发生了变化:

字段 描述
SMLOE Source Minor Loop Offset Enable
DMLOE Source Minor Loop Offset Enable
MLOFF Minor Loop OFFset,有符号数,指定小循环结束后偏移的地址跨度
NBYTES 小循环内部连续传输的字节数



一旦DMA_CR[EMLM]=1,那么SMLOE和DMLOE的位置就必须预留出来,剩下的30个bit的空间的分化再由对SMLOE和DMLOE的使用决定。当MLOFF或DMLOE任意一个被使能,即启用小循环偏移,MLOFF字段将被预留出来专门存放小循环的偏移跨度,最后剩下的10 bit留给NBYTES字段用于存放每次小循环连续传输的字节数,此时DMA_TCDn_NBYTES寄存器的使用别名DMA_TCDn_NBYTES_MLOFFYES(Minor Loop yes with OFFset YES)。否则,除去因为DMA_CR[EMLM]=1而预留的SMLOE和DMLOE空位,在不使用小循环偏移跳转功能的前提下,预留MLOFF字段也没有意义,索性将其余的位置全部作为NBYTES使用,此时DMA_TCDn_NBYTES寄存器的使用别名DMA_TCDn_NBYTES_MLOFFNO(Minor Loop yes with OFFset NO)。

实际上,这里分别创建SMLOE和DMLOE两个使能控制位意义不大,因为只要它们任何一个功能位被使能,源地址和目标地址指针的偏移功能就被同时都使能了,并且这两个地址指针只能使用同一个偏移跨度,即MLOFF字段中的值。

你可能感兴趣的:(Kinetis,Kinetis,EDMA)