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

Posted sc-electronic

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 硬件UART接收超时检测设置相关的知识,希望对你有一定的参考价值。

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

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

应用场景

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

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

设置步骤

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

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

  • 生成工程后,我们去数据手册,其中有这样的描述。
    技术分享图片
    所以本文添加一个使能超时检测的函数,如下所示
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接收超时检测设置的主要内容,如果未能解决你的问题,请参考以下文章

STM32串口DMA超时接收方法,可大大节约CPU时间

STM32怎么接收不定长串口数据

STM32F103在RX中断时无法通过UART接收数据

stm32 gpio模拟uart通信

STM32串口接收小结

STM32标准库_04 | 串口接收不定长数据