我在别处看到的程序 ,求各位高手给解答下 红字部分,为什么要清除挂起位,溢出是怎么回事,为什么要清除标志位,红字部分用寄存器如何操作
void USART3_IRQHandler(void)
{
if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
{
usart3_receive_process_event(USART_ReceiveData(USART3));
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
}
//溢出-如果发生溢出需要先读SR,再读DR寄存器则可清除不断入中断的问题[牛人说要这样]
if(USART_GetFlagStatus(USART3,USART_FLAG_ORE) == SET)
{
usart3_receive_process_event(USART_ReceiveData(USART3));
USART_ClearFlag(USART3,USART_FLAG_ORE);
}
}
还有就是 原子哥的串口中断是这么写的,这里边为什么没有这么啰嗦呢,也没清除挂起位,标志位
void USART1_IRQHandler(void)
{
u8 res;
if(USART1->SR&(1<<5))//接收到数据
{
res=USART1->DR;
if((USART_RX_STA&0x80)==0)//接收未完成
{
if(USART_RX_STA&0x40)//接收到了0x0d
{
if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
else USART_RX_STA|=0x80; //接收完成了
}else //还没收到0X0D
{
if(res==0x0d)USART_RX_STA|=0x40;
else
{
USART_RX_BUF[USART_RX_STA&0X3F]=res;
USART_RX_STA++;
if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收
}
}
}
}
}
|