環境:
開發板:STM32F4探索者(正點原子)
一. 空閑(IDLE)中斷
1. 空閑幀
什么是空閑幀?在 STM32的中文參考手冊 中,你會發現如下解釋:
空閑幀可理解為整個幀周期內電平均為“1”(停止位的電平也是“1”),該幀后是下一個數據幀的起始位。如下圖所示:
其實按使用的情況來看,應是數據幀接收之后,從停止位開始一直為高電平,一直持續一幀的時間(包含停止位)為高電平,那時就會產生空閑中斷。
二. 空閑中斷相關的宏
使能 IDLE 中斷
__HAL_UART_ENABLE_IT(__HANDLE__, UART_IT_IDLE) //使能idle中斷
獲取 IDLE 中斷標志位
__HAL_UART_GET_FLAG(__HANDLE__, UART_IT_IDLE)
清除IDLE 掛起標志位
__HAL_UART_CLEAR_IDLEFLAG(__HANDLE__)
三. 空閑中斷使用實例
在上一篇文章(STM32CubeMX之串口使用(中斷方式))的測試代碼的基礎之上進行修改。
在串口中斷處理函數中添加自定義的空閑中斷處理函數 ,如下圖所示:
然后在主函數中,進行自定義空閑中斷處理函數 ,如下
//自定義空閑中斷處理函數
void HAL_UART_IDLE_HANDLER(UART_HandleTypeDef *huart)
{
uint32_t isrflags = READ_REG(huart->Instance->SR);
if((USART_SR_IDLE & isrflags) != RESET && ( huart->RxXferCount > 0))
{
printf("idlern");
__HAL_UART_CLEAR_IDLEFLAG(huart);
/* Disable the UART Data Register not empty Interrupt */
__HAL_UART_DISABLE_IT(huart, UART_IT_RXNE);
/* Disable the UART Parity Error Interrupt */
__HAL_UART_DISABLE_IT(huart, UART_IT_PE);
/* Disable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_DISABLE_IT(huart, UART_IT_ERR);
/* Rx process is completed, restore huart->RxState to Ready */
huart1.RxState = HAL_UART_STATE_READY;
HAL_UART_RxCpltCallback(huart);
}else if((USART_SR_IDLE & isrflags) != RESET && ( huart->RxXferCount == 0 ))
{
__HAL_UART_CLEAR_IDLEFLAG(huart);
}
}
在測試串口的結構中,添加初始化函數用來初始化使能空閑中斷,如下圖
使用初始化函數如下:
用調試助手顯示如下:
上一篇:什么是STM32CubeMX?(STM32代碼生成器)
下一篇:STM32CubeMX之串口使用(中斷方式)
推薦閱讀
史海拾趣