lucky67 发表于 2017-1-2 13:53:19

请问STM8S105串口中断无法跳出来是什么原因

程序如下:
int main(void)
{
CLK_DeInit();                                    //--> 时钟各变量初始化
CLK_HSECmd(ENABLE);                              //--> 外部高速晶振使能
while(SET != CLK_GetFlagStatus(CLK_FLAG_HSERDY)); //--> 测试外部高速晶振位是不是使能
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);         //--> 外部时钟预分频器,1分频
CLK_ClockSwitchCmd(ENABLE);                        //--> 使能时钟切换功能
CLK_ClockSwitchConfig(CLK_SWITCHMODE_AUTO,CLK_SOURCE_HSE,DISABLE,CLK_CURRENTCLOCKSTATE_DISABLE);
                                                      //--> 时钟切换 ( 自动切换模式 , 切换到外部高速晶振 , 禁止切换中断 ,内部时钟禁止 )   
USART_Configuration();//串口配置
enableInterrupts();//允许中断
while (1)
{
    delay(100);
}
}

//串口接收中断
#pragma vector=0x17
__interrupt void UART2_RX_IRQHandler(void)
{

if(UART2_GetFlagStatus(UART2_FLAG_RXNE)!=RESET){
    UART_Send( "REC OK2\n\r", 8);
}
UART2_ClearITPendingBit(UART2_IT_RXNE);//清除接收标志位
return;
}

运行后,电脑往STM8S105发送命令后,串口接收中断能正常反应,并发回响应字符。但是只能反应一次。接下来就没反应了。加了断点观察发现,程序还一直在串口接收中断里面运行。但因为RXNE被清零了,所以虽然没有内容发出,实际上还是在中断里面运行。请问这是什么原因?如果不加UART2_ClearITPendingBit(UART2_IT_RXNE);这一句的话,就一直不断发送字符串。

wenyangzeng 发表于 2017-1-2 16:09:52

本帖最后由 wenyangzeng 于 2017-1-2 16:11 编辑

__interrupt void UART2_RX_IRQHandler(void)
{

if(UART2_GetFlagStatus(UART2_FLAG_RXNE)!=RESET)
{
UART2_ClearITPendingBit(UART2_IT_RXNE);    //清除接收标志位应该放在这里
   UART_Send( "REC OK2\n\r", 8);               //你在接收中断中发送。有点不合理。至少要禁止接收中断
}
   //return; 这个应去掉
}

jackten 发表于 2017-1-2 18:17:40

楼上厉害                     

lucky67 发表于 2017-1-2 18:43:16

wenyangzeng 发表于 2017-1-2 16:09
__interrupt void UART2_RX_IRQHandler(void)
{



刚才试了下,还是不行。只反应一次。

wenyangzeng 发表于 2017-1-2 18:54:57

lucky67 发表于 2017-1-2 18:43
刚才试了下,还是不行。只反应一次。

这是ST 官方的中断代码:
void USARTx_IRQHandler(void)
{
/* USART in Receiver mode */
if (USART_GetITStatus(USARTx, USART_IT_RXNE) == SET)
{
    if (ubRxIndex < BUFFERSIZE)
    {
      /* Receive Transaction data */
      aRxBuffer = USART_ReceiveData(USARTx);
    }
    else
    {
      /* Disable the Rx buffer not empty interrupt */
      USART_ITConfig(USARTx, USART_IT_RXNE, DISABLE);
    }
}
/* USART in Tramitter mode */
if (USART_GetITStatus(USARTx, USART_IT_TXE) == SET)
{
    if (ubTxIndex < BUFFERSIZE)
    {
      /* Send Transaction data */
      USART_SendData(USARTx, aTxBuffer);
    }
    else
    {
      /* Disable the Tx buffer empty interrupt */
      USART_ITConfig(USARTx, USART_IT_TXE, DISABLE);
    }
}
}

lucky67 发表于 2017-1-2 19:44:04

谢谢,我再研究一下。

五哥1 发表于 2017-1-2 19:48:53

多看官方的例程,最好用官方的例程改。
页: [1]
查看完整版本: 请问STM8S105串口中断无法跳出来是什么原因