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