打印

STM32 USART DMA问题请教

[复制链接]
4844|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xuannin|  楼主 | 2010-7-10 08:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
串口数据通过DMA发送是没有问题的,串口调试工具可以读出完整的数据,关键问题我的外部接口是RS485,在发送完成之后要马上将RS485转为输入状态,于是我设置DMA传输完成后中断,在中断中将RS485转为输出,发现这样不行,DMA传输完成之后串口数据并未完成,导致最后两字节无法从RS485传出,手册上说“监视USART_SR寄存器的TC标志可以确认USART通信是否结束”,但是如果在DMA中断中等那么长时间显然是不合适的,在主循环中则有可能漏掉从机从RS485返回的数据,该怎么搞?
沙发
xuannin|  楼主 | 2010-7-10 09:13 | 只看该作者
问题我解决了,在DMA完成中断中打开USART发送完成中断,在发送完成中断中改变RS485为接收状态,不过这样绕了一个圈,不爽啊。

使用特权

评论回复
板凳
香水城| | 2010-7-10 10:45 | 只看该作者
实现你的目标是最重要的,不要怕绕路,:lol

再说,按照楼主位描述的方法,你最多在DMA中断中等待小于发送一个字节的时间,如果你的USART速率足够快,这个时间是很短的。而且,发送还没有完成,从机不可能传送数据,怎么可能漏掉从机从RS485返回的数据呢?

使用特权

评论回复
地板
giema| | 2014-7-21 21:28 | 只看该作者
我也是这么弄的,为啥每次发送都少两个字节数据呢?

使用特权

评论回复
5
giema| | 2014-7-21 21:32 | 只看该作者
香水城 发表于 2010-7-10 10:45
实现你的目标是最重要的,不要怕绕路,

再说,按照楼主位描述的方法,你最多在DMA中断中等待小于发送 ...

我也是这么弄的,不知道为啥少两个字节数据。
/******************************************************************************/
/*      串口中断                                                              */
/******************************************************************************/

void USART1_IRQHandler(void)
{
        //发送中断处理                        干两件事 1 关闭发送,2关闭发送中断
        if(USART_GetITStatus(USART1, USART_IT_TC) != RESET)
        {
           USART_ClearITPendingBit(USART1,  USART_IT_TC);  //清除中断标志
           NVIC_ClearPendingIRQ(USART1_IRQn);//清除中断标志

                USART_ITConfig(USART1, USART_IT_TC, DISABLE);        //关闭发送完成中断
                UART1TXDISENABLE ;// 关掉发送使能 管脚。
        }         
         
}

void DMA1_Channel4_IRQHandler(void)
{       
//判断是否为DMA发送完成中断
   if(DMA_GetFlagStatus(DMA1_FLAG_TC4)==SET)
   {  
   //完成中断里面先打开串口发送中断
           USART_ITConfig(USART1, USART_IT_TC, ENABLE);        //打开发送完成中断         
        DMA_ClearFlag(DMA1_FLAG_TC4);
        }       
}

使用特权

评论回复
6
香水城| | 2014-7-22 17:44 | 只看该作者
giema 发表于 2014-7-21 21:32
我也是这么弄的,不知道为啥少两个字节数据。
/****************************************************** ...

最简单的调试方法就是:

拉示波器看USART线上的数据传输波形,然后在你的两个中断那里用某个空闲GPIO 翻转一下,然后也在示波器上看翻转的时刻,从而看得出来,对应中断产生的时间和数据传输的关系。

使用特权

评论回复
7
香水城| | 2014-7-22 17:49 | 只看该作者
而且,在F0及后续出来的芯片(F3 L0),在USART模块里都添加了硬件的RS485驱动使能信号。

使用特权

评论回复
8
zchong| | 2014-8-25 20:44 | 只看该作者
根据手册,用串口的TC标志就可以完美解决,使用DMA发送的时候,顺便打开串口的发送TC中断,在这个中断中控制485方向即可。

使用特权

评论回复
9
njchenmin| | 2014-11-22 07:42 | 只看该作者
zchong 发表于 2014-8-25 20:44
根据手册,用串口的TC标志就可以完美解决,使用DMA发送的时候,顺便打开串口的发送TC中断,在这个中断中控 ...

这个方法不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

174

帖子

3

粉丝