USART初始化部分就不介紹了,直接看官方給的例程就能知道,現在主要將自己在學習過程中遇到的問題以及解決方法記錄一下。
首先,如果使用了串口接收中斷,就需要在初始化中打開中斷以及設定中斷優先級等常規操作。
HAL_UART_Init(&UartHandle) -> HAL_UART_MspInit(huart)->
/* Set Interrupt Group Priority */
HAL_NVIC_SetPriority(USARTx_IRQn, 0, 1);
/* Enable the TIMx global Interrupt */
HAL_NVIC_EnableIRQ(USARTx_IRQn);
然后需要調用串口接收終端初始化函數:
/**
* @brief Receives an amount of data in non blocking mode
* @param huart: UART handle
* @param pData: Pointer to data buffer
* @param Size: Amount of data to be received
* @retval HAL status
*/
HAL_StatusTypeDef HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
各個參數都有英文解釋。
根據網上資料顯示,這個函數只能對串口中斷接收進行一次接收,而且接收的字節大小是固定的uint16_t Size,但是在實際使用中,不可能完全滿足每次接收到的字節數都是一樣的,而且是確定的。所以大家采用的方法都是令uint16_t Size = 1;這樣的話,每接收到一個字節就中斷一次。
那么中斷處理函數處理的規則應該是
1、關閉此接收中斷
2、將接收到的數據轉移至緩存器
3、再次打開中斷
根據Cube庫函數給的函數以及示例,中斷處理函數是:
void USARTx_IRQHandler(void)
{
HAL_UART_IRQHandler(&UartHandle);
}
其中void USARTx_IRQHandler(void)對應的是不同的中斷處理函數,但是終端中調用的都是HAL_UART_IRQHandler(&UartHandle); 因為HAL_UART_IRQHandler(&UartHandle);函數的參數不同,所以不會產生異常。
大家仔細看HAL_UART_IRQHandler(&UartHandle)這個函數,應該能發現兩個問題:
1、用戶自己的中斷處理函數在哪里不會影響庫函數的完整性
2、中斷如何再次打開
自己是新手,最初急于求成,沒有認真學習函數中每一步,導致自己一直在糾結第一個問題:用戶中斷處理函數放在什么地方不影響庫函數的完整性,后來詳細閱讀了源代碼,發現庫函數提供了一個可供用戶重新定義的弱定義函數__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
可以供用戶重新定義函數內容,用戶直接將自己的中斷緩存數據部分放在此函數中,用戶只需要在stm32f2xx_hal_msp_.c中重新定義此函數即可。
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
UART1RxBuff[UART1RxBuffCount++] = aRxBuffer;
}
同理,用戶可以在
HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
中再次調用
HAL_UART_Receive_IT(UART_HandleTypeDef *huart, uint8_t *pData, uint16_t Size)
這樣的話,就可以實現連續中斷接收USART數據。
而且當需要多個串口中斷接收的時候,上述中斷處理函數如何進行中斷緩存數據,如何區別時哪一個串口發送過來的數據。這里可以利用中斷初始化中的UartHandle.Instance 這個成員變量,加上判斷就能實現串口區別,最后產生的HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)函數應該如下:
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
UART1RxBuff[UART1RxBuffCount++] = aRxBuffer;
}
HAL_UART_Receive_IT(huart, (uint8_t *)&aRxBuffer, 1) ;
}
資料參考了:http://www.stm32cube.com/question/115
謝謝admin的解決,謝謝每一個愿意為想我這樣新手解決問題的人,謝謝每一個愿意幫助別人的人。
所以這里做一個記錄,以幫助那些可能遇到和我一樣問題的人。
上一篇:stm32f7 HAL庫 串口重定向 使用printf
下一篇:STM32 不斷進入串口中斷問題 解決方法
推薦閱讀
史海拾趣