1. STM32串口通信基础与开发环境搭建
作为一名嵌入式开发者,掌握STM32的串口通信是基本功。在实际项目中,我经常使用USART模块与各种外设进行数据交互。本文将分享基于HAL库的串口中断收发实现,重点解析那些官方文档不会告诉你的实战细节。
首先需要准备好开发环境:
- 硬件:STM32F103C8T6核心板(蓝色小板)
- IDE:Keil MDK-ARM V5
- 调试工具:ST-Link V2仿真器
- 串口工具:Putty或SecureCRT
注意:开发板必须独立供电!我在初期调试时曾因仅依赖仿真器供电导致通信异常,表现为R1寄存器值异常变化。这是STM32的常见坑点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 串口通信协议深度解析
2.1 异步串口通信的本质
异步串口通信的核心特点是:
- 无时钟线同步
- 依赖预定义的波特率
- 每个字节独立封装
就像两个人在黑暗中间隔固定时间喊话,必须事先约定好:
- 说话速度(波特率)
- 词语长度(数据位)
- 如何确认听清(校验位)
- 如何表示说完(停止位)
2.2 关键参数配置实例
以115200波特率、8N1配置为例:
c复制g_uart1_handle.Init.BaudRate = 115200; // 每秒115200位
g_uart1_handle.Init.WordLength = UART_WORDLENGTH_8B; // 8位数据
g_uart1_handle.Init.StopBits = UART_STOPBITS_1; // 1位停止位
g_uart1_handle.Init.Parity = UART_PARITY_NONE; // 无校验
波特率误差必须控制在2%以内。以72MHz系统时钟为例,计算分频值:
code复制USARTDIV = 72000000/(16*115200) = 39.0625
BRR寄存器值 = 39<<4 | 1<<0 = 0x273
2.3 数据帧的解剖
一个完整的数据帧包含:
code复制[起始位(0)] + [数据位(5-8)] + [校验位(可选)] + [停止位(1)]
实际传输时是LSB先发,比如发送0x55(01010101),线上波形实际是10101010。
