打印
[STM32F1]

UART4的异常问题,崩溃了!!

[复制链接]
1972|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
insect2006|  楼主 | 2014-12-10 22:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F105的板子,V3.5的固件库,USART3没有REMAP,USART3和UART4都是查询发送,中断接收。大部分时候都能正常工作,就是UART4偶尔会莫名其妙的死在下面这句代码处:
while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)==RESET);
也就是发送寄存器空标志一直不置位,导致发送程序一直在等待,造成系统假死。我的发送程序如下:

void UART4_SendByte(u8 data)
{
        while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)==RESET);                               
        USART_SendData(UART4,data);
}

中断、时钟、IO口配置都检查过了,没有发现异常,不然UART4一开始也不能正常工作了。
原子进来分析下,是哪里出了问题?不仅仅发生在一块板子上,在其他板子上也有这种现象。只是不容易发生,但是确实会发生。
UART4就是最简单的配置模式,流控什么的都没用,外部接线就TXD和RXD接到RS232芯片上。

如果定位不到故障源,我打算在while(USART_GetFlagStatus(UART4,USART_FLAG_TXE)==RESET)        这句代码后使能定时器计时,超时xms后就重新初始化UART4,不知道这样是否可行?但是想想重新初始化UART4好像也没什么代码,无非就是关中断,关时钟再开时钟,重新配置IO等,不知道这样的初始化有没有效果?


沙发
diweo| | 2014-12-11 11:20 | 只看该作者
我想只要往DR里面写东西,过一会儿‘发送寄存器空标志’肯定会置位的,这是硬件动作。
我的疑问是,你如何确定系统是假死在这一句上? 说不定在很小的几率下,系统假死在HardFault里面呢?因为默认的HardFault处理程序也就一个while(1).
如果确实只是UART4的问题,那么可以尝试:
1,用中断发送
2,开一个定时器进行扫描,这样可以方便的加入超时机制,不要用while了。

使用特权

评论回复
板凳
清风致影| | 2014-12-11 14:11 | 只看该作者
把所有功能屏蔽,只是打开串口4发送 看看是否还有问题

使用特权

评论回复
地板
airwill| | 2014-12-11 16:16 | 只看该作者
这种情况好象不大可能出现,  问一下 UART 的时钟有没有打开, 初始化正常吗, 有没有使能以及允许发送?

使用特权

评论回复
5
insect2006|  楼主 | 2014-12-12 20:09 | 只看该作者
diweo 发表于 2014-12-11 11:20
我想只要往DR里面写东西,过一会儿‘发送寄存器空标志’肯定会置位的,这是硬件动作。
我的疑问是,你如何 ...

按STOP按钮就停在那里了
HardFault里面我有应急处理程序,所以不可能停在那

使用特权

评论回复
6
insect2006|  楼主 | 2014-12-12 20:10 | 只看该作者
airwill 发表于 2014-12-11 16:16
这种情况好象不大可能出现,  问一下 UART 的时钟有没有打开, 初始化正常吗, 有没有使能以及允许发送? ...

以上任何一项不成功的话都会导致一发送就失败
而不是我现在的发个几万帧才导致的现象

使用特权

评论回复
7
insect2006|  楼主 | 2014-12-12 20:11 | 只看该作者
有没有TXD外部线被拉低或者限制在什么电平上导致发送失败?

使用特权

评论回复
8
diweo| | 2014-12-13 09:21 | 只看该作者
insect2006 发表于 2014-12-12 20:11
有没有TXD外部线被拉低或者限制在什么电平上导致发送失败?

外部拉低也最多对方收不到,不应该TXE不置位呀

使用特权

评论回复
9
lzw89| | 2014-12-13 12:31 | 只看该作者
换成USART_FLAG_TC试试。。?

使用特权

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

本版积分规则

25

主题

146

帖子

1

粉丝