打印
[STM32F0]

STM32F0的串口可以禁止溢出检测

[复制链接]
1176|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
luge1983|  楼主 | 2017-5-10 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在STM32F103中,使能接收中断也就使能了溢出中断,见
http://mp.weixin.qq.com/s/Qq4x0EmC5wc6RXf1JWbm_Q
当发生溢出时,如果不去读一下接收寄存器RDR,将无法清除溢出错误,串口将不能再接收数据。

想必ST也知道这是个设计bug,在STM32F0系列中,这个设计bug依然存在,但ST设计了另一个机制来避免这个bug:用户可以在配置串口时禁能溢出检测(UART寄存器的CR3有个OVRDIS位,设置为1时禁止溢出检测)!而在STM32F1系列中,UART是没有这个OVRDIS位的。

在不需要检测溢出的场合,直接禁止溢出检测就可以避免溢出导致串口不工作。
沙发
tgwfcc| | 2017-6-19 18:34 | 只看该作者
我看手册上说,如果禁止溢出检测的话,新的数据会把RDR寄存器中原有的数据给覆盖掉,这样就少了一个字节了。

使用特权

评论回复
板凳
tgwfcc| | 2017-6-19 18:46 | 只看该作者
另外,我已经清了USART_ClearFlag(USART1,USART_FLAG_ORE);中断标志,但是仿真的时候该位还是1,不知道咋回事?
if(USART_GetFlagStatus(USART1,USART_FLAG_ORE) != 0)
//if((USART1->ISR & (1<<3)) != 0)               
{
        //USART1->ICR |= 1 << 3;
        USART_ClearFlag(USART1,USART_FLAG_ORE);
        //USART_ReceiveData(USART1);
        //return;
}

//if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//如果寄存器中有数据
if((USART1->ISR & 0x20) != 0)
{

}

使用特权

评论回复
地板
luge1983|  楼主 | 2017-7-11 07:55 | 只看该作者
tgwfcc 发表于 2017-6-19 18:34
我看手册上说,如果禁止溢出检测的话,新的数据会把RDR寄存器中原有的数据给覆盖掉,这样就少了一个字节了 ...

在不需要检测溢出的场合,比如每秒接收一次数据,并且数据丢失几个字节也不要紧,就可以禁用溢出检测了。在老板急着出结果而你被溢出导致串口不工作搞的焦头烂额的时候,可以先把溢出检测禁掉,保证工作进度。

使用特权

评论回复
5
329547875| | 2019-5-23 09:26 | 只看该作者
禁止后能正常工作吗?

使用特权

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

本版积分规则

3

主题

34

帖子

1

粉丝