STM32使用CubeMAX配置的序列槽中斷接收方法
目錄
1.定位序列槽中斷發生的地方
2.處理序列槽中斷接收的流程是:
(1)初始化序列槽
(2)在main中第一次調用接收中斷函數(這個也是比較關鍵的)
(3)重寫HAL_UART_RxCpltCallback回調,在回調中處理接收的資料,重點是回調函數中也要調用一次HAL_UART_Receive_IT函數。
STM32使用cubeMAX可以快速建立工程模闆,但是預設使用的是Hal庫構成的工程,對于習慣使用了ST标準庫的同學來說,靈活調用HAL庫可能會比較生疏,我也是這麼覺得的,但是還是要逐漸去接觸學習它,畢竟這個hal庫的封裝還是相當好的,有好多先進的思想和用法。
在學習過程中,我遇到了一個問題,之前也遇到過,但是沒時間去研究,就是序列槽在CUBUMAX上配置好後,如何實作序列槽中斷接收,接下來就來記錄一下我學習到的知識:
1.定位序列槽中斷發生的地方
HAL庫的中斷處理還是和标準庫一樣的,在stm32xxxx_it.c中定義我們定位到如下函數:
HAL_UART_IRQHandler(&huart1);
再往下定位,我們找到
/* UART in mode Receiver ---------------------------------------------------*/
if((tmp_flag != RESET) && (tmp_it_source != RESET))
{
UART_Receive_IT(huart);
}
最後在UART_Receive_IT()函數中能找到序列槽中斷接收的回調函數HAL_UART_RxCpltCallback(huart);
往裡面搜尋,發現這個回調函數是這樣的:
/**
* @brief Rx Transfer completed callbacks.
* @param huart: Pointer to a UART_HandleTypeDef structure that contains
* the configuration information for the specified UART module.
* @retval None
*/
__weak void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(huart);
/* NOTE: This function should not be modified, when the callback is needed,
the HAL_UART_RxCpltCallback can be implemented in the user file
*/
}
你會發現這個回調函數啥也沒幹;後面我搜尋資料知道,這個函數需要使用者自己重寫的,這個比較關鍵;
2.處理序列槽中斷接收的流程是:
(1)初始化序列槽
(2)在main中第一次調用接收中斷函數(這個也是比較關鍵的)
-
(3)重寫HAL_UART_RxCpltCallback回調,在回調中處理接收的資料,重點是回調函數中也要調用一次HAL_UART_Receive_IT函數。
下面貼一下我的回調函數的代碼:
uint8_t aRxBuffer1;//一個位元組的緩沖
int main(void)
{
...
HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1); // Enable the USART1
...
while(1)
{
...
}
}
/* USER CODE BEGIN 4 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == USART1)
{
HAL_UART_Receive_IT(&huart1,&aRxBuffer1,1);
// save char from uart receive
QueueIn(CLI_RX_Buff, aRxBuffer1);//将接收到的資料放到自己的fifo中去
//這裡列印顯示,建議關閉,不然會影響中斷接收,可以考慮用中斷發送
//printf("%c",aRxBuffer1);
}
}
/* USER CODE END 4 */
這些就是所有需要添加的東西了,實作了序列槽中斷接收的功能。
至于如何cubeMAX中配置序列槽,可以參考如下連結,也非常感謝其他部落客的詳細解釋。
參考連結:
http://www.eeworld.com.cn/mcu/article_2018061939840.html
https://www.cnblogs.com/wt88/p/9624115.html