KV58 Note 07 有关DMA

DMA "Direct Memory Access" 直接内存访问

关注

'KV5x Sub-Family Reference Manual'

"Chapter 25 Direct Memory Access Multiplexer (DMAMUX)" DMA通道复用
"Chapter 26 Enhanced Direct Memory Access (eDMA)" 增强型DMA控制器

DMA由DMA控制器和TCD组成
TCD (transfer control descriptor 传输控制描述符)

通常单纯的DMA的通道功能是固定的,Datasheet中会提供通道映射表。
而DMAMUX实现了DMA通道的复用,每个通道的功能都可自定义。
DMAMUX共32路通道,分为两组,0至15通道与16至31通道,两组可以复用的功能有一定差异。
此外,通道0至通道3,可以受PIT控制,实现周期触发功能。
DMA通道的运行模式分为三种:禁用模式、普通模式、周期触发模式(仅0至3通道)。
DMAMUX中,每个通道有一个8位寄存器CHCFG。
第7位表示使能,第6位表示是否使用通道触发器(0表示普通模式,1表示周期触发模式),其余6位用于设置通道的源。
周期触发模式中,触发分为普通模式和忽略模式,前者一旦被触发,DMA就开始工作,而后者仅在外部设备请求DMA且被触发时,DMA才开始工作。
在配置DMAMUX前先清除CHCFG第7和第6位(关闭使能并停止触发)

DMA的宗旨是尽可能的减少处理器在数据传输中的介入
DMA中,所有数据移动需要两个地址:从源读取(source),写入目标(destination)
数据的传送分为主循环(major loop)和副循环(minor loop)
主循环内有若干次副循环,每次副循环都需要DMA源发出请求或者通过软件请求,每次副循环完毕,DMA通道进入空闲,等待下次请求,当所有DMA传送完毕,即置完成标志,并且可以通过设置选择传送完毕是否触发中断。

副循环映射(minor loop mapping):一般情况下,通过设定的偏移量计算下一次循环的源地址和目标地址,但如果存储区间不连续,则可利用副循环映射功能设定偏移量

控制寄存器Control Register (DMA_CR)[32bits]
每个通道的优先级必须是不同的值,否则在优先级仲裁后,DMA会报出错误
副循环偏移(minor loop offset)是指每次副循环运行结束后,在源地址(TCDn_SADDR)和目标地址(TCDn_DADDR)后加上偏移值
若是最后一次副循环完成,将无视副循环偏移,而是利用主循环偏移计算下一次主循环的源地址和目标地址
[17]CX(Cancel Transfer)取消传输:一旦置1,则当前数据读写完,剩下的数据取消传输,停止当前执行通道并强制结束副循环,完成取消后自动置0
[16]ECX(Error Cancel Transfer)带错误标志的取消传输:基本效果与CX一致,ECX会将这次取消视作一种报错,并更新DMAx_ES,并触发一个可选的错误中断
[10]GRP1PRI(Channel Group 1 Priority)第1组通道优先级
[08]GRP0PRI(Channel Group 0 Priority)第0组通道优先级
[07]EMLM(Enable Minor Loop Mapping)使能副循环映射:0禁用,TCDn.word2被定义为一个32位的NBYTES字段;1启用,TCDn.word2被重新定义,包括独立使能字段、偏移字段和NBYTES字段。独立使能字段允许将副循环偏移量应用到源地址、目标地址或两者。当启用了两个偏移量时,NBYTES字段就会减少。
[06]CLM(Continuous Link Mode)连续链接模式:1使能,在副循环再次活动前不通过通道仲裁就链接到自己,紧接着副循环完成,若通道有使能的副循环且副循环链接着自己,那么该通道再次活动。不要在通道只有一次副循环的情况下使用连续链接模式,比如通道的NBYTES值与源数据大小或目标数据大小相同。同样的数据传输配置可以通过简单的增加NBYTES的值,该值提供了更快更高效的处理过程。
[05]HALT(Halt DMA Operations)暂停DMA操作:1暂停,推迟新通道的开始,允许完成当前执行通道,直到置0恢复工作
[04]HOE(HALT On Error)错误暂停:任何报错导致HALT被标志,随后所有请求都被忽略直到HALT被清除
[03]ERGA(Enable Round Robin Group Arbitration)使能循环组仲裁:0使用固定优先级仲裁顺序,1使用循环组仲裁方法,即从最高的组号到最低的组号依次响应DMA请求而不考虑其优先级。
[02]ERCA(Enable Round Robin Channel Arbitration)使能循环通道仲裁:0使用固定优先级仲裁顺序,1使用循环通道仲裁方法,即从最高的通道号到最低的通道号依次响应DMA请求而不考虑其优先级。
[01]EDBG(Enable Debug)使能调试:1使能,推迟新通道的开始,允许完成当前执行通道,直到系统退出调试模式或者该标志被清除时恢复工作
[00]保留

