天天看點

STM32使用CubeMAX配置的序列槽中斷接收方法STM32使用CubeMAX配置的序列槽中斷接收方法1.定位序列槽中斷發生的地方2.處理序列槽中斷接收的流程是:

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

繼續閱讀