STM32F429基於CUBEMX的串口中斷接收

今天要來介紹一下HAL庫的串口中斷使用方法數組

首先打開CUBEMX,新建一個STM32工程,博主創建的是F429工程,而後在圖形界面中打開一個USART,這裏咱們使用USART1。函數

而後進入配置configgurationui

基本的參數都不用修改,在NVIC中,大概中斷使能spa

而後生成工程便可,打開工程文件。這裏要解釋一下串口中斷接收:3d

關於串口接收中斷code

用CUBEMX生成的工程文件中,先開啓接收中斷使能blog

__HAL_UART_ENABLE_IT(uartHandle, UART_IT_RXNE);
而且利用HAL_UART_Receive_IT(uartHandle, &TempChar, 1);ip

這個函數中,第二個和第三個參數能夠修改,分別表明預處字符串和字符串大小。
咱們能夠定義個初始化函數,在進入while(1)以前執行,好比我自定義了一個ITEnable(void);咱們再來看一下這個函數的定義和使用位置:字符串

void ITEnable(void) {
	HAL_TIM_Base_Start_IT(&htim6);
	HAL_TIM_Base_Start_IT(&htim7);
	__HAL_UART_ENABLE_IT(&huart3, UART_IT_RXNE);
	HAL_UART_Receive_IT(&huart3, &TempChar, 1);
 __HAL_UART_ENABLE_IT(&huart1, UART_IT_RXNE); HAL_UART_Receive_IT(&huart1, &TempChar, 1);
}

  能夠看到,在這裏咱們開啓了中斷使能以及說明了接收到的信息存放位置&TempChar, TempChar是咱們聲明的一個全局變量,存放臨時字符。回調函數

/* USER CODE BEGIN 2 */
delay_init(180);
LED_Init();
SDRAM_Init();
LCD_Init();
ESP8266_Init();
ITEnable();
PeriphInit();
LCD_ShowString(30,0,200,24,24,"ShowTimeWalker");
/* USER CODE END 2 */

  

 (上面是我從本身的工程裏面挑選的代碼,你們只須要關注部分代碼)

設置完後,每次接受完一個字符,都會進入中斷服務函數,官方申明的服務函數爲
void USART1_IRQHandler(void)
該函數中只有一個目的,即進入
HAL_UART_IRQHandler(&huart1);
在這個函數中,函數會清除中斷標誌位,禁止使能中斷!!!

而且進入函數UART_Receive_IT(huart);

在這裏,把接收到的那個字符存放在以前HAL_UART_Receive_IT()設定的位置&TempChar,並計數
當計數達到設定值1後,轉入回調函數
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
最終的操做就能夠在回調函數中完成了,博主的處理代碼以下:

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) {
	if (huart->Instance == USART1) {
		if(!END_STA) {
			if (TempChar!=0x0d) {
				Usart_ReceiveBuffer[USART_COUNTER++] = TempChar;
			}
			else {
				Usart_ReceiveBuffer[USART_COUNTER++] = TempChar;
				if (Usart_ReceiveBuffer[USART_COUNTER + 1] == 0)
					END_STA = 1;
			}
		}
		else {
			Usart_ReceiveBuffer[USART_COUNTER++] = TempChar;
			END_STA = 0;
			USART_COUNTER = 0;
			LCD_Fill(0, 120, 479, 149, WHITE);
			memcpy(USART1MESSAGE, Usart_ReceiveBuffer, RX_Length);
			for (int i = 0; i < RX_Length; i++)
				Usart_ReceiveBuffer[i] = 0;
			POINT_COLOR = BLACK;
			LCD_ShowString(30,120,800,24,24,(char*)USART1MESSAGE);
		}
	}
}

  在這以前還要聲明一些全局變量

u8 Usart_ReceiveBuffer[RX_Length] = {0};
u8 USART1MESSAGE[RX_Length] = {0};
u8 USART3MESSAGE[RX_Length] = {0};
u16 USART_COUNTER = 0;
u8 END_STA = 0;
uint8_t TempChar = 0;

因爲已經禁能中斷,因此還要開啓中斷,每完成一次中斷處理後,咱們還要再USART1_IRQHandler中補充一行

HAL_UART_Receive_IT(uartHandle, &TempChar, 1);

在stm32f4xx_it.c裏面找到這個函數,修改成:

void USART1_IRQHandler(void)
{
  HAL_UART_IRQHandler(&huart1);
  HAL_UART_Receive_IT(&huart1, &TempChar, 1);
}

 博主把接收到的信息存放在USART1MESSAGE的字符數組中,而且打印到了RGB顯示屏上,

紅字不用理他,博主是把發送的信息做爲執行命令,好比發送了一個清屏函數LCD_Clear(),STM32會調用USMART組件完成相應的功能,若是不是正確格式,就會提示紅字。

以上即是我對HAL庫串口中斷接收的理解,歡迎你們討論。

相關文章
相關標籤/搜索