本文共 1759 字,大约阅读时间需要 5 分钟。
上一篇讲了用串口中断的方式接收数据,但是它有两个缺点
只能定长接收数据
如果数据超出,那么产生溢出中断,那时发送的数据将不再接收
所以接下来就会用 IDLE
中断来解决这个问题
什么是空闲帧?在 STM32的中文参考手册 中,你会发现如下解释:
空闲帧可理解为整个帧周期内电平均为“1”(停止位的电平也是“1”),该帧后是下一个数据帧的起始位。如下图所示:
其实按使用的情况来看,应是数据帧接收之后,从停止位开始一直为高电平,一直持续一帧的时间(包含停止位)为高电平,那时就会产生空闲中断。
使能 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之串口使用(中断方式))的测试代码的基础之上进行修改。
在串口中断处理函数中添加自定义的空闲中断处理函数 ,如下图所示:
然后在主函数中,进行自定义空闲中断处理函数 ,如下
//自定义空闲中断处理函数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); } }
在测试串口的结构中,添加初始化函数用来初始化使能空闲中断,如下图
使用初始化函数如下:
用调试助手显示如下:
测试代码已上传,欢迎下载。
后续还会继续分享串口的其他基础知识和使用,感兴趣的小伙伴记得关注我!
-----------------------------------------------结束-------------------------------------------------------- 文章有价值,请各位看官点个赞,关注我或者点右边打个赏吧转载地址:http://pumvn.baihongyu.com/