如何通过配置串口的接收作为中断源

描述

使用中断

  • 通过配置串口的接收作为中断源,开启中断输出控制,配置NVIC。开启中断通道。
//开启中断输出控制
  USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
  
  //配置NVIC
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
  NVIC_InitTypeDef NVIC_InitStruct;
  NVIC_InitStruct.NVIC_IRQChannel=USART2_IRQn;   //选择USART2的中断通道
  NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;    //中断使能
  NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;
  NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;
  NVIC_Init(&NVIC_InitStruct);
  • 中断服务子函数

中断服务子函数写好后,就可以在中断里读取接收到的数据了。

当接收到数据后,触发接收中断,主程序暂停执行。接收完数据后主程序回复执行。当接收到数据时,就触发中断。

void USART2_IRQHandler(void)
{
  if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)   //RXNE 标志位为1 表示可以接收数据
  {
    RX_Data=USART_ReceiveData(USART2);
    Flag=1;
    USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除RXNE标志位
  }
}
  • 主程序测试
uint8_t RX_Data;
uint8_t Flag;


int main()
{
    Serial_Init();
    Serial_SendByte(0x16);




    while(1)
    {
        if(Flag==1)
        {
            Serial_SendByte(RX_Data);
        }
    }
}


void USART2_IRQHandler(void)
{
    if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)   //RXNE 标志位为1 表示可以接收数据
    {
        RX_Data=USART_ReceiveData(USART2);
        Flag=1;
        USART_ClearITPendingBit(USART2,USART_IT_RXNE);  //清除RXNE标志位
    }
}

下图为程序现象:可以看到,串口确实收到了数据,只是我把接收到的数据0xFE放在了while循环里,这说明数据接收是成功的,使用中断是可行的。

串口通信

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分