目錄
概述
1 認識STM32F4XX的USART
1.1 USART 功能說明
1.2 USART的中斷
1.3 USART 模式配置
1.4 USART的寄存器
2 使用STM32CubeMX 生成工程
2.1 配置參數
2.2 生成工程代碼
3 實現軟件功能
3.1 軟件功能介紹
3.2 認識USART Hal庫
3.2.1 初始化函數組
3.2.2 發送/接收函數組
3.2.3 中斷和callback函數組
4 實現串口發送和接收功能接口
4.1 發送函數
4.2 接收函數
4.3 實現printf打印功能
4.4 完整程序
5 測試
5.1 測試代碼功能介紹
5.2 測試代碼實現
5.3 測試發送和接收功能
5.3.1 測試發送功能
5.3.2 測試接收數據功能
源代碼下載地址:stm32f4xxx-USART串口中斷收發例程資源-CSDN文庫
HAL 庫版本:??STM32Cube_FW_F4_V1.27.1?
概述
本文主要介紹STM32F4XX 通用同步異步收發器 (USART) 的相關知識,詳細介紹了USART的特征,寄存器組。還介紹如何使用STM32CubeMX配置USART的相關的參數,并生成項目文件。還使用Hal庫函數實現USART1的發送和接收功能,其中接收功能使用中斷來實現的。
1 認識STM32F4XX的USART
通用同步異步收發器 (USART) 能夠靈活地與外部設備進行全雙工數據交換,滿足外部設備對工業標準 NRZ 異步串行數據格式的要求。 USART 通過小數波特率發生器提供了多種波特率。它支持同步單向通信和半雙工單線通信;還支持 LIN( 局域互連網絡)、智能卡協議與 IrDA(紅外線數據協會) SIR ENDEC 規范,以及調制解調器操作 (CTS/RTS)。而且,它還支持多處理器通信。通過配置多個緩沖區使用 DMA 可實現高速數據通信。
1.1 USART 功能說明
接口通過三個引腳從外部連接到其它設備。任何 USART 雙向通信均需要至少兩個引腳:接收數據輸入引腳 (RX) 和發送數據引腳輸出 (TX):
RX:接收數據輸入引腳就是串行數據輸入引腳。過采樣技術可區分有效輸入數據和噪聲,從而用于恢復數據。
TX: 發送數據輸出引腳。如果關閉發送器,該輸出引腳模式由其 I/O 端口配置決定。如果使能了發送器但沒有待發送的數據,則 TX 引腳處于高電平。在單線和智能卡模式下,該 I/O用于發送和接收數據( USART 電平下,隨后在 SW_RX 上接收數據)。
正常 USART 模式下,通過這些引腳以幀的形式發送和接收串行數據:
● 發送或接收前保持空閑線路
● 起始位
● 數據(字長 8 位或 9 位),最低有效位在前
● 用于指示幀傳輸已完成的 0.5 個、 1 個、 1.5 個、 2 個停止位
● 該接口使用小數波特率發生器 - 帶 12 位尾數和 4 位小數
● 狀態寄存器 (USART_SR)
● 數據寄存器 (USART_DR)
● 波特率寄存器 (USART_BRR) - 12 位尾數和 4 位小數。
● 智能卡模式下的保護時間寄存器 (USART_GTPR)
1.2 USART的中斷
發送期間:發送完成、清除以發送或發送數據寄存器為空中斷。 接收期間:空閑線路檢測、上溢錯誤、接收數據寄存器不為空、奇偶校驗錯誤、 LIN 斷路檢測、噪聲標志(僅限多緩沖區通信)和幀錯誤(僅限多緩沖區通信)。
1.3 USART 模式配置
1.4 USART的寄存器
這是一張非常完美的圖,介紹整個USART的工作原理,以及各個寄存器的功能。了解這張圖,就會對STM32的USART模塊有一個很深刻的認識。
和USART相關的寄存器的列表,具體每個寄存器表示什么意思,參考文檔: STM32F40xxx、STM32F41xxx、STM32F42xxx、STM32F43xxx參考手冊(中文).pdf
2 使用STM32CubeMX 生成工程
2.1 配置參數
1)選擇串口工作模式
2)Parameter Settings
3)NVIC Settings
2.2 生成工程代碼
選擇合適的IDE和Hal庫,然后點擊GENERATE CODE,生成項目文件。打開工程可以看見,和硬件相關的代碼STM32CubeMX 已經生成,且這些函數已經在main()函數中初始化,所以user只需編寫和應用相關的代碼。
3 實現軟件功能
3.1 軟件功能介紹
1)實現串口發送字符串功能
2)實現中斷接收字符串功能
3.2 認識USART Hal庫
3.2.1 初始化函數組
這部分函數會在STM32CubeMX自動生成代碼時,自動調用。
3.2.2 發送/接收函數組
3.2.3 中斷和callback函數組
4 實現串口發送和接收功能接口
本程序使用UART0來實現串口的發送和接收功能。
4.1 發送函數
參數介紹:
1)huart: 串口配置參數指針
2)databuff: 發送數據的存儲buff
3) datalen : 發送數據的字節長度
串口配置參數指針位置:
4.2 接收函數
這部分函數在stm32f4_drv_uart.c文件中實現
接收參數采用中斷方式實現,Hal庫的中斷程序實現和很早以前ST提供的drviver的實現方式有很大的不同,先看代碼:
使用Hal庫實現接收數據功能,有如下3個步驟:
step-1: 代碼18~19行, 定義接收數據buff,具體數據長度,可根據實現項目特性確定
step-2: 代碼21~24行,調用HAL_UART_Receive_IT,實現數據接收,這個函數必須被連續執行,才能使中斷程序不間斷接收數據。
step-3: 代碼26~32行,重新HAL_UART_RxCpltCallback函數,該函數在收到step-1傳入的接收數據長度個數據之后,會進入該函數。其作用是,實現數據處理邏輯。
4.3 實現printf打印功能
在函數中添加如下代碼:
代碼介紹
222-行: 使用USART1接口,傳遞一個數據,超時時間為1000ms
注意:
使用printf功能時,必須在頭文件中包含:stdio.h
#include <stdio.h>
4.4 完整程序
/* USER CODE BEGIN Header */
/********************************************************************************* File Name ? ? ? ? : stm32f4_drv_uart.c* Description ? ? ? : Code for board uart driver******************************************************************************* @attention** Copyright (c) mingfei.tang* All rights reserved.********************************************************************************/
/* USER CODE END Header */
#include "can.h"
#include "stm32f4_drv_uart.h"
?
static uint8 recevBuff[10];
static const ?uint8 RECEV_LEN = sizeof(recevBuff);
?
void UART_Drv_Receive( UART_HandleTypeDef *huart)
{HAL_UART_Receive_IT( huart, ?recevBuff, RECEV_LEN);
}
?
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if( huart->Instance == USART1){printf(" %s ", recevBuff);}
}
?
void UART_Drv_SendString(UART_HandleTypeDef *huart, uint8 *databuff, uint8 datalen)
{HAL_UART_Transmit( huart, databuff , datalen, 1000 );
}
5 測試
5.1 測試代碼功能介紹
1)使用UART_Drv_SendString發送字符串
2)使用printf發送字符串
3)使用中斷函數接收程序
5.2 測試代碼實現
源代碼
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */// UART RECEIVE UART_Drv_SendString(&huart1, "this is a test!\r\n", sizeof("this is a test!\r\n"));printf("CAN bus test example: \r\n " ); //使用printf打印log /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){UART_Drv_Receive( &huart1 ); //觸發接收中斷函數/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
5.3 測試發送和接收功能
5.3.1 測試發送功能
下載程序到板卡,將USART1對應的串口端和PC之間,使用串口線連接起來,打開串口工具,重新上電或者復位板卡可以看見:
5.3.2 測試接收數據功能
在接收函數中,定義的接收數據緩沖buff的長度為10,所以,當中斷程序接收到10個數據之后,就會調用HAL_UART_RxCpltCallback函數.
在HAL_UART_RxCpltCallback函數中,會將接收到的數據通過printf打印到終端:
運行程序后,使用串口調試助手發送數據: