stm32f103rct6標準庫串口配置


STM32F103RCT6標準庫串口配置詳解
一、串口通信基礎理論
1.1 串口通信概述
串口通信(Serial Communication)是嵌入式系統中常用的數據交換方式,通過兩條線(TX發送線、RX接收線)和地線(GND)實現全雙工或半雙工通信。其核心優勢在于硬件成本低、連接簡單,適用于低速數據傳輸場景。在STM32F103RCT6中,串口模塊(USART/UART)支持多種通信參數配置,包括波特率、數據位、停止位和校驗位,需與通信對端嚴格匹配以確保數據完整性。
1.2 關鍵參數詳解
波特率:單位時間內傳輸的符號數(如9600波特率表示每秒傳輸9600個符號),需與對端設備一致。
數據位:數據幀中有效信息的位數(常見為8位),影響單次傳輸的數據量。
停止位:標識數據幀結束的位(1位、1.5位或2位),用于同步時鐘。
校驗位:可選的奇偶校驗位,用于簡單錯誤檢測(如奇校驗、偶校驗)。
1.3 硬件連接規范
STM32F103RCT6的串口引腳需遵循交叉連接原則:
發送端(TX)連接對端接收端(RX)
接收端(RX)連接對端發送端(TX)
地線(GND)需共地
例如,USART1的TX(PA9)接對端RX,RX(PA10)接對端TX。
二、標準庫串口配置步驟
2.1 初始化流程
標準庫配置串口需完成以下步驟:
時鐘使能:啟用USART及GPIO時鐘。
GPIO配置:設置TX為復用推挽輸出,RX為浮空輸入。
USART復位:初始化前復位外設。
參數初始化:配置波特率、數據位、停止位等。
中斷配置(可選):啟用接收中斷并配置NVIC。
使能USART:啟動串口模塊。
2.2 代碼實現示例
以下以USART1為例,展示完整配置代碼:
#include "stm32f10x.h"
void USART1_Init(uint32_t bound) { GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;
// 1. 使能時鐘 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// 2. 配置GPIO // TX (PA9) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);
// RX (PA10) GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure);
// 3. USART復位 USART_DeInit(USART1);
// 4. 配置USART參數 USART_InitStructure.USART_BaudRate = bound; // 波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; // 8位數據 USART_InitStructure.USART_StopBits = USART_StopBits_1; // 1位停止位 USART_InitStructure.USART_Parity = USART_Parity_No; // 無校驗 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; // 無硬件流控 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 發送+接收 USART_Init(USART1, &USART_InitStructure);
// 5. 啟用中斷(可選) USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); // 接收中斷
// 6. 配置NVIC NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; // 搶占優先級 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; // 子優先級 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);
// 7. 使能USART USART_Cmd(USART1, ENABLE); }
2.3 中斷服務函數
中斷模式下需實現接收回調函數,例如:
void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) { uint8_t data = USART_ReceiveData(USART1); // 讀取數據 // 處理數據(如存入緩沖區或觸發其他邏輯) } }
三、數據發送與接收實現
3.1 發送數據
通過USART_SendData
函數發送數據,需等待發送完成:
void USART1_SendChar(char ch) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); // 等待發送緩沖區空 USART_SendData(USART1, (uint8_t)ch); }
void USART1_SendString(char *str) { while (*str) { USART1_SendChar(*str++); } }
3.2 接收數據
接收方式分為輪詢和中斷兩種:
輪詢模式:通過
USART_GetFlagStatus
檢查RXNE
標志位。中斷模式:通過回調函數處理接收數據,適合高實時性場景。
3.3 重定向printf
通過重定向fputc
函數實現printf
輸出到串口:
int fputc(int ch, FILE *f) { while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); USART_SendData(USART1, (uint8_t)ch); return ch; }
四、高級應用與優化
4.1 DMA傳輸
通過DMA實現高速數據傳輸,減少CPU占用。需配置DMA通道并關聯USART數據寄存器。
4.2 多主機通信
在多設備場景中,需通過硬件流控(RTS/CTS)或軟件協議(如幀頭幀尾)避免沖突。
4.3 故障排除
無數據收發:檢查硬件連接、波特率匹配、時鐘使能。
數據錯亂:增大緩沖區、優化中斷優先級。
死機:避免在中斷中執行耗時操作。
五、完整工程示例
5.1 工程結構
Project/ ├── Core/ │ ├── Inc/ │ │ └── usart.h │ ├── Src/ │ │ └── usart.c │ └── Startup/ │ └── startup_stm32f10x_hd.s ├── User/ │ ├── main.c │ └── stm32f10x_it.c └── Libraries/ ├── CMSIS/ └── STM32F10x_StdPeriph_Driver/
5.2 主函數示例
#include "stm32f10x.h" #include "usart.h"
int main(void) { // 初始化系統時鐘、GPIO等 SystemInit();
// 初始化USART1 USART1_Init(115200);
while (1) { printf("Hello, STM32!
"); Delay_ms(1000); } }
六、總結
STM32F103RCT6的串口配置涉及時鐘、GPIO、USART及中斷的協同工作。通過標準庫提供的API,開發者可靈活實現基礎通信功能,并通過DMA、多主機協議等高級特性優化性能。實際應用中需結合硬件連接、通信協議及調試工具(如串口助手)進行綜合驗證,確保系統穩定運行。
責任編輯:David
【免責聲明】
1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明芯城(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學習使用,不涉及商業目的。
3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。
4、如需轉載本方擁有版權的文章,請聯系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。
拍明芯城擁有對此聲明的最終解釋權。