STM32CubeMX之串口不定长数据接收(接收中断+空闲中断)
程序员文章站
2022-07-04 19:38:11
...
概述
上一篇讲了用串口中断的方式接收数据,但是它有两个缺点
-
只能定长接收数据
-
如果数据超出,那么产生溢出中断,那时发送的数据将不再接收
所以接下来就会用
IDLE
中断来解决这个问题
环境:
- 开发板:STM32F4探索者(正点原子)
一. 空闲(IDLE)中断
1. 空闲帧
什么是空闲帧?在 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);
}
}
在测试串口的结构中,添加初始化函数用来初始化使能空闲中断,如下图
使用初始化函数如下:
用调试助手显示如下:
测试代码已上传,欢迎下载。
后续还会继续分享串口的其他基础知识和使用,感兴趣的小伙伴记得关注我!
-----------------------------------------------结束--------------------------------------------------------
文章有价值,请各位看官点个赞,关注我或者点右边打个赏吧