可用于快速搭建基于 STM32 的六轴姿态测量模块,实时输出横滚、俯仰和偏航角。项目通过 SPI 读取 ICM-42607-P,采用 Mahony 滤波解算姿态,上电自动陀螺零偏标定,定时器 100Hz 采样,串口 10Hz 输出角度,支持 CMake 构建。【此简介由AI生成】
| Files | Last commit | Last update |
|---|---|---|
| 3 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 2 months ago | ||
| 3 months ago | ||
| 3 months ago |
ICM42607 — STM32F103C8T6 + ICM-42607-P 六轴姿态解算
基于 STM32F103C8T6(72MHz)通过 SPI1 读取 ICM-42607-P 六轴 IMU,使用 Mahony 滤波解算姿态角,经 USART1 实时输出横滚 / 俯仰 / 偏航角。
功能特性
- SPI1 读取 ICM-42607-P(加速度计 ±4g / 陀螺仪 ±2000dps / ODR 100Hz),驱动见
Core/BSP/ICM42607.c - Mahony 姿态解算(加速度计单位 g、陀螺仪单位 rad/s,符合算法要求),见
Core/BSP/mahony.c - 上电自动陀螺零偏标定(模块静止约 5 秒,无需手动校准)
- TIM4 定时器驱动 100Hz 采样 + 解算,主循环 10Hz 串口输出
R / P / Y角度(0.1° 分辨率) - 标定后偏航漂移实测约 0.1°/50s(无磁力计,长时间仍会缓慢漂移)
硬件需求与接线
| 器件 | 引脚 | 说明 |
|---|---|---|
| ICM-42607-P | PA5 → SCK,PA6 ← MISO,PA7 → MOSI,PB0 → CS | SPI1,Mode 0 |
| ICM-42607-P 供电 | 3V3 / GND | |
| USART1 | PA9 (TX) / PA10 (RX) | 115200-8N1,姿态角输出 |
| 调试器 | PA13/PA14 (SWD) | ST-Link / J-Link / DAP |
常见 F103C8T6 最小系统板("蓝板")即可直接使用。
软件架构
TIM4 中断 (1ms)
└─ 每 10 次 → ICM42607_ReadData(&imu) ← 100Hz 读传感器
└─ Mahony_update(&filter, dt=0.01) ← 100Hz 姿态解算
主循环 (10Hz)
└─ 串口打印 filter.roll / pitch / yaw
上电运行流程:
- 打印初始化诊断行(WHO_AM_I 校验、寄存器回读)
- 静默约 5 秒 —— 陀螺零偏标定(期间模块必须静止,无串口输出属正常)
- 开始以 10Hz 打印姿态角:
R +12.3 P -5.6 Y +45.0 deg
工程结构
ICM42607/
├── Core/
│ ├── BSP/ # 自定义驱动: ICM42607.c/.h, mahony.c/.h
│ ├── Inc/ # CubeMX 生成头文件
│ └── Src/ # CubeMX 生成源码 + main.c
├── Drivers/ # STM32F1xx HAL 库 + CMSIS (自包含)
├── cmake/ # CMake 工具链文件 + CubeMX 子构建
├── CMakeLists.txt
├── CMakePresets.json # 已配置 Debug / Release 等 preset
├── ICM52607.ioc # STM32CubeMX 工程
├── STM32F103XX_FLASH.ld # 链接脚本
└── startup_stm32f103xb.s # 启动文件
构建方式
一、CMake 构建(CLion / VSCode / 命令行)
环境准备(三种方式通用)
- 安装 STM32CubeCLT(官网,含 arm-none-eabi-gcc、CMake、Ninja、OpenOCD、STM32CubeProgrammer)
- 或分别安装:GNU Arm Embedded Toolchain + CMake ≥ 3.22 + Ninja
- 将工具链
bin目录加入 PATH(cmake/gcc-arm-none-eabi.cmake从 PATH 查找arm-none-eabi-)
方式 1:CLion(推荐,参考 keysking 的教程)
CLion 已内置嵌入式开发支持,适合图形化编辑 + 一键下载调试:
- File → Open 选择项目文件夹,CLion 自动识别
CMakeLists.txt - Settings → Build, Execution, Deployment → Toolchains:新建工具链,Compiler 选择
arm-none-eabi-gcc - Settings → Embedded Development:配置 OpenOCD 路径与 ST-Link 接口
- 选择
Debug构建配置,编译后可通过 OpenOCD Download & Run 直接烧录调试
参考:keysking 图文教程《用 clion 和 stm32cube 开发 stm32》 及《【干货】CLion开发STM32轻松搞定!》《【CLion+STM32】拒绝报错,搞懂CMake才能真的爽!》系列视频;keysking 的完整入门路径见《keysking的STM32教程》。
方式 2:VSCode
- 安装扩展:CMake Tools、Cortex-Debug、串口监视器(如 Serial Monitor)
- CMake Tools 会自动识别仓库内的
CMakePresets.json,选择Debugpreset,工具链指向 arm-none-eabi - 构建后配置
launch.json使用 Cortex-Debug + OpenOCD 烧录调试(interface/stlink.cfg+target/stm32f1x.cfg) - 打开串口监视器(115200)查看姿态角输出
方式 3:命令行(适合熟悉工具链的操作者)
# 1. 配置 + 构建
cmake --preset Debug
cmake --build build/Debug
# 产物: build/Debug/ICM52607.elf (+ .map)
# 如需 .bin: arm-none-eabi-objcopy -O binary build/Debug/ICM52607.elf ICM52607.bin
# 2. 烧录 (任选其一, 需要连接 ST-Link 等调试器)
STM32_Programmer_CLI -c port=SWD -w build/Debug/ICM52607.elf -v
# openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c "program build/Debug/ICM52607.elf verify reset exit"
# st-flash write build/Debug/ICM52607.elf
二、Keil MDK 构建
本仓库默认使用 CMake 构建系统,Keil 需要从 .ioc 重新生成工程:
- 安装 Keil MDK 5 + 器件支持包(
Keil.STM32F1xx_DFP) - 用 STM32CubeMX 打开
ICM52607.ioc,Project Manager 中 Toolchain/IDE 选择 MDK-ARM,Generate Code - 打开生成的
ICM52607.uvprojx,手动添加 BSP 文件:- 新建分组(如 "BSP"),添加
Core/BSP/ICM42607.c、Core/BSP/mahony.c - Options → C/C++ → Include Paths 添加
Core\BSP(否则找不到头文件)
- 新建分组(如 "BSP"),添加
- 编译(ARM Compiler 6)→ Options → Debug 选择调试器 → 烧录运行
重新生成代码时,
main.c等文件中USER CODE BEGIN/END区块内(初始化、定时器回调、打印逻辑)及Core/BSP/目录(CubeMX 不认识的自定义目录)均不会被覆盖,可放心生成。
注意事项
- 标定时必须静止:上电后 5 秒为陀螺零偏标定(
Mahony_CalibrateGyro),期间移动会导致标定值错误 - yaw 会缓慢漂移:无磁力计,偏航角无绝对参考,长时间使用建议外接磁力计(如 AK09916)或定期重新标定
- 串口输出:115200-8N1,
R/P/Y单位度(deg) - 修改传感器量程时需同步修改
ICM42607.h中的灵敏度常数(8192 LSB/g、16.4 LSB/dps),否则姿态解算会出错