1.3 DMA控制器
1.3.1 DMA的数据传输
1.数据交换方式
DMA控制器产生之前,CPU经常花费大量的带宽来移动所要处理的数据,不仅从片外存储器到片内存储器,还包括从一个外设到另一个外设。DMA控制器允许在不经CPU的干预下进行数据的交互,尽管无法准确衡量系统运算速度,但的确极大提升了数据的吞吐率。一个完整的DMA传输过程具有4个步骤。
1) DMA请求:外设接口提出DMA请求。
2) DMA响应:DMA控制器对DMA请求进行优先级判别并提出总线请求。CPU执行完当前周期后释放总线控制权。此时,总线应答表示DMA已响应,由DMA控制器通知外设接口开始DMA传输。
3) DMA传输:DMA控制器获得总线控制权后,DMA控制器开始在存储器和外设之间直接进行数据传送(需要提供要传输数据的起始位置和数据长度)。这个传送过程不需要CPU的参与。
4) DMA结束:数据批量传送完成后,DMA控制器立即释放总线控制权,并向外设接口发出结束信号。之后向CPU提出中断请求,CPU开始检查本次DMA传输的数据。最后CPU带着本次操作的结果及状态继续执行原来的程序。
2.F28335中DMA特点
DMA控制器以事件触发为基础,需要外设中断才能触发DMA数据的传输。6个DMA通道具有6个独立的外设中断。DMA的触发源、数据源和数据传输目的如图1.16所示。
图1.16 DMA内部结构
其中,外设中断触发源有ADC模块排序器1和ADC模块排序器2、多通道缓冲串口A和B(McBSP-A、McBSP-B)的发送和接收、XINT1~7和XINT13、CPU定时器、ePWM1~6的ADSOCA和ADSOCB信号以及软件强制触发。
数据源/目的地有L4~L7 16KB SARAM、所有XINT区域、ADC结果存储器ADCRESULTn、McBSP-A和McBSP-B发送和接收缓冲器、ePWM1~6/HRPWM1~6的映射寄存器。
1.3.2 F2833x的DMA中断事件及寄存器配置
1.外设中断事件触发源
图1.17为外设中断触发源选择结构图。
MODE.CHx[PERINTSEL]来选择每个DMA通道(x=1~6)的中断触发源,一个有效的中断触发事件锁存在CONTROL.CHx [PERINTELG]中。若使能了相应的模块中断和DMA通道中断(MODE.CHx[PERINTE]和CONTROL.CHx[RUNSTS]),DMA通道将会响应中断事件。一旦接收到外设中断信号,DMA会自动向中断源发送清零信号,以保证后续中断事件的发生。
无论MODE.CHx[PERINTSEL]的值是多少,软件均可通过CONTROL.CHx[PERINTFRC]给该通道一个强制触发事件。同样,也可通过CONTROL.CHx[PERINTCLR]清除一个悬挂的DMA触发源。
图1.17 外设中断触发源选择结构图
一旦通道的CONTROL.CHx[PERINTELG]置1,该位将保持悬挂状态直到状态机的优先逻辑启动该通道的数据传送,当数据开始传送后该标志位清零。
2.F28335中常用DMA配置函数
1) DMA控制寄存器DmaRegs.DMACTRL,其位格式如图1.18所示。
图1.18 DMACTRL的位格式
2) DMA优先级控制寄存器DmaRegs.PRIORITYCTRL1,其位格式如图1.19所示。
图1.19 PRIORITYCTRL1的位格式
3) 通道模式选择寄存器DmaRegs.CHx.MODE,其位格式如图1.20所示。
图1.20 CHx.MODE的位格式
图1.20 CHx.MODE的位格式(续)
4)通道控制寄存器DmaRegs.CHx.CONTROL,其位格式如图1.21所示。
图1.21 CHx.CONTROL的位格式
1.3.3 F2833x的DMA示例
1.F28335中DMA操作
(1) DMA 的3种工作模式
1) Burst模式。
由ADC中断标志触发,每次ADC转换后启动该传输模式,源地址和目的地址的迁移通过计数方式实现。操作步骤如下。
步骤1:配置源地址的首地址,即DmaRegs.CH1.SRC_BEG_ADDR_SHADOW=(Uint32)DMA_Source(DMASource=&AdcMirror.ADCRESULT0)。
步骤2:配置每次数据传输的总数,即DmaRegs.CH1.BURST_SIZE.all=bsize,如bsize=9,表示Burst传输10个数据。
步骤3:配置下一次要发送数据的首地址和接收数据的首地址,即
每传输1个数据,源地址和目标地址的偏移量加1(DmaRegs.CH1.SRC_BURST_STEP+1,DmaRegs.CH1.DST_BURST_STEP+1),并将传输的数据总数减1(DmaRegs.CH1.BURST_SIZE.all-1),当 DmaRegs.CH1.BURST_SIZE.all=0时,表示本次Burst传输完成。
2) Transfer模式。
该模式有两个功能:确定经过多少次Transfer传输后执行DMA中断;确定下次Burst传输的源地址和目标首地址。
Transfer传输由三个寄存器管理:
DmaRegs.CH1.TRANSFER_SIZE=tsize——经过多少次Burst传输后执行一次DMA中断,如tsize=9,表示10次Burst传输,DMA中断一次。
DmaRegs.CH1.SRC_TRANSFER_STEP=srctstep——Burst传输的源地址增量。
DmaRegs.CH1.DST_TRANSFER_STEP=deststep——Burst传输目标地址增量。
3) Wrap模式。
Wrap模式可实现数据的循环传输,TI官网程序为
相关寄存器配置及解释如下:
DmaRegs.CH1.SRC_WRAP_SIZE=srcwsize——Burst传输srcwsize+1次后,下次Burst传输的源首地址为DmaRegs.CH1.SRC_ADDR_SHADOW(本轮Wrap传输的源首地址)+DmaRegs.CH1.SRC_WRAP_STEP(Wrap传输的源地址偏移量)。
DmaRegs.CH1.DST_WRAP_SIZE=deswsize——Burst传输deswsize+1次后,下次Burst传输的目标首地址为DmaRegs.CH1.DST_ADDR_SHADOW(本轮Wrap传输的目标首地址)+DmaRegs.CH1.DST_WRAP_STEP(Wrap传输的目标地址偏移量)。
[注1]:若屏蔽Wrap传输,需将DmaRegs.CH1.SRC_WRAP_SIZE和DmaRegs.CH1.DST_WRAP_SIZE的设定值大于DmaRegs.CH1.TRANSFER_SIZE的设定值。
[注2]:Wrap传输时,只要Burst传输的次数达到DmaRegs.CH1.TRANSFER_SIZE,在DMA中断开启的情况下,DMA依旧会进入中断。
[注3]:非连续模式下,若想在某段地址内采用覆盖式存储,需对源和目标首地址重新赋值,并重新令DmaRegs.CH1.CONTROL.bit.RUN=1。
[注4]:连续模式下,若想在某段地址内采用覆盖式存储,只需对源和目标首地址重新赋值。
(2) TI例程(DSP2833x_DMA.c)提供的其他常用函数及含义
1)void DMACHxAddrConfig(volatile Uint16*DMA_Dest,volatile Uint16*DMA_Source)
参数解析:配置DMA数据目的地址和源地址。
2) void DMACHxModeConfig(Uint16 persel,Uint16 perinte,Uint16 oneshot,Uint16 cont,Uint16 synce,Uint16 syncsel,Uint16 ovrinte,Uint16 datasize,Uint16 chintmode,Uint16 chinte)
参数解析:配置要选择的触发源、触发源使能、ONESHOT使能、连续模式使能、外设同步使能、同步对象选择(源同步还是目标同步)、溢出中断使能、工作方式选择(16位还是32位)、产生中断模式选择(开始还是结束)、产生中断使能。
2.DMA示例分析
1)本例中,将1024字节的数据从L5 SARAM 复制到L4 SARAM(按照32位数据格式),数据传输由定时器0触发。数据传输结束后代码进入DINTCH1_ISR子程序。参考代码如下:
二维码1.2
其中DMA模式配置函数为
void DMACH1ModeConfig(Uint16 persel,Uint16 perinte,Uint16 oneshot,Uint16 cont,Uint16 synce,Uint16 syncsel,Uint16 ovrinte,Uint16 size,Uint16 chintmode,Uint16 chinte)
2)本例中,将存放在外部SARAM区域7(DMABuf2)中的1024个字节数据复制到L4 SARAM(DMABuf1)中,由定时器0触发数据的传输。数据传递结束后代码进入local_DINTCH1_ISR子程序,参考代码如下:
二维码1.3