之前遇到奇怪的问题:
串口中断处理函数中加了溢出中断处理:
if(usart_getitstatus(usart1,usart_it_ore) != reset) //产生溢出中断
{
utemp = usart_receivedata(usart1); //扔掉接收的数据
usart_clearitpendingbit(usart1, usart_it_ore); //清溢出中断标志位
}
参考手册isr寄存器:
位 3 ore: 溢出错误
在rxne=1 的的条件下(也就是上次数据还没有读走),串口接收寄存器又接收好
了一个字节的数据并准备往rdr 寄存器去转移的时候,会由硬件将这个位置1。
由软件向usart_icr 寄存器的orecf 位写1,可以清除这个标志。
如果usart_cr1 寄存器中的rxneie 位或eie 位是1,就会产生中断请求。
0: 没有溢出错误
1: 检测到溢出错误
cr1中的rxneie已经使能,实际溢出发生时keil中观察ore的确被置位为1。
然鹅,,,,,,,,
就算ore置位为1,这个if语句也不通过。。。。。
后来网上找到这句话:
“ore中断只能使用usart_getflagstatus(usart1, usart_flag_ore) 读到(没有使能usart_it_err中断时)”
惊奇的发现还有usart_getflagstatus可以用!
usart_getitstatus(usart1,usart_it_ore)这个函数在usart_it_err未使能时并不能正确ore的正确状态!!!!!!
可以使用usart_getflagstatus(usart1,usart_flag_ore)读取,或者初始化时使能usart_it_err。关于usart_it_err在库函数中的定义:
(##) usart_it_err: specifies the interrupt source for error interrupt (frame error, noise error, overrun error)
补充一下这俩函数的区别(看库函数更直接):
it主要就是与中断相关的,检查usart中断产生与否,当usart发送完成后会有usart_it_tc中断,因此可以用来判断,而usart_getflagstatus是usart标志位设置与否,其中就有发送完成标志位usart_flag_tc所以也可用来判断。而最终都是操作isr寄存器
『本文转载自网络,u球体育app下载的版权归原作者所有,如有侵权请联系删除』