scutly 发表于 2023-4-17 14:00:25

关于8H8K64U的DMA停止问题

正在尝试做USB-CDC转双串口,参考了“一箭双雕”代码,尝试改成定时器中断+DMA方式,而非轮询。

采用双缓冲切换方式,收发均可用,但是:接收时DMA切换缓冲区,会发生1-5byte的数据丢失。
定时器采用的定时器4,中断优先级与usb中断同为最低。

故想请问一下:是否有任何方式,可以安全地停止DMA,改变地址后重启?

已经尝试:
1.将DMA_UR1R_CR=0,此后读取DMA_UR1R_DONE值常为0,无法获取接收长度;
2.强行更改DMA_UR1R_RXA,此后重新触发DMA(DMA_UR1R_CR = 0xa0,不清除FIFO),仍然丢失数据。

更新地址和重新触发的代码很短,在50个周期以内能够完成,系统主频FOSC=44.2368MHz,波特率115200-921600均可发生。


乘风飞扬 发表于 2023-4-19 11:13:17

将DMA_UR1R_CR=0就能停止DMA接收,主要是停止的时间点能否控制在当前数据已接收完,并且在下一次数据来临之前完成地址切换并重新启动。

scutly 发表于 2023-4-20 00:23:15

加上了定时器中断,判断串口空闲才刷新缓冲区,终于不丢数据了!感谢指点!
页: [1]
查看完整版本: 关于8H8K64U的DMA停止问题