stm32f103rct6標(biāo)準(zhǔn)庫串口配置


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