历史上的今天
今天是:2025年06月08日(星期日)
2018年06月08日 | STM32串口接收中断溢出问题解决
2018-06-08 来源:eefocus
在使用一个串口发数据的传感器过程中,发现程序第一次进入串口中断之后不再执行主函数的内容,中断中的内容也不执行。查询大量资料后发现:串口在接收数据过多时,会出现串口溢出错误,并进入溢出中断(ORE中断)。接下来是错误产生原因以及解决方法。
(1)什么是ORE中断?为什么会产生?
产生原因如上所述。
ORE标志位在USART_SR寄存器,但值得注意的是,当我们打开串口接收中断时,同时也就打开了ORE中断。
(2)如何解决?
看了上面的资料之后,我知道程序是死在了串口溢出中断。处理中断时,我首先想到的是清除这个中断标志位,但是遇到了很多麻烦。
清除ORE位的方法:顺序执行对USART_SR和USART_DR寄存器的读操作。
注意:在此使用USART_ClearITPendingBit(USART1, USART_IT_ORE);清除ORE位是没有任何作用的。
还有ORE中断只能使用USART_GetFlagStatus(USART1, USART_FLAG_ORE) 读到(没有使能USART_IT_ERR中断时)
这些都是在这个帖子里读到的http://blog.csdn.net/love_maomao/article/details/8234039帖子还指出了手册的翻译错误,哈哈,很厉害的博主(在此表白)。
最后附上解决方案:
中断服务函数:
if(USART_GetFlagStatus(USART2, USART_FLAG_ORE) != RESET)
{
USART_ClearFlag(USART2, USART_FLAG_ORE); //清除溢出中断
}
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(USART2, USART_IT_RXNE);
//rebuf[num++] = USART_ReceiveData(USART2); 读取串口数据
}
史海拾趣
|
请问大家哈,我用74LS47驱动两个4位数码管,数码管亮度很微弱,我更改为双电源,单独给数码管提供5V电压,但是情况仍没有改变。我一时找不到原因!大家有什么看法没?感谢!!感谢!!感谢!!!… 查看全部问答> |
|
来源:http://pic16.com/bbs/dispbbs.asp?boardID=8&ID=41595&page=4 这里一分钟就让你学会使用PROTEUS(完整版) 近期流感爆发 由于小弟天天沉醉在电脑前忘乎所以 被染病多日随入院治疗 忽有客户来寻 手头一无开发工具 二无相关软件 只有笔记本 ...… 查看全部问答> |
|
小弟用的wince5.0+2440,做了一些扳子后,发现有部分板子运行内存测试程序和串口通信时会死机,但是dnw上有没有任何错误提示信息,只是lcd屏上显示的内容停止了,程序感觉没有运行了,点触摸屏也没有任何反应。请问有没有大哥遇到同样的问题?原因 ...… 查看全部问答> |
|
本人最近在学习单片机,发现很多程序里面都有关于定时器溢出值的设定 例如,在DS18B20温度测量与控制实验中,有这样的程序 TR1=0; //STOP Timer1 TH1=(-SYSCLK/us)>>8; //set Timer1 to overflow in us TL1=-SYSCLK/us; TR1=1; //STAR Ti ...… 查看全部问答> |
|
replyreload += \',\' + 813951;实现功能:创建12-29.txt,写入EEWORD GOOD!,然后在读出来 主代码: int main(void){ //系统时钟 SysCtlClockSet(SYSCTL_SYSDIV_1|SYSCTL_USE_OSC| SYSCTL_OSC_MAIN | &n ...… 查看全部问答> |
|
IBUFG + BUFG的使用方法:IBUFG后面连接BUFG的方法是最基本的全局时钟资源使用方法,由于IBUFG组合BUFG相当于BUFGP,所以在这种使用方法也称为BUFGP方法。 IBUFGDS + BUFG的使用方法:当输入时钟信号为差分信号时,需要使用IBUFGDS代替IBUFG。 ...… 查看全部问答> |




