第5.3节 直接存储器访问模块(DMA)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第5章DSP接口与总线
5.3.1 DMA模块总线结构
DMA是基于事件的模块,因此需要有一个外设中断触发才开始DMA数据传输。
6个DMA通道的中断触发源可以独立配置,并且每一个通道都拥有各自独立的PIE中断,当DMA传送开始或结束时,可通过PIE中断告知CPU。
6个通道中,有5个通道具有相同的性能,而通道1具有一个附加特性:其优先级可以配置成比其它通道的优先级高。
DMA 模块的核心是一状态机并与地址控制逻辑总线联系在一起。
正是这个地址控制逻辑总线允许对传输过程中的数据块包括缓冲器间的“乒—乓”数据重新排列。
1.DMA的基本特征
具有独立PIE中断的6个通道。
外设中断触发源:ADC排序器1和2、多通道缓冲串口A和B(McBSP-A,McBSP-B)的发送和接收、XINT1~7和XINT13、CPU定时器、ePWM1~6的ADSOCA和ADSOCB 信号以及软件强制触发。
数据源/目的:L4~L7 16K SARAM、所有XINT区域、ADC存储器总线映射结果寄存器、McBSP-A和McBSP-B发送和接收缓冲器、ePWM1~6/HRPWM1~6外设帧3映射的寄存器。
字长度:16位或32位(McBSPs限制为16位)。
吞吐量:4个时钟周期/字(对于McBSP读操作,5个时钟周期/字)。
图5‐17 DMA 结构图
图5-17给出了DMA的结构框图。
2. 外设中断事件触发源
外设中断事件触发器可以为每个DMA通道独立配置18个触发源中的一个。
在这些中断触发源中,有8个外部中断信号,这些信号可以连接到GPIO引脚上,这就大大增加了触发事件的灵活性。
每个通道MODE寄存器中的PERINTSEL位用来选择该通道的中断触发源。
一个有效的外设中断触发事件将锁存至CONTROL寄存器的PERINTFLG位,并且如果相应的中断和DMA通道被使能(MODE.CHx[PERINTE]和CONTROL.CHx[RUNSTS]位),则DMA通道将会响应中断事件。
一旦接收到外设中断事件信号,DMA会自动地向中断源发送清零信号,以保证后续中断事件的发生。
无论MODE.CHx[PERINTSEL]位的值是什么,软件总是可以通过PERINTFRC位给通道一个强制触发事件。
同样,软件也可以通过CONTROL.CHx[PERINTCLR]位清除一个悬挂的DMA触发源。
一旦特定的中断触发源将通道的PERINTFLG位置位后,该位将保持悬挂状态直到状态机的优先逻辑启动该通道的数据传送;当数据传送开始后,该标志位将被清零。
当数据传送过程中,又产生了一个新的中断触发事件时,DMA通道将在当前数据传送完毕后,再按适当的优先次序,去响应这个新的中断触发源。
若当前悬挂的中断响应结束前,第3个中断触发源产生,则错误标志CONTROL.CHx[OVRFLG]将被置位。
如果外设中断触发事件与清除ERINTFLG标志位同时发生,外设中断触发事件有优先权,且PERINTFLG位仍保持置位。
外设中断触发器输入框图
外设中断触发源外设中断触发源
CPU
DMA软件位
(CHx.CONTROL.PERINTFRC)
ePWM1ADC启动通道A或B转换
ADC排序器1中断、排序器2中断ePWM2ADC启动通道A或B转换外部中断外部中断1~7、外部中断13ePWM3ADC启动通道A或B转换
CPU定时
器定时器0溢出、定时器1溢出定时
器2溢出
ePWM4ADC启动通道A或B转换
McBSP‐A McBSP‐A发送缓冲器空
McBSP‐A接收缓冲器满
ePWM5ADC启动通道A或B转换
McBSP‐B McBSP‐B发送缓冲器空
McBSP‐B接收缓冲器满
ePWM6ADC启动通道A或B转换
3. DMA总线
DMA总线包含22位的地址线、32位的读总线和32位的写总线。
连接到DMA总线上的存储器和寄存器通过接口与CPU存储器或外设总线共享资源。
与DMA总线相连的资源有:XINTF区域0,6,7、L4 ~L7 SARAM、ADC存储器映射结果寄存器、McBSP-A和McBSP-B数据接收寄存器(DRR2/DRR1)和数据发送寄存器(DXR2/DXR1)、ePWM1~6/HRPEM1~6映射到外设帧3的寄存器
4. 流水线时序和吞吐量
DMA包含了4级流水线操作。
当DMA配置成使用McBSPs作为其数据源时,在传送数据过程中,读DRR寄存器会使DMA总线暂停一个时钟周期。
除了流水线操作外,还有以下性能会影响DMA的整体吞吐量:
在每个数据帧(burst)传输的开始会附加一个时钟周期的延迟;
当从通道1高优先级中断返回时会附加一个时钟周期的延迟;
32位的传输速度是16位传输速度的两倍(32位字和16位字的传输时间相等); 和CPU发生冲突时会产生附加的延迟。
例如,从ADC中传送128个16位字至RAM,通道可以配置成传输8个16字的数据帧。
便得到传送需要:8帧x[(4时钟周期/字x16字/帧)+1]=520时钟周期;若通道配置成传送32位字,则传送将需要:8帧x [(4时钟周期/字x8字/帧)+1]=264时钟周期。
5.3.2 CPU仲裁及通道优先级
1.CPU仲裁
DMA典型特性是其与CPU操作是相互独立的。
当DMA和CPU同时通过同一接口尝试访问存储器或外设寄存器时,就需要一个仲裁流程。
但也有例外的情况,当CPU和DMA同时读访问映射到PF0的ADC寄存器时,并不产生冲突,甚至CPU 和DMA同时访问不同的地址也不会产生冲突。
当CPU和DMA访问的是不同的接口,或CPU访问的接口是DMA访问接口的外部时均不会产生冲突。
会产生冲突的接口有:
XINTF存储器区域0,6,7,
L4~ L7 RAM,
外设帧3(McBSP-A,McBSP-B,ePWM1~6/HRPWM1~6)。
5.3.2 CPU仲裁及通道优先级
2. 通道优先级
(1)循环模式
在这种模式下,所有通道都享有平等的优先级,每个使能通道按照循环的方式被响应:CH1 CH2 CH3 CH4 CH5 CH6 CH1 CH2 …。
当前通道传送完数据字节后,下一通道才被响应。
用户可以定义每一通道传送数据的长度。
CH6(或最后被使能的通道)被响应后且没有其它通道处于悬挂状态,循环状态机将进入空闲状态。
退出空闲状态时,总是先响应CH1(若通道1被使能)。
尽管如此,若DMA当前正在服务某一个通道CHx,其它悬挂的位于x和该循环最后一通道之间的通道都将在CH1之前被服务。
例如,假设所有通道都被使能,DMA处于空闲状态;CH1、CH3、CH5在同一周期初始化触发源;当CH1开始传送数据时,CH3、CH5处于悬挂状态;CH1完成数据传送前,DMA接到来自CH2的请求,此时悬挂请求分别来自CH2、CH3和CH5;CH1完成数据传送后,先响应CH2的请求,CH2完成数据传送后,再响应CH3,之后再是CH5;若CH5正在被服务时,DMA又接收到了来自CH1、CH3、CH6的请求;在CH5服务结束后,CH6才开始传输数据,因为在循环模式下,CH6服务顺序位于CH5之后;CH6服务结束后,再服务CH1,之后再是CH3;在CH3服务结束后,若没有其它触发源产生,则循环状态机将进入空闲状态。
通过
DMACTRL[PRIORITYRESET]位可将循环状态机复位到空闲状态。
5.3.2 CPU仲裁及通道优先级
通道1高优先级模式
在这种模式下,若CH1触发事件发生,则其它任何通道的当前字传送完毕后(不是整个数据帧的数据都传送完成),该通道的操作将暂停,CH1将被服务传送数据。
当CH1的全部数据传送完毕后,操作将返回到CH1触发事件产生时有效的那个通道。
其它所有通道享有平等的优先级,且每一使能的通道都按照循环方式被服务:
高优先级:CH1
低优先级:CH2 CH3 CH4 CH5 CH6 CH2 …
举例来说,若在CH1高优先级模式下使能CH1、CH4、CH5,且假设CH4正在被服务。
若在CH4传送结束之前,CH1和CH5同时从各自的外设接收到中断触发事件,则CH1和CH5将处于悬挂状态。
当CH4中当前字传送结束后,无论DMA是否完全传送CH4中的整个数据帧,CH4操作都将暂停并且开始服务CH1。
CH1服务结束后,CH4将继续操作。
在CH4服务结束后,CH5开始被服务。
在CH5服务结束后,若没有其它通道处于悬挂状态,循环状态机将进入空闲状态。
5.3.3 地址指针和传送控制
DMA状态机是两级嵌套循环。
内循环是接收到外设中断触发事件后传送一个帧的数据。
帧(burst)是每次传送数据的最小量级,帧的长度大小可通过BURST_SIZE寄存器来定义(每帧最多传送32个16位字)。
TRANSFER_SIZE设置外循环的长度大小,即定义在整个传送过程中共传送多少个这样的帧数据。
TRANFER_SIZE是一个16位寄存器,每次传送可以产生一个CPU中断(若中断使能)。
该中断可以通过
MODE.CHx[CHINTMODE]位配置为在每次传送的开始或结束时刻产生。
在MODE.CHx[ONESHOT]位默认设置下,DMA在每接收到一个中断触发事件信号时传送一帧数据。
传送完毕后,状态机按照优先级指向下一悬挂通道,即使刚完成传送任务的通道又接收到一个中断触发事件信号并处于悬挂状态,状态机也会指向下一悬挂通道。
这一特性可以防止任一单个通道独占DMA总线。
若单个触发事件要求传送数据的长度超过了每帧允许传送字的最大值,则需要传送多个帧数据,这时可以通过设置MODE.CHx[ONESHOT]位来完成整个数据帧的传递任务。
需要注意的是,这种模式下可能会发生某一触发事件独占大部分DMA带宽的情况。
5.3.3 地址指针和传送控制
每个DMA通道包含了源地址(SRC_ADDR)和目的地址(DST_ADDR )的映射地址指针。
在每次传送的开始时,映射(shadow)寄存器中的地址指针会拷贝到相应的当前工作(active)寄存器中。
在帧循环(burst loop)中,在每个字传送完毕后,源地址和目的地址的BURST_STEP寄存器中的值会加到当前工作的SRC/DST_ADDR上(即做加法),用以修改当前工作的地址指针;在传送循环(transfer loop)中,每一帧传送完毕后,有两种方法修改当前工作的地址指针:第一种方法(默认)是将SRC/DST_TRANSFER_STEP寄存器的值加到相应的地址指针上(即做加法);第二中方法是一种被称作为“打包”(wraping)的过程,该方法中,一个数据打包的地址装载到当前工作的地址指针中(即赋值)。
当一个打包过程发生后,相应的SRC/DST_TRANSFER_STEP寄存器内容将被忽略。
5.3.3 地址指针和传送控制
当SRC/DST_WRAP_SIZE所定义的一定数量的帧数据传送完毕后,地址打包过程发生。
每个DMA通道包含了两个打包地址指针:SRG_BEG_ADDR和DST_BEG_ADDR,这两指针已被映射,源打包地址和目的打包地址可以独立配置。
与SRC_ADDR、DST_ADDR寄存器一样,在每个传送的开始时刻,当前工作的SRC/DST_BEG_ADDR寄存器将载入与之相应的映射寄存器的内容。
当一定数量的帧数据传送完毕后,“打包”过程分两步发生:
首先当前工作寄存器SRC/DST_BEG_ADDR按照
SRC/DST_WRAP_STEP寄存器中的定义值增加,然后新的当前工作寄存器SRC/DST_BEG_ADDR内容被加载到SRC/DST_ADDR寄存器中。
此外,数据打包计数器(SRC/DST_WRAP_COUNT)寄存器重新载入SRC/DST_WRAP_SIZE的值,启动下一个“打包”周期。
这就允许通道在单个传送过程中多次“打包”。
结合上文所述的每个字传送完毕后源/目的地址可以修改,那么在单个传送过程中,可以访问多个缓冲器地址。
5.3.3 地址指针和传送控制
在地址指针中,DMA分别包含了当前工作(active)和映射(shadow)寄存器组。
当DMA传送开始时,映射寄存器组的内容拷贝到当前工作的寄存器组。
这就允许用户在DMA工作于当前工作的寄存器组时,对映射寄存器编程,为下次传送做准备;另外,还允许用户修改ping-pong缓冲器配置而不打断DMA通道操作。
有如下地址指针:
①源/目的地址指针(SRC/DST_ADDR):写入映射寄存器的值是进行第一次读取或写入操作的起始地址。
在每次传送的开始,映射寄存器内容被复制到当前工作寄存器中,当前工作寄存器的值代表当前的地址指针。
②源/目的起始地址指针(SRC/DST_BEG_ADDR):该指针是数据打包地址指针。
在传送开始时,写入到其映射寄存器的值将加载到当前工作的寄存器中;“打包”过程发生后,当前工作寄存器将按照SRC/DST_WRAP_STEP中定义的值增加,增加后的值再加载到SRC/DST_ADDR寄存器中。
5.3.3 地址指针和传送控制
对于每个通道,传送过程可以通过以下长度(SIZE)值控制:
①源和目的帧长度(BURST_SIZE):定义每帧传送的数据字个数。
在每次传送开始时,该值将被装载到BURST_COUNT寄存器中,每传送一字后,
BURST_COUNT的值减1,当减为0时,一帧数据传送完毕,表明可以服务另一通道。
当前通道的工作方式可以通过MODE寄存器的ONE_SHOT位控制。
帧长度可设置的最大值由外设类型而定。
②源和目的传送长度(TRANSFER_SIZE):MODE寄存器中的CHINTMODE位决定中断在传送的开始或结束时刻产生;MODE的CONTINUOUS位决定一次传送完毕后,通道保持使能或禁止。
每次传送开始时,TRANSFER_SIZE寄存器的值装载到TRANSFER_COUNT中。
TRANSFER_COUNT的值明示已经传送了多少帧的数据,当其减为0时,DMA传送结束。
③源/目的数据打包长度(SRC/DST_WRAP_SIZE):该位决定当前地址指针返回到起始值之前需传送的数据帧的个数。
在每次传送开始时,数值被装载到相应的SRC/DST_WRAP_COUNT寄存器中,该寄存器可明示通道已经传送了多少帧的数据,当寄存器值减为0时,相应的源或目的地址指针执行“打包”过程。
写入到SIZE寄存器的值是所要传送的长度减去1。
无论DATASIZE位的状态为何,SIZE寄存器中的数值都是对于16位字长的地址而言,因此,当需要传送3个32位长的字时,应向SIZE寄存器写入5。
5.3.3 地址指针和传送控制
可通过以下步长(STEP)值来改变每一个源/目的指针地址:
①源/目的帧步长(SRC/DST_BURST_STEP):在每帧数据传送过程中,源地址和目的地址变化步长由该寄存器决定。
其值为2的补码形式的有符号数,所以地址指针可以根据要求增加和减小。
若不需要增加,如访问McBSP数据接收和发送寄存器时,应赋值为0。
②源/地址传送步长(SRC/DST_TRANSFER_STEP):该寄存器决定在当前帧数据传送完毕后,开始下一帧数据传送时的地址偏量。
寄存器值为2的补码形式的有符号数,因而地址指针可跟据需要增加和减小。
③源/目的数据打包步长(SRC/DST_WRAP_STEP):当数据打包计数器减至0时,该寄存器值决定BEG_ADDR指针加上或减去多少偏量,进而设置新的起始地址。
寄存器值为2的补码形式的有符号数,因而地址指针可根据需要增加和减小。
注意,无论DATASIZE位是什么值,上述STEP寄存器定义的值均是对于16位字长的数据地址而言,所以,若需增加一个32位字长的数据地址,则需向上述寄存器中写入2。
5.3.3 地址指针和传送控制
在帧循环(burst loop)和传送循环(transfer loop)中,有3种方式控制状态机的操作模式,其特性和模式如下图5-21所示。
①单次触发模式(ONESHOT):在单次触发模式下,当触发事件发生后,DMA将持续传送数据帧直至TRANSFER_COUNT为0;若该模式被禁止,则在传送每个数据帧时都要一个事件触发直至TRANSFER_COUNT减为0。
需要注意的是,单次发模式可能占用大量外设带宽并且导致CPU长时间的暂停。
为避免这种情况发生,用户可以配置CPU定时器(或类似操作)作为中断触发事件,并禁止单次发模式。
②连续模式(CONTINUOUS):如果连续模式被禁止,CONTROL寄存器中的RUNSTS位将在传送结束后被清零,表明DMA通道被禁止。
那么在该通道启动下一传送之前,必须将CONTROL寄存器中的RUN位置位,重新使能该通道。
如果使能了连续模式,则在每次传送结束后,RUNSTS位不会被清零
③通道中断模式(CHINTMODE):该模式决定各个通道的DMA中断在每个传送的开始还是结束时刻产生。
当用连续模式实现ping-pong缓冲器操作时,中断应在每次传送的开始产生,即在映射寄存器组内容拷贝到当前工作寄存器组之后;若DMA不工作在连续模式,则中断通常配置成在每次传送完成后产生。
5.3.4 ADC同步特性
当ADC工作在排序器覆盖功能使能的连续转换模式时,DMA提供了与ADC排序器1中断(SEQ1INT)同步的硬件方法。
在这种特定的模式下,ADC连续转换ADC排序通道,且不需在排序器转换结束后复位排序器指针。
当接收到触发事件时,因为DMA不知道排序器指针指向的是哪个ADC结果寄存器,故DMA和ADC步调可能不一致。
为此,当ADC配置成此模式时,每当从结果寄存器0(RESULT0)开始转换序列并有中断触发事件发生时,ADC为DMA提供同步信号。
DMA将该信号视为打包进程或开始传送数据的同步信号。
若DMA未进行此操作,则会发生重新同步,即:
重新将WRAP_SIZE值装载到WRAP_COUNT寄存器中。
将当前工作BEG_ADD寄存器值装载到当前工作ADDR寄存器中。
将CONTROL寄存器的SYNCERR位置位。
若有需要,允许使用多个缓冲器存储数据,并使DMA和ADC重新同步。
5.3.4 ADC同步特性
如图5-22所示,同步信号源由MODE寄存器中的PERINTSEL位选择。
若对选定的源和通道使能了同步特性(SYNC),则在RUN位被置位后接收到第一个SYNC信号时,才开始所选定通道的传送。
在第一个SYNC事件发生前,所有的外设中断触发事件都将被忽略。
5.3.5 DMA超载
当DMA接收到外设的触发事件,CONTROL寄存器的PERINTFLG位会置位,并将相应的通道在DMA状态机中置为悬挂状态。
当该通道开始传送数据后,PERINTFLG位会自动清零。
如果在PERINTFLG被事件置位到该位因开始传送数据而被清零的时间段内,又发生了一个触发事件,则第二个触发事件将丢失(发上超载),这会将CONTROL寄存器的OVRFLG位置位。
若使能了超载中断,则会向PIE发送通道中断请求。
5.3.6 DMA模块寄存器说明
1. DMA控制寄存器(DMACTRL)
2. 调试控制寄存器(DEBUGCTRL)
3. 修正寄存器(REVISION)
4. 优先级控制寄存器1(PRIORITYCTRL1)
5. 优先级状态寄存器(PRIORITYSTAT)
6. 模式寄存器(MODE,受EALLOW保护)
7. 控制寄存器(CONTROL,受EALLOW保护)
8. 帧长度寄存器(BURST_SIZE,受EALLOW保护)
9. 帧计数寄存器(BURST_COUNT)
10. 源帧步长寄存器(SRC_BURST_STEP,受EALLOW保护)
11. 目的帧步长寄存器(DST_BURST_STEP,受EALLOW保护)
5.3.6 DMA模块寄存器说明
12. 传送长度寄存器(TRANSFER_SIZE,受EALLOW保护)
13. 传送计数寄存器(TRANSFER_COUNT)
14. 源传送步长寄存器(SRC_TRANSFER_STEP,受EALLOW保护)
15. 目的传送步长寄存器(DST_TRANSFER_STEP,受EALLOW保护)
16. 源/目的打包长度寄存器(SRC/DST_WRAP_SIZE,受EALLOW保护)
17. 源/目的打包计数寄存器(SRC/DST_WRAP_COUNT)
18. 源/目的打包步长寄存器(SRC/DST_WRAP_STEP,受EALLOW保护)
19. 源/目的起始地址指针映射寄存器(SRC/DST_BEG_ADDR_SHADOW,受EALLOW保护)
20. 源/目的地址指针映射寄存器(SRC/DST_ADDR_SHADOW,受EALLOW保护)
21.源/目的起始地址指针当前工作寄存器(SRC/DST_BEG_ADDR)
22. 源/目的地址指针当前工作寄存器(SRC/DST_ADDR)。