商丘手机网站建设,看过的网站做记号,杭州做公司官网的公司,万网域名注册查询网#x1f4ca; 一、核心寄存器概览
寄存器功能位宽关键位域USART_SR状态寄存器#xff08;只读#xff09;32位RXNE(接收就绪)、TC(发送完成)、TXE(发送寄存器空)、ORE(溢出错误)USART_DR数据寄存器#xff08;读写#xff09;32位低9位有效 一、核心寄存器概览
寄存器功能位宽关键位域USART_SR状态寄存器只读32位RXNE(接收就绪)、TC(发送完成)、TXE(发送寄存器空)、ORE(溢出错误)USART_DR数据寄存器读写32位低9位有效存储发送/接收的数据实际用8位USART_BRR波特率寄存器32位DIV_Mantissa(整数部分) DIV_Fraction(小数部分)控制通信速率USART_CR1控制寄存器132位UE(使能)、TE(发送使能)、RE(接收使能)、M(字长)、PCE(校验使能)USART_CR2控制寄存器232位STOP(停止位长度)、LINEN(LIN模式)、CLKEN(时钟使能)USART_CR3控制寄存器332位DMAT(DMA发送使能)、DMAR(DMA接收使能)、RTSE(RTS流控)、CTSE(CTS流控) ⚠️ 注意 所有寄存器必须按32位字访问禁止半字/字节操作操作前需使能时钟RCC_APBxPeriphClockCmd()否则配置无效。 ⚙️ 二、寄存器详解与配置方法
1. 状态寄存器USART_SR
关键位 RXNE(位5)接收数据就绪读DR自动清除TXE(位7)发送寄存器空写DR自动清除TC(位6)发送完成读SR后写DR清除
// 发送前检测TXE
while (!(USART1-SR USART_SR_TXE)); // 等待发送寄存器空
USART1-DR data; // 写入数据
2. 波特率寄存器USART_BRR
计算公式 BRR波特率×16fclk 整数部分存于DIV_Mantissa[15:4]小数部分存于DIV_Fraction[3:0]
// 设置115200波特率系统时钟72MHz
USART1-BRR (72000000 / (115200 * 16)); // 计算结果39.0625 → BRR0x0273
3. 控制寄存器1USART_CR1
位名称功能13UE使能USART1使能0关闭12M字长08位19位10PCE校验使能1启用奇偶校验3TE发送使能1开启TX2RE接收使能1开启RX
// 使能8位数据、无校验、收发模式
USART1-CR1 | USART_CR1_UE | USART_CR1_TE | USART_CR1_RE;
4. 控制寄存器2USART_CR2
停止位控制 STOP[13:12]001位停止位010.5位102位111.5位
// 设置1位停止位
USART1-CR2 ~USART_CR2_STOP; // 清零STOP位
5. 控制寄存器3USART_CR3
高级功能 DMAT(位7)DMA发送使能DMAR(位6)DMA接收使能RTSE(位8)RTS硬件流控使能
// 启用DMA接收
USART1-CR3 | USART_CR3_DMAR; 三、完整配置流程寄存器版
步骤1使能时钟
RCC-APB2ENR | RCC_APB2Periph_USART1; // USART1时钟使能APB2总线
RCC-APB2ENR | RCC_APB2Periph_GPIOA; // GPIOA时钟使能
步骤2配置GPIO为复用模式
// PA9(TX)复用推挽输出
GPIOA-CRH ~(0xF 4); // 清除PA9配置
GPIOA-CRH | (0xB 4); // 50MHz复用推挽CNF10, MODE11// PA10(RX)浮空输入
GPIOA-CRH ~(0xF 8);
GPIOA-CRH | (0x4 8); // 浮空输入CNF01, MODE00
步骤3设置波特率与帧格式
USART1-BRR 0x0273; // 72MHz下115200波特率
USART1-CR1 ~USART_CR1_M; // 8位数据
USART1-CR2 ~USART_CR2_STOP; // 1位停止位
USART1-CR1 ~USART_CR1_PCE; // 无校验
步骤4使能收发与USART
USART1-CR1 | USART_CR1_TE | USART_CR1_RE; // 使能发送和接收
USART1-CR1 | USART_CR1_UE; // 使能USART
步骤5可选中断配置
USART1-CR1 | USART_CR1_RXNEIE; // 接收中断使能
NVIC-ISER[0] | (1 USART1_IRQn); // 使能NVIC中断 四、数据收发实战代码
1. 阻塞式发送函数
void USART_SendChar(uint8_t ch) {while (!(USART1-SR USART_SR_TXE)); // 等待发送寄存器空USART1-DR ch; // 写入数据while (!(USART1-SR USART_SR_TC)); // 等待发送完成
}
2. 中断接收服务函数
void USART1_IRQHandler(void) {if (USART1-SR USART_SR_RXNE) { // 检查接收中断标志uint8_t data USART1-DR; // 读取数据自动清除RXNE// 处理接收到的数据...}
} ⚠️ 五、关键注意事项 时钟一致性 USART1挂载APB2最高72MHzUSART2/3挂载APB1最高36MHzBRR计算需根据实际总线频率调整。 中断标志清除 RXNE读DR自动清除TC需读SR 写DR序列清除 9位数据模式 启用USART_CR1_M后DR需按16位操作 uint16_t data USART1-DR 0x1FF; // 读取9位数据 硬件流控 启用USART_CR3_RTSE/CTSE时需连接CTS/RTS引脚。 六、调试技巧
状态寄存器诊断 if (USART1-SR USART_SR_ORE) { // 检测溢出错误USART1-SR ~USART_SR_ORE; // 写1清除错误标志
} 波特率验证 用示波器测量TX引脚波形计算实际波特率 实际波特率1/位周期 通过直接操作寄存器串口通信延迟可降至1μs以内比库函数快3-5倍适用于电机控制、高速传感器等实时场景