错误状态寄存器Error Status Register (DMA_ES)[32bits]
[31]VLD:所有错误状态位逻辑或(任何一个错误状态为1,则VLD为1)
[16]ECX:最后一次被记录的进程是被错误传输取消的
[15]GPE:组优先级仲裁错误,优先级设置不唯一
[14]CPE:通道优先级仲裁错误,优先级设置不唯一
[12-08]ERRCHN(Error Channel Number or Canceled Channel Number):错误的通道号或是被暂停的通道号
[07]SAE:源地址错误,TCDn_SADDR域与TCDn_ATTR[SSIZE]不一致
[06]SOE:源偏移错误,TCDn_SOFF域与TCDn_ATTR[SSIZE]不一致
[05]DAE:目的地址错误,TCDn_DADDR域与TCDn_ATTR[DSIZE]不一致
[04]DOE:目的偏移错误,TCDn_DOFF域与TCDn_ATTR[DSIZE]不一致
[03]NCE:NBYTES/CITER设置错误,TCDn_NBYTES不是TCDn_ATTR[SSIZE]和TCDn_ATTR[DSIZE]的倍数;TCDn_CITER[CITER]等于0;TCDn_CITER[ELINK]不等于TCDn_BITER[ELINK]
[02]SGE:Scatter/Gather散/聚模式设置错误
[01]SBE:源总线错误
[00]DBE:目的总线错误

DMA请求使能寄存器Enable Request Register (DMA_ERQ)[32bits]
受SERQ和CERQ寄存器影响
硬件DMA请求到达之前,对应通道必须使能,而软件DMA请求和链接通道的DMA请求不受该位影响
[n]ERQn:使能通道n的DMA请求

错误中断使能寄存器Enable Error Interrupt Register (DMA_EEI)[32bits]
受SEEI和CEEI寄存器影响
[n]EEIn:通道n的错误中断使能

DMA_CERQ提供了ERQ的映射,可以对ERQ清0
DMA_SERQ提供了ERQ的映射,可以对ERQ全部置1
DMA_CEEI提供了EEI的映射,可以对EEI清0
DMA_SEEI提供了EEI的映射,可以对EEI全部置1
DMA_CDNE提供了TCDn_CSR[DONE]的映射,可对其清0
DMA_SSRT提供了TCDn_CSR[START]的映射,可对其全部置1
DMA_CERR提供了EER的映射,可以对EEI清0
DMA_CINT提供了INT的映射,可以对INT清0

DMA中断请求寄存器Interrupt Request Register (DMA_INT)[32bits]
受CINT影响
[n]INTn:n通道的中断请求

DMA错误寄存器Error Register (DMA_ERR)[32bits]
受CERR影响
[n]EERn:n通道发生错误

硬件请求状态寄存器Hardware Request Status Register (DMA_HRS)[32bits]
[n]HRSn:n通道硬件服务请求

停止时异步请求使能寄存器Enable Asynchronous Request in Stop Register[32bits]
[n]EDREQn:n通道使能DMA异步请求

通道n优先级寄存器Channel n Priority Register (DMA_DCHPRIn)[8bits]
[7]ECP:置1,通道可被优先级更高的通道挂起,置0,则不能
[6]DPA:置1,不可挂起别的通道,和优先级无关,置0,则可将低优先级通道挂起
[3-0]CHPRI:通道裁决优先级(必须唯一值)

TCD源地址TCD Source Address (DMA_TCDn_SADDR)[32bits]
TCD有符号源地址偏移TCD Signed Source Address Offset (DMA_TCDn_SOFF)[16bits]
TCD传输属性TCD Transfer Attributes (DMA_TCDn_ATTR)[16bits]
[15-11]SMOD(Source Address Modulo)源地址取模:置0关闭。该寄存器定义了SADDR + SOFF的范围,超出范围则从头开始,实现循环数据队列
[10-08]SSIZE(Source data transfer size)源数据传输大小:8位000,16位001,32位010,16字节100,32字节101
[07-03]DMOD(Destination Address Modulo)目标地址取模:同SMOD
[02-00]DSIZE(Destination data transfer size)目标数据传输大小:同SSIZE

DMA_TCDn_NBYTES_MLNO与DMA_TCDn_NBYTES_MLOFFNO与DMA_TCDn_NBYTES_MLOFFYES是一个寄存器
是哪一个取决于是否开启副循环映射,副循环映射开启时是否启用副循环地址偏移

TCD副循环计数器TCD Minor Byte Count (Minor Loop Mapping Disabled)(DMA_TCDn_NBYTES_MLNO)[32bits]
NBYTES:副循环传输计数,在关闭副循环映射时,每次DMA副循环要传输的字节数

TCD有符号副循环偏移TCD Signed Minor Loop Offset (Minor Loop Mapping Enabled and Offset Disabled) (DMA_TCDn_NBYTES_MLOFFNO)[32bits]
CR[EMLM]=1且副循环偏移关闭(SMLOE = 0且DMLOE = 0)
[31]SMLOE:副循环源地址偏移使能
[30]DMLOE:副循环目的地址偏移使能
[29-00]NBYTES:副循环传输计数

TCD有符号副循环偏移TCD Signed Minor Loop Offset (Minor Loop Mapping and Offset Enabled) (DMA_TCDn_NBYTES_MLOFFYES)[32bits]
CR[EMLM]=1且副循环偏移开启(SMLOE = 1或DMLOE = 1)
[31]SMLOE:副循环源地址偏移使能
[30]DMLOE:副循环目的地址偏移使能
[29-10]MLOFF:若SMLOE = 1或DMLOE = 1,该值表示一个偏移量,用于本次副循环结束后计算下一次目的地址或源地址
[09-00]NBYTES:副循环传输计数

TCD最终源地址调整TCD Last Source Address Adjustment (DMA_TCDn_SLAST)[32bits]
SLAST:主循环完成后,最终源地址的调整量,是一个有符号值,该值与最终地址相加,得到新的源地址并写回TCD中

TCD目标地址TCD Destination Address (DMA_TCDn_DADDR)[32bits]
TCD有符号目标地址偏移TCD Signed Destination Address Offset (DMA_TCDn_DOFF)[16bits]

DMA_TCDn_CITER_ELINKYES与DMA_TCDn_CITER_ELINKNO是一个寄存器
取决于是否启用副循环通道链接

TCD当前副循环链接,主循环计数器TCD Current Minor Loop Link, Major Loop Count (Channel Linking Enabled) (DMA_TCDn_CITER_ELINKYES)[16bits]
TCDn_CITER[ELINK] = 1
[15]ELINK:当前副循环结束时是否使用通道链接
[13-09]LINKCH:副循环链接通道的通道号
[08-00]CITER:当前主循环迭代计数器,当小循环在传输控制描述符内存中完成并更新时,它就会递减。在主要的迭代计数耗尽之后,通道执行一些操作,例如,最终的源地址和目标地址计算,在从开始迭代计数(BITER)字段重新加载CITER字段之前,可选地生成一个中断到信号通道完成。
注意:当CITER字段最初由软件加载时,必须将其设置为与BITER字段中所包含的相同的值。
注意:如果通道被配置为执行单个服务请求,那么BITER和CITER的初始值应该是0x0001。

TCD当前副循环链接,主循环计数器TCD Current Minor Loop Link, Major Loop Count (Channel Linking Disabled) (DMA_TCDn_CITER_ELINKNO)[16bits]
TCDn_CITER[ELINK] = 0
[15]ELINK:当前副循环结束时是否使用通道链接
[14-00]CITER:当前主循环迭代计数器,当小循环在传输控制描述符内存中完成并更新时,它就会递减。在主要的迭代计数耗尽之后,通道执行一些操作,例如,最终的源地址和目标地址计算,在从开始迭代计数(BITER)字段重新加载CITER字段之前,可选地生成一个中断到信号通道完成。
注意:当CITER字段最初由软件加载时,必须将其设置为与BITER字段中所包含的相同的值。
注意:如果通道被配置为执行单个服务请求,那么BITER和CITER的初始值应该是0x0001。

