Skip to content
 
 

Repository files navigation

MS5837 Depth Sensor — STM32 Firmware

基于 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/,不参与当前固件编译。

上电流程

  1. 复位 MS5837 (0x1E),等待 10ms
  2. 读取 PROM 校准系数 C1-C6
  3. 大气压校准 — 自动采集 20 帧压力数据取均值作为 P_atm 基准(约 0.7 秒)
  4. 进入主循环 — 每周期约 36ms:
  D2 温度转换 (0x5A) → 等待 18ms → 读取 D2 ADC
→ D1 压力转换 (0x4A) → 等待 18ms → 读取 D1 ADC
→ 二阶温度补偿 (int64 运算)
→ 深度 = (P_abs - P_atm) / 98.1   (淡水, ρ=1000 kg/m³)
→ 按 V1 协议通过 USART1 发送

编译

Keil MDK-ARM

打开 MDK-ARM/interpreter.uvprojx,编译下载。

EIDE (VSCode)

用 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 读取

固件使用 RTT 通道 0 每秒输出一次文本调试状态;正式数据通过 USART1 输出。RTT 调试开关位于 Core/Inc/rtt_debug.hRTT_DEBUG_ENABLE

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages