STM32
直播中

刘浩

7年用户 1128经验值
私信 关注
[问答]

如何利用CubeMx生成的工程去检测STM32定时器设置的超时呢

如何利用CubeMx生成的工程去检测STM32定时器设置的超时呢?有哪些设置步骤?

回帖(1)

孙伟

2021-12-9 14:41:39
  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!)给单片机,单片机能返回数据(后面的***是因为打印了空字节,忽略),则证明有效。
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分