DMA调试时ERS寄存器报配置错误问题
-
调试DMA时发现DMA的ERS寄存器报存在配置错误
SAE DAE BTCE =1 ,看了下规格书,上面写的SAE DAE BTCE这些错误主要和TCR SADDR DADDR BCNT TCNT几个寄存器设置错误有关。
我对比例程中对这几个寄存器的操作,也没发现什么问题。
仿真下读取的值看着也没什么错误? 还有哪些设置可能导致?
现在读取CSR寄存器,显示START =0,,但代码是有执行置1的,所以怀疑是ERS报错后,将START清零了,导致DMA始终未工作。所以想看看ERS是什么问题导致报错的
-
那这个要怎么设置对齐呢?
我目前设置源地址是etimer1.ch1的PPCNTN开始的4个寄存器,希望一次四个寄存器读完,目标地址是静态的u32数组,位宽我设置源和目标都是16byte。
这么看也没错啊。 -
不能一次读完16byte么?
看规格书也是支持16byte 和32byte读取的 -
1、比如说etimer2.ch1的PPCNT,默认地址就是0x4004B0D8,这种我还能怎么设置对齐地址?
目标地址是我定义的一个二维数组,地址就分配在0x1FFF8F68,这也没法再调整了啊。
或者说按您的意思,要实现16byte,必须源/目标地址都在16的倍数上,比如0x4000这种?
2、比如我现在希望读取etimer2.ch1的PPCNTN开始的4个寄存器,每次触发读取的4个值顺序存在一个二维数组里面,比如uint32 buffer[100][4]
如果要改成您说的4byte,每次循环4次,那需要怎么设置? -
另外顺带2个DMA模块的问题
1,dma模块的各个通道之间是否是独立的,比如dma的ch0和ch1同时触发,此时是各读各的还是有优先级顺序的?
2,在trigger loop时,如果设置了trigger count,执行到一半时,我想重置count,就是重新开始计数,需要如何操作? -
NorbertShi 1. 由于你的地址非对齐的,所以DMA不支持你之前的配置模式。2. 传输位宽配置为4字节,BCNT为4,每次小循环地址偏移为4字节,通过STO / DTO 调整一次大循环完成后的搬移地址。
-
NorbertShi 1. 先执行ch0 再执行ch1。 2. 可通过修改TCNTRV寄存器 修改trigger count
-
我现在按您建议的,同时修改了原来的一次复制4个寄存器的做法,改为一次复制一个寄存器,然后顺序存入一个20个的数组buffer[20],
调试时按dma位宽4byte,每次触发DMA传送一个寄存器,每次transfer loop的offset = 0,bcnt = 4byte,
trigger设置为trigger loop 的count = 20,TCNTRV = 20.
这种设置下可以观察到DMA有工作,并把值复制到指定buffer位置,且填满buffer的数组。
但现在问题是写入buffer的值都是一样的,看着像DMA触发后写了20次同一个值。
这又是什么设置导致的? -
NorbertShi SOFF 也需要配置,要不然每次取的都是同一个寄存器的值。按你的需求循环取4个寄存器的值,每次trigger都需要调整源地址,可通过STO或 TCR寄存器中的SMOD方式实现。建议还是先熟悉DMA的基本功能,然后再结合实际需求来配置。
-
您误解我意思了,我现在是之前要读4个寄存器,现在不用了,只读其中的一个寄存器,
然后希望每次trigger DMA传送到缓存,然后DADDR自增指向缓存下一个地址。
20个trigger一个循环。所以SOFF不设置
但现在的配置测试出来就是看着像每次trigger后,DMA一次把同一个值全部写入了20个缓存 -
NorbertShi 那就是DMA搬移数据期间寄存器的值没有改变导致的。因为DMA的工作频率跟CORE_CLK一致,搬运20次,花费的时间是ns级的
-
那我每次触发后搬运完,不是应该要等待下一次触发才搬运么? 如果寄存器值没变,也没产生触发啊
-
etimer模块触发DMA后读取了,还需要手动清除etimer的STS,否则会一直产生触发导致DMA重复复制。
是这么理解的吧? -
etimer的sts寄存器标志位是否有自动清除的设置,不然这样每次读取DMA还要中断来清除标志。
-
NorbertShi 没有
-
在trigger loop时,如果设置了trigger count,执行到一半时,我想重置count,就是重新开始计数,需要如何操作?
这个您的说法是说修改TCNTRV寄存器 修改trigger count
那比如我并不想要修改count,只是想让DMA的trig 重置到初始状态。
就比如DMA trig计数 ,我设置的20次,然后到第8次,我希望将DMA的trig 重新从20开始递减。同时destination address 恢复到初始化时的地址。
这时候直接对TCNTRV寄存器重写一次值可以实现我的要求么? 还是需要其他的操作?
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...