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)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。