通过C2000_Ware中例程can_ex4_loopback_dma来学习DMA
概要
这里的MCU平台为280049
1. DMA Block
2. DMA初始化分析
代码
DMA_configAddresses(DMA_CH5_BASE, rxMsgData,
(uint16_t *)(CANA_BASE + CAN_O_IF2DATA));
DMA_configBurst(DMA_CH5_BASE, DMA_BURST, 2, 1);
DMA_configTransfer(DMA_CH5_BASE, DMA_TRANSFER, 0, 0);
3. DMA触发源选择
根据上面这个框图可知,DMA出发源选择其实分两步(为图中的1和2)
1 是选择触发源,即选择哪一个外设/软件触发源
2 此时触发源已经选好了,那么触发源要进入DMA的哪一个或多个通道,就要在此处进行选择
第1步 选择触发源
找到对应的通道寄存器后应该设置成什么样的值呢?
第2步 触发源进入DMA通道设置
代码 eg:
DMA_configMode(DMA_CH5_BASE, DMA_TRIGGER_CANAIF2, DMA_CFG_ONESHOT_DISABLE |
DMA_CFG_CONTINUOUS_DISABLE | DMA_CFG_SIZE_16BIT);
3. 概念和名词解释
WRAPSIZE
CAN_IF2CMD.DMAactive
CAN_CTL.DEx
|________________________________________________________________________|
4. 避坑指南-为什么DMA配置一切正常但是数据就是没有成功搬运?
|________________________________________________________________________|
概要:
这里以28388平台为例
4.1 DMA没有该地址区域的操作权限
原理分析:有可能是因为 【数据源数组】 和【目标数组】所处的地址不支持DMA操作
如下图所示,在memory map中可以看到哪些存储区是支持DMA的
举例说明:
通过.map文件可以找到上述两个数组的地址
在cmd文件中就可以看到.bss所处的存储区名称是C1RAM
那么cm memory map中C1RAM是不支持uDMA的,所以怎么折腾uDMA也不会听话的。
4.1 DMA的通道设置得不对
简述:DMA有很多个通道,每个通道对应什么外设都是分配好的,所以要正确设置。
举个栗子:
比如我想用EnterCAT的SYNC0信号来触发uDMA request
那么在uDMA通道分配表中可以看到其对应14通道