STM32 硬件UART接收超时检测设置

时间:2024-03-28 11:35:09

STM32 硬件UART接收超时检测设置

-----------------本文作者“智御电子”,期待与电子爱好者交流学习。----------------

应用场景

在uart应用中有时候需要进行双工通信,主机需要对从机的数据进行接收超时检测,例如modbus协议,主机在接收从机数据在3.5个字节时间后认为数据包接收完毕。那在这种情况下,一般的做法是设置一个定时器,在每接收到一个字节时清零定时器重新计数,直到定时器超过3.5个字节时间后触发中断即默认数据包接收完毕。

以上的定时器设置的超时判断是需要软件介入的。这里STM32的有些串口是提供硬件超时检测功能。这样就省去如上的步骤。

设置步骤

本实验是利用CubeMx生成的工程进行验证的。

  • 首先,利用cubemx配置usart1(注意:并不是每个STM32芯片的串口都具有硬件超时检测功能的)。值得注意的是在cubeMX中并没有设置硬件超时的选项,所以这里只是生产可用的usart工程。

  • STM32 硬件UART接收超时检测设置

  • 生成工程后,我们去数据手册,其中有这样的描述。
    STM32 硬件UART接收超时检测设置
    所以本文添加一个使能超时检测的函数,如下所示

void Uart_RxOvertimeEnable(void)
{
	/*使能接收超时功能*/
	SET_BIT(huart1.Instance->CR2,USART_CR2_RTOEN);
	/*使能超时接收中断*/
	//SET_BIT(huart1.Instance->CR1,USART_CR1_RTOIE);
	/*向RTOR寄存器填入需要超时的长度,单位为一个波特时长,3.5个字节*11波特长度 = 39  */
	WRITE_REG(huart1.Instance->RTOR,39);  
}
  • 接着在main函数中添加这个函数,并且写了一个小小的测试实例。

int main(void)
{

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
  /* Configure the system clock */
  SystemClock_Config();
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();

  /*使能超时检测*/
  Uart_RxOvertimeEnable();
  /* Infinite loop */
  /*采用中断接收数据,模拟接收*/
  HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 100);
  while (1)
  {	
	//数据接收后,一直等待超时
   while(READ_BIT(huart1.Instance->ISR,USART_ISR_RTOF))
	{ 
		/*清除rtof标志*/
		 SET_BIT(huart1.Instance->ICR,USART_ICR_RTOCF);
		/*将接收的数据发送出去测试一下*/
	   HAL_UART_Transmit_IT(&huart1, (uint8_t *)aRxBuffer, 100);
	   HAL_Delay(1000);
	}		
  }
}

  • 最后通过串口调试助手通过上位机发送数据(this is test!)给单片机,单片机能返回数据(后面的***是因为打印了空字节,忽略),则证明有效。
    STM32 硬件UART接收超时检测设置