實驗室項目需要使用STM32開發(fā),Hal庫的資料相對較少,關于UART中斷與之前使用飛思卡爾芯片的中斷不同。
首先在CubeMX中配置好UART中斷;重點是:需要在主循環(huán)之前手動開啟接收中斷:
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);
只有手動開啟之后才能進入中斷。
此外,HAL庫中,無論何種類型的UART中斷,都會進入:
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
在此函數(shù)中判斷具體是何種中斷,再調(diào)用相應的中斷服務函數(shù),接收中斷是:
static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
而此函數(shù)會調(diào)用:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
只需要把相應代碼寫到此回調(diào)函數(shù)中即可。
最需要注意的一點是:
在回調(diào)函數(shù)最后需要再次開啟中斷??!否則只能執(zhí)行一次??!
/* USER CODE BEGIN 4 */
/**
* @brief Rx Transfer completed callbacks
* @param huart: uart handle
* @retval None
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
/* NOTE : This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file
*/
HAL_UART_Transmit(&huart1, (uint8_t *)aRxBuffer, 1,0xFFFF);
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);
}
/* USER CODE END 4 */
個人理解 這里將中斷服務設置為等待模式 等待接收字符。
在Keil中進行斷點調(diào)試 發(fā)現(xiàn)接受字符后會首先進入
HAL_UART_IRQHandler
函數(shù),而不是直接進入 UART_Receive_IT 函數(shù)進行處理
相當于UART中斷服務程序有一個統(tǒng)一入口
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1) 語句相當于打開這個入口,經(jīng)測試如果去掉這句的話,再發(fā)送字符是不會進入HAL_UART_IRQHandler語句的。
剛開始接觸STM32與HAL庫函數(shù),理解肯定不是很到位。
參考自:
http://www.eeworld.com.cn/mcu/article_2017092734800.html
http://www.stm32cube.com/article/74