-----------------本文做者「智御電子」,期待與電子愛好者交流學習。----------------函數
在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); } } }