关于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均可发生。
将DMA_UR1R_CR=0就能停止DMA接收,主要是停止的时间点能否控制在当前数据已接收完,并且在下一次数据来临之前完成地址切换并重新启动。 加上了定时器中断,判断串口空闲才刷新缓冲区,终于不丢数据了!感谢指点!
页:
[1]