STM32串口常用寄存器和库函数
STM32 串口通信常用寄存器
名称 | 说明 | 图示 |
---|---|---|
USART_SR | 状态寄存器,标志 TXE、RXNE、TC 等状态 | USART_SR |
USART_DR | 数据寄存器,写入发送,读取接收 | USART_DR |
USART_BRR | 波特率寄存器,设置通信速率 | USART_BRR |
USART_SR
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
USART_DR
void USART_SendData(USART_TypeDef* USARTx, uint16_t Data);
uint16_t USART_ReceiveData(USART_TypeDef* USARTx);
USART_BRR
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
串口操作相关库函数(省略入口参数):
void USART_Init(); //串口初始化:波特率,数据字长,奇偶校验,硬件流控以及收发使能
void USART_Cmd();//使能串口
void USART_ITConfig();//使能相关中断
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
FlagStatus USART_GetFlagStatus();//获取状态标志位
void USART_ClearFlag();//清除状态标志位
ITStatus USART_GetITStatus();//获取中断状态标志位
void USART_ClearITPendingBit();//清除中断状态标志位
库函数 | 说明 |
---|---|
USART_Init() |
初始化串口参数:波特率、数据位、停止位、校验位等 |
USART_Cmd() |
使能串口 |
USART_ITConfig() |
启用串口中断 |
USART_SendData() |
向 DR 寄存器发送数据 |
USART_ReceiveData() |
从 DR 寄存器接收数据 |
USART_GetFlagStatus() |
检查 TXE、RXNE 等标志 |
USART_ClearITPendingBit() |
清除中断挂起标志 |
串口配置一般步骤(标准库)
需要先了解 STM32F1的端口复用相关知识,请参考前面端口复用的文章。【STM32】端口复用和重映射。
源文档出自RM0008_STM32F10xxx单片机参考手册中文版 8.1.11小节
① 串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
② 串口复位: USART_DeInit(); 这一步不是必须的
③ GPIO端口模式设置:GPIO_Init(); 模式设置为GPIO_Mode_AF_PP
④ 串口参数初始化:USART_Init();
⑤ 开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
⑥使能串口:USART_Cmd();
⑦编写中断处理函数:USARTx_IRQHandler();
⑧串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
⑨串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
👇 简化为 9 步:
- 开启时钟(串口和 GPIO)
- GPIO初始化(TX:复用推挽输出;RX:浮空输入)
- 串口参数配置
- 配置中断(可选)
- 配置 NVIC(可选)
- 使能串口
- 收发函数
- 状态判断
- 编写中断服务函数(如果启用中断)
USART1 通信实例(标准库,无中断)
💡 目标:使用 USART1(PA9、PA10),实现串口发送字符串到上位机
📌 1. 初始化代码(串口+GPIO)
#include "stm32f10x.h"
void USART1_Init(uint32_t baudrate)
{
// 1. 开启时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
// 2. 配置 GPIO
GPIO_InitTypeDef GPIO_InitStructure;
// TX (PA9) 推挽复用输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// RX (PA10) 浮空输入
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;