實驗室項目需要使用STM32開發(fā),Hal庫的資料相對較少聊训,關(guān)于UART中斷與之前使用飛思卡爾芯片的中斷不同。
首先在CubeMX中配置好UART中斷带斑;重點是:需要在主循環(huán)之前手動開啟接收中斷:
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1);
只有手動開啟之后才能進(jìn)入中斷鼓寺。
此外勋拟,HAL庫中妈候,無論何種類型的UART中斷敢靡,都會進(jìn)入:
void HAL_UART_IRQHandler(UART_HandleTypeDef *huart)
在此函數(shù)中判斷具體是何種中斷苦银,再調(diào)用相應(yīng)的中斷服務(wù)函數(shù)啸胧,接收中斷是:
static HAL_StatusTypeDef UART_Receive_IT(UART_HandleTypeDef *huart)
而此函數(shù)會調(diào)用:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
只需要把相應(yīng)代碼寫到此回調(diào)函數(shù)中即可幔虏。
最需要注意的一點是:
在回調(diào)函數(shù)最后需要再次開啟中斷7哪睢!否則只能執(zhí)行一次O萜住!
/* 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 */
個人理解 這里將中斷服務(wù)設(shè)置為等待模式 等待接收字符瑟蜈。
在Keil中進(jìn)行斷點調(diào)試 發(fā)現(xiàn)接受字符后會首先進(jìn)入
HAL_UART_IRQHandler
函數(shù),而不是直接進(jìn)入 UART_Receive_IT 函數(shù)進(jìn)行處理
相當(dāng)于UART中斷服務(wù)程序有一個統(tǒng)一入口
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, 1) 語句相當(dāng)于打開這個入口踪栋,經(jīng)測試如果去掉這句的話焙格,再發(fā)送字符是不會進(jìn)入HAL_UART_IRQHandler語句的夷都。
剛開始接觸STM32與HAL庫函數(shù)眷唉,理解肯定不是很到位囤官。
參考自:
http://www.eeworld.com.cn/mcu/article_2017092734800.html
http://www.stm32cube.com/article/74