最近使用STM32F107在進行開發,用CUBEMX配置UART作為序列槽和上位機通訊,然而一直無法接收到資料,調試了一個上午,硬體檢查過,包括重寫RX回調函數都試過了,但就是無法正常接收資料。
之後找了一個重寫回調的函數,移植程式結構,編譯執行發現在執行其中的 HAL_UART_Receive_IT 這一函數後,會能接收一次中斷發出的資料(也就是複位後能進入一次中斷),懷疑是因為HAL的bug或者cubemx生成代碼有bug!進入該函數内部,最後篩選出兩條代碼添加在主函數循環前,以及中斷處理函數末尾,序列槽就能正常進入中斷了。
這兩句為:
__HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR)
__HAL_UART_ENABLE_IT(&huart4,UART_IT_RXNE)
可以看主要隻是第二參數變化,這一宏定義函數主要功能是将中斷控制寄存器置參數二的位置,也就是重置了ERR和RXNE标志位
中斷處理函數的參考代碼:
void UART4_IRQHandler(void)
{
char aRxBuffer[1];
HAL_UART_Transmit(&huart4,"Hello,Enter Interrupt\r\n",26,0xFFFF);
HAL_UART_IRQHandler(&huart4);
/* Enable the UART Error Interrupt: (Frame error, noise error, overrun error) */
__HAL_UART_ENABLE_IT(&huart4, UART_IT_ERR);
/* Enable the UART Data Register not empty Interrupt */
__HAL_UART_ENABLE_IT(&huart4, UART_IT_RXNE);
}