1. 准備工作
硬件准備
- 首先需要准備一個開發板,這里我准備的是STM32L4的開發板(BearPi):
2.生成MDK工程
選擇芯片型號
打開STM32CubeMX,打開MCU選擇器:
搜索並選中芯片STM32L431RCT6
:
配置時鍾源
- 如果選擇使用外部高速時鍾(HSE),則需要在System Core中配置RCC;
- 如果使用默認內部時鍾(HSI),這一步可以略過;
這里我都使用外部時鍾:
配置串口
小熊派開發板板載ST-Link並且虛擬了一個串口,原理圖如下:
這里我將開關撥到AT-MCU
模式,使PC的串口與USART1之間連接。
接下來開始配置USART1
:
NVIC配置
在NVIC中配置USART中斷優先級:
配置時鍾樹
STM32L4的最高主頻到80M,所以配置PLL,最后使HCLK = 80Mhz
即可:
生成工程設置
代碼生成設置
最后設置生成獨立的初始化文件:
生成代碼
點擊GENERATE CODE
即可生成MDK-V5工程:
3. 在MDK中編寫、編譯、下載用戶代碼
定義發送和接收緩沖區
1 /* Private user code ---------------------------------------------------------*/ 2 /* USER CODE BEGIN 0 */ 3 uint8_t hello[] = "quot;USART1 is ready...\n"; 4 uint8_t recv_buf; 5 /* USER CODE END 0 */
## 重新實現中斷回調函數 在NVIC一講中我們探索了HAL庫的中斷處理機制,HAL中弱定義了一個中斷回調函數 `HAL_UART_RxCpltCallback`, 我們需要在用戶文件中重新定義該函數,放在哪都可以,這里我放在 `main.c` 中:

1 /* USER CODE BEGIN 4 */ 2 /* 中斷回調函數 */ 3 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) 4 { 5 /* 判斷是哪個串口觸發的中斷 */ 6 if(huart ->Instance == USART1) 7 { 8 //將接收到的數據發送 9 HAL_UART_Transmit(huart, &recv_buf, 1,0); 10 //重新使能串口接收中斷 11 HAL_UART_Receive_IT(huart, &recv_buf, 1); 12 } 13 } 14 /* USER CODE END 4 */
修改main函數
在main函數中首先開啟串口中斷接收,然后發送提示信息:

1 int main(void) 2 { 3 HAL_Init(); 4 5 SystemClock_Config(); 6 7 MX_GPIO_Init(); 8 MX_USART1_UART_Init(); 9 10 /* USER CODE BEGIN 2 */ 11 //使能串口中斷接收 12 HAL_UART_Receive_IT(& huart1, & recv_buf, 1); 13 //發送提示信息 14 HAL_UART_Transmit_IT(&huart1, (uint8_t*)hello, sizeof(hello)); 15 /* USER CODE END 2 */ 16 17 while (1) 18 { 19 } 20 }
編譯代碼
點擊如圖所示的按鈕編譯工程
編譯成功
設置下載器
點擊如圖所示按鈕打開設置頁面
進行下載設置,選擇“ST-Link Debugger”,並點擊“Settings”。
在“Flash Download”菜單下勾選“Reset and Run”選項,已達到燒錄程序后單片機自動復位並運行程序的目的。
下載運行
點擊"LOAD"按鈕即可燒錄代碼到單片機中。
燒錄成功
實驗現象
下載運行后,實驗現象如下:
至此,我們已經學會了如何配置USART使用中斷模式發送和接收數據,下一節將討論如何配置USART使用DMA模式發送數據和接收數據。