关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。
/*-------------------------------------- (C) COPYRIGHT 北 ----------------------------------------------
* @文件性质: 应用总结。
* @笔记主题: 关于STM8S003和S103,可能会出现的一直进入串口接收中断子程序问题的处理。
* @文件功能:
* @作者 : bei
* @创建日期: 20160720
* @修改日期:
* @修改记录:
-----------------------------------------------------------------------------------------------------------*/
对STM8S003F3或103系列等单片机,由于与其他单片机不一样,串口接收中断中有OR标志位(UART_SR寄存器中的OR位),即过载错误标志位。
若处理不当,将会导致反复进入串口接收中断。
一般,我们的串口接收中断子程序如下:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
u8 Res;
//读取接收到的数据,当读完数据后自动取消RXNE的中断标志位
Res = UART1_ReceiveData8();
//数据接收过程处理。。。
//清中断。
UART1_ClearITPendingBit(UART1_IT_RXNE);
}
但是对于STM8S003和STM8S103系列,若接收的数据被下个接收到的数据覆盖,会导致过载错误,UART_SR中的OR置位,引起串口中断从而进入中断程序。
所以必须正确地处理该位,否则会出现一直进入中断的问题。如下:
INTERRUPT_HANDLER(UART1_RX_IRQHandler, 18)
{
u8 Res;
//读取接收到的数据,当读完数据后自动取消RXNE的中断标志位
Res = UART1_ReceiveData8();
//数据接收过程处理。。。
//清中断。
UART1_ClearITPendingBit(UART1_IT_RXNE);
//如果发生了过载错误,则清除该中断标志。
if(UART1->SR & UART1_SR_OR)
{
UART1_ClearITPendingBit(UART1_IT_OR);
}
//注意,直接写成 UART1_ClearITPendingBit(UART1_IT_OR); 依然会出现一直进中断的问题。
//我认为是需要先读下UART_SR这个寄存器,然后再清除,这样才能使程序正常。
}
完结。