-----------------本文做者“智御电子”,期待与电子爱好者交流学习。----------------函数
在uart应用中有时候须要进行双工通讯,主机须要对从机的数据进行接收超时检测,例如modbus协议,主机在接收从机数据在3.5个字节时间后认为数据包接收完毕。那在这种状况下,通常的作法是设置一个定时器,在每接收到一个字节时清零定时器从新计数,直到定时器超过3.5个字节时间后触发中断即默认数据包接收完毕。oop
以上的定时器设置的超时判断是须要软件介入的。这里STM32的有些串口是提供硬件超时检测功能。这样就省去如上的步骤。学习
本实验是利用CubeMx生成的工程进行验证的。测试
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); }
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); } } }