概述
上一篇講了用序列槽中斷的方式接收資料,但是它有兩個缺點
- 隻能定長接收資料
-
如果資料超出,那麼産生溢出中斷,那時發送的資料将不再接收
是以接下來就會用
中斷來解決這個問題IDLE
文章目錄
-
-
- 概述
- 一. 空閑(IDLE)中斷
-
- 1. 空閑幀
- 二. 空閑中斷相關的宏
- 三. 空閑中斷使用執行個體
-
環境:
- 開發闆:STM32F4探索者(正點原子)
一. 空閑(IDLE)中斷
1. 空閑幀
什麼是空閑幀?在 STM32的中文參考手冊 中,你會發現如下解釋:
空閑幀可了解為整個幀周期内電平均為“1”(停止位的電平也是“1”),該幀後是下一個資料幀的起始位。如下圖所示:
其實按使用的情況來看,應是資料幀接收之後,從停止位開始一直為高電平,一直持續一幀的時間(包含停止位)為高電平,那時就會産生空閑中斷。
二. 空閑中斷相關的宏
- 使能
中斷IDLE
- 擷取
中斷标志位IDLE
- 清除
挂起标志位IDLE
三. 空閑中斷使用執行個體
在上一篇文章(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("idle\r\n");
__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);
}
}
在測試序列槽的結構中,添加初始化函數用來初始化使能空閑中斷,如下圖
使用初始化函數如下:
用調試助手顯示如下:
測試代碼已上傳,歡迎下載下傳。
後續還會繼續分享序列槽的其他基礎知識和使用,感興趣的小夥伴記得關注我!
-----------------------------------------------結束--------------------------------------------------------
文章有價值,請各位看官點個贊,關注我或者點右邊打個賞吧