STM32 HAL庫多串口中斷通訊【任意長度 不丟幀】

基於HAL庫的多串口通信入門,多串口中斷通信,可以發任意字節數據,用的STM32F302CBTx,STM32F103也一樣通用。

本例使用三組串口中斷互相通信。

1、背景瞭解和工具

現在開發stm32一般有幾種方式,如下

HAL庫開發:

STM32CubeMX中可以下載各個stm系列的HAL庫,集成stm常見的外設,便於一鍵生成項目代碼。STM32CubeMX是ST公司現在主推的一個配置工具,可以下載HAL庫,直接由圖形界面簡單配置下,生成初始化代碼,並對外設做了進一步的抽象,方便快捷,但出問題時,不熟悉的情況下容易無從下手。

標準外設庫(STD)開發:

是對STM32芯片的一個完整的封裝,包括所有標準器件外設的器件驅動器。一般每個系列的標準庫都是不一樣的,所以沒有可移植性。

寄存器開發:

直接操作寄存器,不使用stm官方的庫,容易操作,但對寄存器操作要比較熟悉。

2、工具下載安裝

STM32CubeMX,本人用的5.2版

官方鏈接https://www.st.com/en/development-tools/stm32cubemx.html,官方沒有的話後面有下載地址

Keil5,用來編譯STM32CubeMX生成的工程項目

兩個工具包下載 鏈接:https://pan.baidu.com/s/1IFu5eLlBD31gcEenxwt37Q  提取碼:p04j 

下載後自行安裝,STM32CubeMX運行需要安裝JAVA運行環境,直接百度安裝java環境

 

3、STM32CubeMX設置

打開,下載stm32f302cbtx庫,步驟如下

 

4、建立工程

依次打開 File > New Project,此時會自動彈出下載選型的的界面,下好後,選STM32F302CB雙擊確定進入工程界面

1)配置晶振和配置時鐘

 

2)配置串口usart1、usart2、usart3

波特率115200,使能中斷,使能中斷優先級,三組串口都要配置,再檢查下串口時鐘,串口引腳可以看右邊的芯片圖,也可以自定義

 

 

3)生成項目

設置項目名,保存路徑,生成項目後的編譯工具(MDK-ARM V5就是ARM版Keil5),編譯的默認庫,再點generate code

 

5、Keil5編譯工程項目

1)添加使能串口的函數,添加三組串口自發自收的函數,注意在USER CODE BEGIN和END之間,否則再次編譯cubemx時會被覆蓋,編譯

main函數外代碼如下

/* USER CODE BEGIN 0 */
uint8_t Uart1RX_Data,Uart2RX_Data,Uart3RX_Data;

void USART_IT_Start(void)
{
	HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1);
	HAL_UART_Receive_IT(&huart2,&Uart2RX_Data,1);
	HAL_UART_Receive_IT(&huart3,&Uart3RX_Data,1);
}

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1)
	{

		HAL_UART_Transmit(&huart1,&Uart1RX_Data,1,0xFFFF);
        HAL_UART_Receive_IT(&huart1,&Uart1RX_Data,1);      
	}
	
	if(huart->Instance == USART2)
	{

		HAL_UART_Transmit(&huart2,&Uart2RX_Data,1,0xFFFF);
        HAL_UART_Receive_IT(&huart2,&Uart2RX_Data,1);
	}
	
	if(huart->Instance == USART3)
	{
		HAL_UART_Transmit(&huart3,&Uart3RX_Data,1,0xFFFF);
		HAL_UART_Receive_IT(&huart3,&Uart3RX_Data,1);      
	}
	
}
/* USER CODE END 0 */

main函數調用函數

  /* USER CODE BEGIN 2 */
  USART_IT_Start();
  /* USER CODE END 2 */

 

2)下載設置,設置爲J-LINK下載(目前用的J-LINK,swd下載選擇ST Link),選擇設置芯片,設置Port爲SW,設置10MHz,檢查右邊有沒發現jlink,沒有多試幾次,設置flashdowload選項裏的Reset and Run,這樣程序燒寫後纔會運行(zz設定),再點擊download下載程序

 

6、修改

程序燒寫後,會發現發送短數據,收發沒問題,但長的數據,容易發生不進中斷的情況(可以在中斷中加led閃爍程序),修改代碼如下,加入一個標誌位,在串口中斷時若串口堵塞時置位,再在main函數中再使能中斷

main.c

main.h

stm32f0xx_it.c的串口中斷處理函數加入如下代碼

效果如下

若要串口1發給串口3,則可以將函數void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)中改爲如下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章