一、前言
串口通信(UART)是嵌入式系統中最基礎、最常用的通信方式之一,在STM32開發中占有重要地位。它結構簡單、易于實現,常用于調試信息輸出、與傳感器模塊通信或與其他微控制器進行數據交換。通過學習江協科技的相關教程,我們可以快速掌握在STM32平臺上實現串口通信的核心步驟與技巧。
二、串口通信基本原理
串口通信是一種異步全雙工通信方式,主要依靠兩根數據線(TX發送、RX接收)進行數據傳輸,無需時鐘線。其核心參數包括:
- 波特率(Baud Rate):決定通信速度,常見有9600、115200等。
- 數據位(Data Bits):通常為8位。
- 停止位(Stop Bits):通常為1位。
- 奇偶校驗位(Parity Bit):用于簡單的錯誤檢測,可選。
在STM32中,USART(通用同步異步收發器)模塊提供了完整的串口通信硬件支持。
三、硬件連接與初始化(以STM32F103C8T6為例)
1. 硬件連接
通常將開發板的USART1TX(PA9)連接到USB轉TTL模塊的RX,USART1RX(PA10)連接到USB轉TTL模塊的TX,并確保共地(GND)。
2. 初始化步驟(基于標準庫或HAL庫)
以使用STM32CubeMX配合HAL庫為例,關鍵步驟如下:
a. 引腳配置
在CubeMX中使能USART1,并設置模式為“Asynchronous”(異步)。PA9和PA10會自動配置為復用功能。
b. 參數設置
- 波特率:115200 Bits/s
- 字長:8 Bits
- 停止位:1
- 校驗位:None
- 硬件流控制:Disable
c. 生成代碼與用戶代碼添加
生成代碼后,在main.c的用戶代碼區添加初始化后測試代碼。
四、核心功能代碼實現
1. 發送單個字符與字符串
`c
// 發送一個字符
HALUARTTransmit(&huart1, (uint8_t *)&ch, 1, 1000);
// 發送字符串(以'\0'結尾)
char msg[] = "Hello STM32!\r\n";
HALUARTTransmit(&huart1, (uint8_t *)msg, strlen(msg), 1000);`
2. 接收數據(輪詢方式)
uint8t rxdata;
if(HALUARTReceive(&huart1, &rxdata, 1, 1000) == HALOK){
// 成功接收到一個字節,存放在rx_data中
}
3. 中斷接收(推薦方式)
a. 使能接收中斷
在CubeMX的NVIC設置中使能USART1全局中斷,或在代碼中調用:`c
_HALUARTENABLEIT(&huart1, UARTITRXNE); // 使能接收中斷`
b. 編寫中斷回調函數
重寫HAL<em>UART</em>RxCpltCallback回調函數來處理接收完成事件:`c
uint8t rxbuffer[1];
void HALUARTRxCpltCallback(UARTHandleTypeDef *huart){
if(huart->Instance == USART1){
// 處理接收到的數據 rxbuffer[0]
// ... 例如,回顯數據
HALUARTTransmit(&huart1, rxbuffer, 1, 1000);
// 重新啟動接收,以等待下一個字符
HALUARTReceiveIT(&huart1, rxbuffer, 1);
}
}`
在main函數初始化后,需先啟動一次中斷接收:HAL</em>UART<em>Receive</em>IT(&huart1, rx_buffer, 1);
4. 重定向printf(方便調試)
在usart.c文件中添加以下代碼,即可使用printf函數通過串口輸出:`c
#include
#ifdef GNUC
#define PUTCHARPROTOTYPE int ioputchar(int ch)
#else
#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif
PUTCHARPROTOTYPE{
HALUARTTransmit(&huart1, (uint8t *)&ch, 1, 1000);
return ch;
}`
之后在工程屬性中勾選“Use MicroLIB”(針對Keil)或進行相應設置。
五、調試與注意事項
- 波特率一致:確保STM32與上位機(如串口助手)的波特率等參數設置完全相同。
- 接線正確:TX接RX,RX接TX,切勿接反。
- 電壓匹配:STM32是3.3V電平,確保USB轉TTL模塊支持3.3V或已做電平轉換。
- 中斷優先級:如果系統中存在多個中斷,需合理配置串口接收中斷的優先級。
- 緩沖區管理:在中斷接收大量數據時,應使用環形緩沖區(Ring Buffer)來避免數據丟失。
六、進階應用
掌握基礎收發后,可以進一步探索:
- DMA通信:利用DMA進行串口數據收發,極大減輕CPU負擔,尤其適合高速或大數據量傳輸。
- 自定義通信協議:如設計包含幀頭、命令字、數據長度、校驗和、幀尾的簡單協議,以提高通信可靠性。
- 多串口協同:STM32通常有多個USART,可同時與不同設備通信。
七、
通過江協科技教程的系統學習,我們從原理到實踐完成了STM32串口通信的開發。從簡單的引腳配置、參數設置,到輪詢與中斷兩種數據收發方式,再到printf重定向這一實用技巧,構成了串口應用的堅實基礎。在實際項目中,應根據具體需求(如速度、實時性、數據量)靈活選擇輪詢、中斷或DMA方式。串口作為嵌入式開發的“萬能鑰匙”,其穩定實現是后續學習更復雜通信方式(如SPI、I2C、CAN)的重要前提。不斷練習并嘗試上述進階應用,將能更深入地理解和駕馭STM32的通信功能。