请教 串口DMA 的DMA_GetFlagStatus(DMA1_FLAG_TC1)疑问

版主好。

现在我在测试RS485的ModbusRTU通信时,CH32V203C8T6的串口DMA通信中,用DMA_GetFlagStatus(DMA1_FLAG_TC1)获取串口DMA发送完成状态来切换RS485芯片读写时,发现DMA_GetFlagStatus(DMA1_FLAG_TC1) != RESET的时间并不是DMA发送完成时产生的,而是提前两个字节就产生这个完成TC标志了,这样就会引起RS485芯片被DMA1_FLAG_TC1关闭了后面两个字节没完成发送出去导致通信不正常。以前都是用自动切换读写的RS485都没有发现这个bug....

请问,实际上DMA1_FLAG_TC1这个标志的产生时间到底是不是串口DMA全部发送完成才标志的?如果不是有没有确切的TC触发规则?实在不行只能查询串口空闲状态了。

逻辑分析仪截图如下,通道0是串口发出的数据,通道7是RS485读写(0是读,1是写)。

捕获.PNG

您好,正常情况下DMA通道传输完成才置DMA通道传输完成标志的,你可以检查一下程序中配置的DMA传输大小是否和DMA传输的实际数量大小一致。此外,可在传输完成标志置1后注意清除一下标志位。若方便,可将你的代码发到我的邮箱(lzs@wch.cn)具体看一下。


都有清除标志的,今天测试,发现与主频、串口波特率有很大的影响。

这个是测试程序压缩包。

icon_rar.gifUARTDMATest_CH32V203C8T6.zip



您好,若你需要通过获取串口DMA发送完成的状态来切换RS485芯片读写,建议你可以通过DMA传输完成中断来判断,在DMA传输完成中断函数中置一个标志,当进入传输完成中断,将该标志置1,通过判断该标志切换状态。关于你的代码,这边会具体看一下。若方便,可邮箱(lzs@wch.cn)给我具体介绍一下你的代码逻辑,这边看一下。后续问题沟通可通过邮箱沟通。


不折腾了,搜索了论坛的帖子,发现SPI的DMA同样也会出现这种DMA搬运完成而不是外设传输完成的DMA_FLAG_TC问题。

现在不用DMA了,还是直接用串口空闲中断方便省事。


折腾了一天,绝望了…

不管是DMA中断还是串口中断都不能直接用来切换485,否则会丢失最后一个字节…

找了半天,发现隔壁家STM32就有串口DMA发送时序图,图中DMA的TC确实是提前两个字节就置1了,串口及DMA中断也提前一个字节也置1了…这回非得改板不可了…

675739060.png


今天有时间,重装软件用串口TC中断、用串口TC标志,都能正确的切换485读写功能了...

前些天写程序时,重视发现Tab键无法用空格替换,今天就重装了软件,然后原先不行的现在都没问题了。

前面不行的原因,一个是软件可能有问题,一个可能是用 If(Var == USART1)这种结构体作为判断非法以至于后面的程序执行就出问题了。

现在都是直接用 指针数组 来切换参数而不是用结构体切换参数,感觉立刻正常了。可以不用改板了顿时轻松了。

捕获.PNG



只有登录才能回复,可以选择微信账号登录