之前遇到古怪的问题:
串口中止处理函数中加了溢出中止处理:
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寄存器
- STM32单片机中文官网
- STM32单片机官方开发工具
- STM32单片机参阅规划