你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
lucky67 提问时间:2017-1-2 13:53 /
2ST金币
程序如下:
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);这一句的话,就一直不断发送字符串。

收藏 1 评论6 发布时间:2017-1-2 13:53

举报

6个回答
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; 这个应去掉
}

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

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)
{
  

刚才试了下,还是不行。只反应一次。
222.jpg 111.jpg
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[ubRxIndex++] = 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[ubTxIndex++]);
    }
    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
多看官方的例程,最好用官方的例程改。

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2

查看全部评分

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版