STM32103 USART DMA发送完成判断方法分享

2019-12-14 13:33发布

<i class="pstatus"> 本帖最后由 shuen729 于 2018-4-28 11:57 编辑 </i><br> <br><p> 今天调代码的时候,遇到这个问题,USART在DMA模式下,进DMA发送完成中断后发现数据其实USART那边还没有真正的完成发送,论坛里面搜“DMA 发送完成”有一篇帖子,但是很遗憾不让看,要密码。</p><br><p> 然后不得已,看参考手册,找到下面的时序图</p><br> <p><img src="https://www.xiaopingtou.net/data/attach/1912/s7logd01cd1ixh2sli8xicabop2ykx9w.jpg" lazyloadthumb="1" border="0" alt=""></p><br><p> 然后在中断里面改了下,先把DMA禁止掉,然后等待TC置位,TC置位就可以确认所有数据已经送出。</p><br><p> void DMA1_Channel7_IRQHandler(void)</p><br><p> {</p><br><p> &nbsp; &nbsp; if(SET==DMA_GetITStatus(DMA1_IT_TC7))</p><br><p> &nbsp; &nbsp; {</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;DMA_ClearITPendingBit(DMA1_IT_TC7);</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;DMA_Cmd(DMA_USART2_TX, DISABLE);</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;DMA_USART2_TX-&gt;CNDTR = 0;</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC))</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;{</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;USART_ClearFlag(USART2,USART_FLAG_TC);</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;}</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;Usart2_TR_Sw(RS485_RX);</p><br><p> &nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;return ;</p><br><p> &nbsp; &nbsp; }</p><br><p> }</p> <br> <p><img src="https://image.xiaopingtou.net/data/attach/191214/zbahRxQ9.png" alt="135857g95xy0xgxfpkfxmm"><br></p><p><br></p>
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
58条回答
sleet1986
1楼-- · 2019-12-16 13:08
空闲中断应该可以的
shuen729
2楼-- · 2019-12-16 18:54
freemay 发表于 2018-5-2 09:56
IDLE中断可以。

接收我是用的idle,发送还没有试过。
右手戒指01
3楼-- · 2019-12-16 23:41
shuen729 发表于 2018-5-2 08:31
但是,最好不要在中断里面等待,等待的时间差不多2ms多,时间太长了,做验证可以,做产品不行。 ...

好的,谢谢楼主分享
huangqi412
4楼-- · 2019-12-17 02:50
 精彩回答 2  元偷偷看……
wuzhujian
5楼-- · 2019-12-17 07:24
485通信,从DMA中断中尽快退出来,在非中断状态中,查询TC标志,再切换接收状态。
这是比较正统的做法。

还有一种方法是:(本论坛中可以查到电路图)
从硬件着手,485通信的接收与发送状态切换,不需要CPU的引脚干预,编程省心。
那个电路我测试过,某宝0.2x元1片的MAX3485芯片,最高速率256K,短距通信无误码。
zchong
6楼-- · 2019-12-17 09:36
开启TC中断,DMA传输完成(移位寄存器全部移出)前TC不会置位,当所有数据从串口的管脚移出后TC才会置位,这时候产生中断,在TC中断中可以设置数据发送完成标志、设置RS485方向控制,几乎是完美的方案。

一周热门 更多>