STM32串口通讯--利用IDLE空闲中断来接收不定长数据

本文介绍了如何利用STM32的IDLE中断来更简单、节省资源地接收串口不定长数据,替代传统的定时器超时方法。在CubeMX中配置串口和中断,然后在中断服务函数中处理RXNE和IDLE中断,实现数据帧的完整接收。注意,这种方法可能不适用于所有兼容产品,如航顺HK32F103,且不同内核清除IDLEIE标志的方法需参照手册。
摘要由CSDN通过智能技术生成

回顾

之前有一篇文章讲过用定时器超时的方式接收不定长数据 定时器超时的方式,串口接收不定长数据 ,但需要占用一个定时器资源,本文采用了另一种方式,即通过IDLE中断的方式来接收,更简单,也更省资源。

原理

IDLE顾名思义,就是空闲的意思,即当监测到串口空闲超过1个数据帧时,会使状态寄存器(SR或ISR)的IDLE位置位,如果此时控制寄存器(CR或CR1)的IDLEIE为1,则会触发IDLE中断。知道原理了,就好操作了。

CubeMX常规操作

1 启动usart1,并开启中断,其他默认

在这里插入图片描述

2 开启调试接口SWD

在这里插入图片描述

3 设置好时钟

在这里插入图片描述

4 代码选项,生成KEIL代码

在这里插入图片描述

手动修改代码

1 在main函数中增加一行,以启动RXNEIE中断,即串口接收中断

main()
...
  HAL_UART_Receive_IT(&huart2, uart2_receive_buf, 1);
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);	//启动RXNE中断
  __HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);	//启动IDLE中断
...
  while (1)

2 在stm32h7xx_it.c,这个中断文件中,修改串口中断函数

u8 uart2_receive_point = 0;
u8 uart2_receive_buf[100];
u8 uart2_receive_over = 0;
u8 uart2_temp;

void USART2_IRQHandler(void)
{
  /* USER CODE BEGIN USART2_IRQn 0 */

  /* USER CODE END USART2_IRQn 0 */

  HAL_UART_IRQHandler(&huart2);

  /* USER CODE BEGIN USART2_IRQn 1 */
  //收到1个字节的数据
  if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_RXNE))
  {
    __HAL_UART_ENABLE_IT(&huart2, UART_IT_RXNE);	//启动RXNE中断
    uart2_receive_buf[uart2_receive_point] = huart2.Instance->RDR;
    uart2_receive_point ++;
  }
  
  //长时间未接收到数据时,会发生IDLE中断,此时意味着数据接收完成
  //不同的内核,清除IDLEIE的方式不同,请查阅手册
  if(__HAL_UART_GET_FLAG(&huart2, UART_FLAG_IDLE))
  {
    huart2.Instance->ICR += USART_ICR_IDLECF;	 //向USART_CR1的IDLECF位写1,以清除IDLEIF标志,否则会一直进IDLEIE中断
    uart2_receive_over = UART_RECEIVE_OK;
  }
  /* USER CODE END USART2_IRQn 1 */
}

兼容性

这个空闲中断,对STM32是OK的,但是对于兼容产品不一定适用,比如航顺HK32F103就亲测不行,需要修改代码。开发人员需要注意这个问题

对于STM32来说,不同的内核,清除IDLEIE标志的方法是不同的,这个需要查阅参考手册。如果不清除该位,会一直进IDLE中断。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值