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条回答
shuen729
1楼-- · 2019-12-14 15:08
void DMA1_Channel7_IRQHandler(void)
{
    if(SET==DMA_GetITStatus(DMA1_IT_TC7))
    {
        DMA_ClearITPendingBit(DMA1_IT_TC7);
        DMA_Cmd(DMA_USART2_TX, DISABLE);
        DMA_USART2_TX->CNDTR = 0;
        while(RESET == USART_GetFlagStatus(USART2,USART_FLAG_TC))
            {
            ;
            }
        USART_ClearFlag(USART2,USART_FLAG_TC);
        Usart2_TR_Sw(RS485_RX);
        return ;
    }
}
zhongsandaoren
2楼-- · 2019-12-14 17:39
 精彩回答 2  元偷偷看……
lyg407
3楼-- · 2019-12-14 17:39

  1.                         if(DMA_GetCurrDataCounter(DMA1_Channel4)==0) //返回当前DMA通道x剩余的待传输数据数目
  2.                         {
  3.                                 /* 关闭DMA传输 */
  4.                                 DMA_Cmd(DMA1_Channel7, DISABLE);
  5.                                
  6.                                 DMA1_Channel7->CNDTR =  USART2_tx_buf_size_DEF;   //重新设定传输数据个数  
  7.                                
  8.                                 DMA_Cmd(USART2_Tx_DMA_Channel_DEF, ENABLE);         //使能DMA channel x          再次发送
  9.                         }
复制代码



这段程序是我花了10分钟左右找到的。

电脑没找到,又到云盘,下载了2014年 2013年的备份文件找出来的。。。
shuen729
4楼-- · 2019-12-14 21:06
zhongsandaoren 发表于 2018-4-27 15:16
一般都是送出就不管了

半双工的就要管,比如485
shuen729
5楼-- · 2019-12-14 21:30
lyg407 发表于 2018-4-27 16:14
这段程序是我花了10分钟左右找到的。

电脑没找到,又到云盘,下载了2014年 2013年的备份文件找出来的 ...

这个只是DMA侧的数据吧,这个值为0的时候,实际上还有两个字节的数据还没有从串口送出去。
cht-rtos
6楼-- · 2019-12-14 22:27
可以开tc中断来判

一周热门 更多>