TCD最终目的地址调整/分散聚集地址TCD Last Destination Address Adjustment/Scatter Gather Address (DMA_TCDn_DLASTSGA)[32bits]
关闭聚/散模式(TCDn_CSR[ESG] = 0)
DLASTSGA:若未启用聚/散模式,该值为主循环结束后,目的地址的调整量,为有符号数;若启用聚/散模式,则该值为一个32位地址,指向一个32字节存储区的起始地址,该区域储存了一个新的该通道的TCD

TCD控制与状态寄存器TCD Control and Status (DMA_TCDn_CSR)[32bits]
[15-14]BWC:带宽控制,用于控制eDMA对总线带宽的消耗,使用带宽控制可以让出更多总线带宽供CPU使用。00无,10eDMA引擎每读写一次停4个周期,11eDMA引擎每读写一次停8个周期
[12-08]MAJORLINKCH:主循环链接通道号,若主循环通道链接使能(MAJORELINK = 1),那么当前主循环结束会按照此值指定的通道启用该通道请求(即自动TCDn_CSR[START] = 1)
[07]DONE:主循环完成了所有数据传输,置1
[06]ACTIVE:通道激活,是否在执行中
[05]MAJORELINK:主循环通道链接使能
[04]ESG:散/聚模式使能
[03]DREQ:禁止请求,置1时,对应通道DMA硬件请求使能EQR在主循环传输后会自动清0(屏蔽硬件DMA请求)
[02]INTHALF:中断控制,置1,当主循环计数器CITER完成一半时使能中断
[01]INTMAJOR:中断控制,置1,主循环传输结束,即CITER为0时使能中断
[00]START:通道开始,通道请求服务,开始执行后,eDMA硬件自动清除该位,用于软件请求DMA

DMA_TCDn_BITER_ELINKYES与DMA_TCDn_BITER_ELINKNO为一个寄存器
取决于是否启用起始副循环通道链接

TCD起始副循环链接,主循环计数TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Enabled) (DMA_TCDn_BITER_ELINKYES)[16bits]
TCDn_BITER[ELINK] = 1
[15]ELINK:当前副循环结束时是否使用通道链接
[13-09]LINKCH:副循环链接通道的通道号
[08-00]BITER:当前主循环迭代计数器,当小循环在传输控制描述符内存中完成并更新时,它就会递减。在主要的迭代计数耗尽之后,通道执行一些操作,例如,最终的源地址和目标地址计算,在从开始迭代计数(BITER)字段重新加载CITER字段之前,可选地生成一个中断到信号通道完成。
注意:当CITER字段最初由软件加载时,必须将其设置为与BITER字段中所包含的相同的值。
注意:如果通道被配置为执行单个服务请求,那么BITER和CITER的初始值应该是0x0001。

TCD起始副循环链接,主循环计数TCD Beginning Minor Loop Link, Major Loop Count (Channel Linking Disabled) (DMA_TCDn_BITER_ELINKNO)[16bits]
[15]ELINK:当前副循环结束时是否使用通道链接
[14-00]BITER:当前主循环迭代计数器,当小循环在传输控制描述符内存中完成并更新时,它就会递减。在主要的迭代计数耗尽之后,通道执行一些操作,例如,最终的源地址和目标地址计算,在从开始迭代计数(BITER)字段重新加载CITER字段之前,可选地生成一个中断到信号通道完成。
注意:当CITER字段最初由软件加载时,必须将其设置为与BITER字段中所包含的相同的值。
注意:如果通道被配置为执行单个服务请求,那么BITER和CITER的初始值应该是0x0001。

CITER传送计数,BITER传送计数初始值

常用的DMA计数器实际上通过记录主循环计数来得到触发次数,每次计算完触发次数后立即重置当前主循环计数,使主循环永远不会结束
当然也要满足主循环计数初值大于采样周期内最大脉冲数保证不触发重置

当使用某通道的DMA时,需要配置所有TCD寄存器