天天看點

解決CUBEMX配置生成的UART無法進入中斷的問題

最近使用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);


}
           

繼續閱讀