基于 STM32F103C8T6 的 MS5837-30BA 深度传感器设备端,I2C 采集 → 二阶补偿解算 → USART1 按 V1 协议输出。
| STM32F103C8T6 | MS5837 | 说明 |
|---|---|---|
| PB6 | SCL | I2C1 时钟 (400kHz) |
| PB7 | SDA | I2C1 数据 |
| PA9 | USART1_TX | 协议输出,115200 8N1 |
| PA10 | USART1_RX | 协议命令输入,115200 8N1 |
| PA13 | — | SWDIO,RTT 通过调试器读取 |
| PA14 | — | SWCLK,RTT 通过调试器读取 |
| 3.3V | VDD | 电源 |
| GND | GND | 地 |
完整 V1 协议见 数据协议.md。当前设备使用通用帧格式:
A5 5A TYPE LEN PAYLOAD CHECKSUM
协议编解码软件层位于 Software/Protocol/ms5837_protocol.c/.h,默认数据帧发送频率为 60 Hz,支持 15~150 Hz 配置和主动握手。USART1 默认使用 DMA+IDLE 接收,开关为 MS5837_PROTOCOL_USE_DMA_IDLE。主设备每 2 s 发送握手,设备仅在有效握手后刷新约 5 s 看门狗。
可移植 MS5837 软件层示例位于 Examples/SoftwareLayer/MS5837/,不参与当前固件编译。
- 复位 MS5837 (0x1E),等待 10ms
- 读取 PROM 校准系数 C1-C6
- 大气压校准 — 自动采集 20 帧压力数据取均值作为
P_atm基准(约 0.7 秒) - 进入主循环 — 每周期约 36ms:
D2 温度转换 (0x5A) → 等待 18ms → 读取 D2 ADC
→ D1 压力转换 (0x4A) → 等待 18ms → 读取 D1 ADC
→ 二阶温度补偿 (int64 运算)
→ 深度 = (P_abs - P_atm) / 98.1 (淡水, ρ=1000 kg/m³)
→ 按 V1 协议通过 USART1 发送
打开 MDK-ARM/interpreter.uvprojx,编译下载。
用 Embedded IDE 插件打开项目,目标选 interpreter,工具链 AC6 (ARM Compiler 6)。
当前 CubeMX 配置启用了 USART1 双向 DMA、I2C1 RX DMA 及对应中断,RTT 仅用于调试:
| 移除的 HAL 模块 | 替代方案 |
|---|---|
stm32f1xx_hal_i2c.c |
HAL 阻塞发送 + RX DMA 接收 |
SEGGER_RTT.c |
SWD/DAPLink RTT 调试环形缓冲 |
stm32f1xx_hal_dma.c |
USART1 TX/RX、I2C1 RX DMA |
以下宏定义在 Core/Inc/ms5837.h 中可按需修改:
| 宏 | 默认值 | 说明 |
|---|---|---|
WATER_DENSITY_FRESH |
1000.0f |
液体密度 kg/m³,海水改为 1025.0f |
DEPTH_CALIB_SAMPLES |
20 |
上电大气压校准采样帧数 |
MS5837_CONVERT_DELAY |
18 |
ADC 转换等待时间 ms (OSR=8192) |
interpreter/
├── Core/
│ ├── Inc/
│ │ ├── main.h
│ │ ├── ms5837.h ← 传感器驱动头文件
│ │ ├── i2c.h
│ │ └── iwdg.h ← 独立看门狗接口
│ └── Src/
│ ├── main.c ← 主循环 + 帧打包发送
│ ├── ms5837.c ← HAL I2C + RX DMA + 重试/总线恢复 + 传感器解算
│ ├── i2c.c ← I2C1 与 RX DMA 初始化
│ ├── usart.c ← USART1 与 TX/RX DMA 初始化
│ ├── dma.c ← DMA 控制器与中断初始化
│ ├── iwdg.c ← 约 5 s 独立看门狗初始化
│ ├── stm32f1xx_it.c ← 中断服务
│ └── ...
├── Drivers/ ← CubeMX/HAL/CMSIS 硬件依赖
├── Software/Protocol/ ← 当前固件使用的可移植协议层
├── Examples/SoftwareLayer/← 独立软件层移植示例
├── ThirdParty/RTT/ ← SEGGER RTT 源码与本工程配置
├── MDK-ARM/ ← Keil 工程
├── .eide/ ← EIDE (VSCode) 工程
└── README.md
固件使用 RTT 通道 0 每秒输出一次文本调试状态;正式数据通过 USART1 输出。RTT 调试开关位于 Core/Inc/rtt_debug.h 的 RTT_DEBUG_ENABLE。