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!)給單片機,單片機能返回數據(后面的***是因為打印了空字節,忽略),則證明有效。