1. 项目背景与需求解析
最近在帮朋友改造一款简易手持温湿度采集仪时,遇到了串口通信的瓶颈问题。原设计采用CP2102 USB转串口芯片,在800KBps速率下出现严重丢包,导致温湿度曲线波动剧烈。这促使我转向研究STM32F103内置的USB HID通信方案。
传统串口通信存在几个固有缺陷:
- 波特率限制:F103最高支持2.25Mbps,但实际115200波特率下有效速率仅约11.2KB/s
- 硬件依赖:需要额外电平转换芯片,占用PCB空间和IO资源
- 稳定性问题:高速时易受干扰,误码率显著上升
相比之下,USB HID方案具有明显优势:
- 理论速度:全速USB 12Mbps,实测稳定在1-1.2Mbps
- 硬件简化:省去串口转换芯片,仅需USB接口
- 协议可靠:内置CRC校验,通信质量有保障
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件设计与环境搭建
2.1 最小系统配置
本方案基于STM32F103C8T6最小系统板实现,核心硬件需求如下:
| 模块 | 型号/参数 | 备注 |
|---|---|---|
| MCU | STM32F103C8T6 | 内置USB FS控制器 |
| 时钟 | 8MHz晶振 + 内部PLL | 需配置为72MHz系统时钟 |
| USB接口 | Micro-USB | D+需接1.5K上拉电阻 |
| 传感器 | DHT22 | 通过单总线通信 |
注意:USB DP(D+)引脚必须通过1.5K电阻上拉到3.3V,这是USB协议要求的设备连接检测机制
2.2 开发环境准备
-
工具链配置:
- Keil MDK 5.25
- STM32标准外设库V3.5.0
- STSW-STM32121 USB库
-
关键库文件:
usb_core.cUSB协议栈核心usb_regs.c寄存器操作hw_config.c硬件初始化usb_desc.c描述符配置
3. USB HID协议实现详解
3.1 报告描述符定制
官方HID鼠标示例的报告描述符仅10字节,我们需扩展为64字节双向通信:
c复制const uint8_t HID_ReportDescript
