【AUTOSAR实战系列 · TC23x篇】DMA模块原理与EB配置
DMA模块1 DMA介绍1.1 特性DMA有16个通道通道15优先级最高通道0优先级最低所有16个通道的完整配置集称为“事务控制集”都存储在一块专门的DMARAM中模块内有2个独立的“搬运工”移动引擎可以并行工作任何一个移动引擎可以为任何一个通道服务没有固定的绑定关系数据宽度访问SPB总线连接大部分外设时支持81632位访问SRI总线连接内存、内核等高速单元时支持816 3264128256位。巨大的位宽使得内存到内存的拷贝极其高效数据块传输吞吐量内存SRI到内存SRI传输 8 MB/事务涉及外设FPI的传输 1 MB/事务支持链表、双缓冲等高级模式1.2 术语定义DMA MoveDMA数据搬运一次Move包含从源地址读数据和往目的地址写数据。读写数据宽度通常相同8-bit,16-bit,32-bit,64-bit,128-bit,256-bitDMA Transfer一个Transfer包含1, 2, 3, 4, 5, 8, 9或16个MoveDMA Transaction一个DMA Transaction包含至少一个TransferLinked List一个链表包含同一个通道的多个TransactionMove- Transfer- Transaction- List所以DMA的一般结果是Transaction包含TransferTransfer包含MoveMove是数据处理的最小颗粒度而Transfer是触发的最小颗粒度也就是说你可以选择一次请求触发一次Transaction或者只触发一个Transfer。如果你想搬运的数据并非连续或者规则的比如有两块比较远的内存需要在一次操作中处理这个时候你就需要配置Linked List一个Linked List包含多个Transaction1.3 DMA通道4种请求源DMA Software Request软件请求顾名思义就是软件写寄存器请求一次DMA搬运DMA Hardware Request硬件请求其他外设的中断信号发送至中断路由模块IRIR将信号路由至DMA模块请求一次DMA搬运DMA Daisy Chain RequestDaisy链请求比如通道5使能了Daisy链配置那它在完成之后会触发通道4的搬运请求DMA Auto Start Request用于Linked List同一通道配置了多个TCS第一个TCS完成之后会触发下一个TCS的搬运请求1DMA软件请求用户可以通过写寄存器进行软件搬运请求在进行软件请求的时候需要通过将TSR.DCH写1关闭硬件请求2硬件请求单次模式硬件请求在 DMA transaction后由硬件禁用连续模式硬件请求在 DMA transaction后不会由硬件禁用3Daisy Chain用户可以通过设置CHCFGR.PRSEL来配置Daisy链。当一个通道配置了Daisy链使能在它的Transaction完成之后会自动请求相邻的低优先级的通道搬运DMA通道号即优先级越高优先级越高。所以我们可以通过对多个相邻的DMA通道配置使能Daisy链完成多个DMA通道搬运的链式触发。另外在配置Daisy过程中除了最低优先级的通道以外其他通道需要关闭中断使能仅最后一个通道使能中断也就是说中断需要在Daisy链全部完成之后触发1.4 循环搬运流程当仲裁完成之后DMA通道请求就会送到Move Engine去进行数据搬运前面我们提到Transaction包含多个TransferTransfer包含多个Move而Move是搬运的最小颗粒度也就是说ME是按照Move逐个操作的Move中定义源地址、目的地址地址偏移等信息DMA的搬运源地址通过CHx.SADR寄存器设置目的地是通过CHx.DADR设置。DMA每个Move在完成之后源地址和目的地址都可以进行偏移以支持我们搬运连续的内存空间当然也可以原地保持不变循环搬运。源地址和目的地址的偏移都是独立计算的。地址的偏移有两种一种是递增或递减每次以固定的偏移值进行调节另一种就是循环Buffer1地址偏移模式如果我们需要搬运的数据它的地址是不连续的比如ADC采样的结果寄存器每个结果寄存器我们只需要前16个Bit而我们可能需要多个通道的采样结果那我们就需要通过设置Move的地址偏移来进行搬运。我们需要通过CHCFGR.CHDW设置Move的搬运宽度数据宽度DataWidth8*2^CHDW单位是Bit最大支持256Bit。在地址偏移模式中每次Move完成之后偏移的地址值是数据宽度的整倍数。SMFSource Address Modification Factor源地址偏移参数INCSIncrement of Source Address源地址偏移方向递增或递减DMFDestination Address Modification Factor目的地址偏移参数INCDIncrement of Destination Address目的地址偏移方向递增或递减在地址偏移模式中以上4个参数定义了地址偏移的格式。它的算法是这样的偏移值2^SMF*DataWidthINCS为1就是增加INCS为0就是减源地址和目的地址相同算法相同。我们可以看下面这个实例2循环Buffer模式循环Buffer模式和地址偏移模式的区别就是增加了一个地址空间的上下限超过这个限制就会按照设定的方向滚动。同样我们需要在ADICR寄存器中设置相关参数除了地址偏移模式的位域以外还有以下位域CBLSCircular Buffer Length Source源地址循环Buffer尺寸CBLDDestination Circular Buffer Enable目的地址循环Buffer尺寸SCBESource Circular Buffer Enable源地址循环Buffer使能DCBEDestination Circular Buffer Enable目的地址循环Buffer使能首先我们按照需求来使能源地址或者目的地址的循环Buffer然后和偏移地址模式一样设置我们的偏移参数最后通过CBLS或CBLD设置我们的Buffer尺寸。Buffer尺寸为2^CBLS单位为Byte最大为64kByte。举个例子比如我源地址为0x7000CC40CBLS4则循环Buffer尺寸为2^416Byte在搬运完0x7000CC4C~0x7000CC4F的4字节之后每个Move4字节源地址回到0x7000CC40。2 EB工程搭建DMA搬运ADC采样的数据2.1 配置Mcu-Dma为通道分配特定的用途这里将DmaChannel4-6配置为DMA2.2 配置Dma1对应的在DMA中添加3个通道2配置每个通道这里配置DmaCh6为例其余的2个通道配置相同2.3 配置Adc参考Adc章节同步采样配置软件采样ADC1_CH4使用DMA_CH4搬运硬件同步采样ADC0_CH11使用DMA_CH5搬运ADC1_CH11使用DMA_CH6搬运2.4 配置Mcu-Gtm使用Tom1Ch7触发ADC1的硬件采样2.5 配置Port将对应的PIN设置为模拟输入2.6 配置Irq1Irq-IrqAdc优先级6表示使用DMA通道6搬运3 Tasking工程搭建3.1 安装驱动包到EB安装目录下COMPLEX DRIVER\MC-ISAR_AS4XX_AURIX_TC23X_AC_PB_CD_V201_REL3303.1 导入库文件和EB生产的配置文件3.2 添加导入文件的路径在Include Paths项目下\${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/irq_infineon_tricore} \${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/irq_infineon_tricore/ssc} \${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/irq_infineon_tricore/ssc/inc} \${workspace_loc:/\${ProjName}/Aurix_MC-ISAR/irq_infineon_tricore/ssc/src}4 API接口API接口解释Dma_Init初始化Dma模块Dma_StartHwTransaction使能一个通道的触发5 Demo示例#includestdio.h#includeStd_Types.h#includeMcu.h#includePort.h#includeIcu_17_GtmCcu6.h#includeAdc.h#includeIrq.h#includeDma.h#includeIfxVadc_reg.hintmain(void){Mcu_Init(Mcu_ConfigRoot[0]);// 初始化McuRetValMcu_InitClock(0);if(RetValE_OK){while((Mcu_GetPllStatus())0){}Mcu_DistributePllClock();}Port_Init(Port_ConfigRoot[0]);// 初始化PortAdc_Init(Adc_ConfigRoot[0]);// 初始化AdcIrqAdc_Init();Mcal_EnableAllInterrupts();Dma_Init(Dma_ConfigRoot[0]);Adc_EnableHardwareTrigger(AdcConf_AdcGroup_Adc1HwSyncGrp1);Gtm_SetTomShadowValSr1(1,7,2500);Dma_StartHwTransaction(DMA_CH6,(uint32*)MODULE_VADC.G[1].RES[11].U,(uint32*)AdcResultBuffer_DMA[0],1);Dma_StartHwTransaction(DMA_CH5,(uint32*)MODULE_VADC.G[0].RES[11].U,(uint32*)AdcResultBuffer_DMA[1],1);Dma_StartHwTransaction(DMA_CH4,(uint32*)MODULE_VADC.G[1].RES[4].U,(uint32*)AdcResultBuffer_DMA[2],1);while(1){Adc_StartGroupConversion(AdcConf_AdcGroup_Adc1SwGrp0);delay_ms(100);}}6 测试MCUTC234调试器Lauterbach调试软件TRACE32 ICD TriCore USB劳德巴赫中监测变量值如下