欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)

程序员文章站 2022-07-04 19:38:11
...

概述

​ 上一篇讲了用串口中断的方式接收数据,但是它有两个缺点

  1. 只能定长接收数据

  2. 如果数据超出,那么产生溢出中断,那时发送的数据将不再接收

    所以接下来就会用 IDLE 中断来解决这个问题


环境:

  • 开发板:STM32F4探索者(正点原子)

一. 空闲(IDLE)中断

1. 空闲帧

​ 什么是空闲帧?在 STM32的中文参考手册 中,你会发现如下解释:

​ 空闲帧可理解为整个帧周期内电平均为“1”(停止位的电平也是“1”),该帧后是下一个数据帧的起始位。如下图所示:

STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)

​ 其实按使用的情况来看,应是数据帧接收之后,从停止位开始一直为高电平,一直持续一帧的时间(包含停止位)为高电平,那时就会产生空闲中断。

二. 空闲中断相关的宏

  • 使能 IDLE 中断

    __HAL_UART_ENABLE_IT(__HANDLE__, UART_IT_IDLE)    //使能idle中断
    
  • 获取 IDLE 中断标志位

    __HAL_UART_GET_FLAG(__HANDLE__, UART_IT_IDLE)
    
  • 清除IDLE 挂起标志位

    __HAL_UART_CLEAR_IDLEFLAG(__HANDLE__) 
    

三. 空闲中断使用实例

​ 在上一篇文章(STM32CubeMX之串口使用(中断方式))的测试代码的基础之上进行修改。

​ 在串口中断处理函数中添加自定义的空闲中断处理函数 ,如下图所示:

STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)

然后在主函数中,进行自定义空闲中断处理函数 ,如下

//自定义空闲中断处理函数
void HAL_UART_IDLE_HANDLER(UART_HandleTypeDef *huart)
{
   uint32_t isrflags   =  READ_REG(huart->Instance->SR); 
   if((USART_SR_IDLE & isrflags) != RESET && ( huart->RxXferCount > 0))
   {
       printf("idle\r\n");
       __HAL_UART_CLEAR_IDLEFLAG(huart);
      /* Disable the UART Data Register not empty Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
      /* Disable the UART Parity Error Interrupt */
      __HAL_UART_DISABLE_IT(huart, UART_IT_PE);
      /* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
      __HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
      /* Rx process is completed, restore huart->RxState to Ready */
      huart1.RxState = HAL_UART_STATE_READY;  
      HAL_UART_RxCpltCallback(huart); 
   }else if((USART_SR_IDLE & isrflags) != RESET && ( huart->RxXferCount == 0 ))
   { 
       __HAL_UART_CLEAR_IDLEFLAG(huart);
      
   } 
}

在测试串口的结构中,添加初始化函数用来初始化使能空闲中断,如下图

STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)

使用初始化函数如下:

STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)

用调试助手显示如下:

STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)

测试代码已上传,欢迎下载。

​后续还会继续分享串口的其他基础知识和使用,感兴趣的小伙伴记得关注我
-----------------------------------------------结束--------------------------------------------------------
文章有价值,请各位看官点个赞关注我或者点右边打个赏