marshallemon 发表于 2025-2-24 08:56:22

8A8K64D4串口DMA怎么实现交替发送两个数组?

请教一个问题,我在使用8A8K64D4时,我想实现串口DMA 交替发送两个数组 实现类似乒乓操作,尝试修改官方例程,在发送时重新指定DMA_UR1T_AMT发送数组长度和DMA_UR1T_TXA所指向的数组,但一直不行,数组好像无法切换,除了使用memcpy以外我该怎么做?

王昱顺 发表于 2025-2-24 09:13:13

发送时不能更改地址和长度,顺序不对
应该在发送的时候对另一个缓冲区填入内容,然后等待发送完成中断,在中断里重新装载后发送。
双缓冲区我试过,是没问题的

乘风飞扬 发表于 2025-2-24 09:16:31

参考这个演示视频介绍:
https://www.stcaimcu.com/plugin.php?id=x7ree_v:x7ree_v&code_7ree=1&id_7ree=46

marshallemon 发表于 2025-2-24 14:24:17

王昱顺 发表于 2025-2-24 09:13
发送时不能更改地址和长度,顺序不对
应该在发送的时候对另一个缓冲区填入内容,然后等待发送完成中断,在 ...

你说的等待发送完成中断,应该是指的DMA发送完成中断吧?我在程序初始化时就初始化了一个较大的发送缓冲区,如果在发送时,这个缓冲区填不满,发送不完全,那这个DMA发送中断是不是就不会触发,所以还是处于发送过程中,无法修改地址和长度?

王昱顺 发表于 2025-2-24 14:39:08

marshallemon 发表于 2025-2-24 14:24
你说的等待发送完成中断,应该是指的DMA发送完成中断吧?我在程序初始化时就初始化了一个较大的发送缓冲 ...

是的,如果你使用的是较大的发送数组,可以尝试环形缓冲填入的方式。
具体为不更改发送长度和地址,在完成发送中断的时候直接再次拉起。
然后通过读取已经发送字节的寄存器获取到当前发送到的位置,在之前位置的数组直接填入数据。即可实现环形数据填入,从而实现无装载等待时间。

marshallemon 发表于 2025-2-24 14:42:58

王昱顺 发表于 2025-2-24 14:39
是的,如果你使用的是较大的发送数组,可以尝试环形缓冲填入的方式。
具体为不更改发送长度和地址,在完 ...

我觉得我可以这样做,在程序初始化时,先不初始化串口发送DMA,在需要发送时再初始化串口发送DMA,指定要发送的缓冲区,和实际的长度,这样串口DMA发送就会触发,从而就可以切换缓冲区

王昱顺 发表于 2025-2-24 15:12:03

marshallemon 发表于 2025-2-24 14:42
我觉得我可以这样做,在程序初始化时,先不初始化串口发送DMA,在需要发送时再初始化串口发送DMA,指定要 ...

可以试一下
页: [1]
查看完整版本: 8A8K64D4串口DMA怎么实现交替发送两个数组?