# MSPM0高精度单轴-六轴串口陀螺仪 **Repository Path**: louisaerdsai/MSPM0_IMU ## Basic Information - **Project Name**: MSPM0高精度单轴-六轴串口陀螺仪 - **Description**: MSPM0高精度单轴-六轴串口陀螺仪,固件源码带iap和上位机和使用手册 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2026-10-22 - **Last Updated**: 2026-11-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # ICMM0 串口陀螺仪固件 MSPM0G3507 上的单轴 / 六轴姿态模组固件,对外提供 UART 与 I²C 两套接口。 固件只有一份:上电自动探测板载传感器,按探测结果加载单轴或六轴路径,无需按轴型分别出包。 | 轴型 | 传感器 | 对外寄存器契约 | |---|---|---| | 单轴 | XV70xx(Z 轴陀螺,4 线 SPI) | 单轴格式(35 项寄存器) | | 六轴 | LSM6DSOWTR(6 轴 IMU) | 标准格式(11 字节帧) | - MCU:MSPM0G3507SRHBR(Cortex-M0+ @32 MHz,128 KB Flash / 32 KB SRAM) - 许可证:**MIT**(见 `LICENSE`) - 升级:内置明文 IAP 引导程序,串口即可升级 --- ## 1. 目录结构 ``` code/ ├── main.c 入口 + 中断向量转发 ├── ti_msp_dl_config.c/h TI 模板改造版(引脚/外设初始化,生成物已入库) ├── iap/ IAP 引导程序(独立构建,见 §5) ├── app/ │ ├── app_main.c/h 初始化 + 主循环 + 输出调度 │ ├── app_axis1.c/h 单轴应用层(1 kHz 采样 → 算法 → 0x52/0x53) │ └── app_data.h 全局数据快照(算法 ↔ 协议共享) ├── bsp/ │ ├── bsp_spi.c/h SPI0 抽象:共享三线 + 软件片选 │ ├── bsp_imu.c/h 六轴 IMU 驱动 │ ├── bsp_gyro_axis1.c/h 单轴陀螺驱动(4 线 SPI) │ ├── bsp_uart.c/h 串口 + 双环形缓冲(TX 入队即发) │ ├── bsp_i2c_slave.c/h I²C 从机(16-bit 寄存器寻址) │ ├── bsp_led.c/h 状态灯(PA8,高有效) │ └── bsp_tick.c/h SysTick 时基 + 采样节拍 ├── algo/ │ ├── algo_rate.c/h 单轴角速率积分 + 零偏补偿 │ ├── algo_fusion.c/h 互补滤波 + 自适应增益(六轴) │ ├── algo_quat.c/h 四元数与欧拉角 │ ├── algo_calib.c/h 零偏标定 / 静态判定 │ ├── algo_autocal.c/h 零偏自动校准状态机 │ ├── algo_axis.c/h 安装方向映射 │ └── algo_types.h 公共数据结构 ├── param/ │ ├── param_core.c/h 参数模型 + Flash 持久化(A/B 双份 + CRC + 版本校验) │ ├── param_axis1.c/h 单轴寄存器模型 │ └── param_std.c/h 标准格式寄存器视图 ├── proto/ │ ├── proto_tx.c/h 上行组帧(0x55 + DataID + 4×int16 + SUM) │ └── proto_rx.c/h 下行解析(0xFF 0xAA ADDR L H) ├── math/ma_wrap.c/h 数学封装(float 接口,可切 MATHACL) ├── cfg/ 协议表、编译期配置、版本号、OTA 共享定义 │ ├── ax1_device.h XV70xx 器件常量(寄存器 / 时序 / 标度) │ ├── ax1_rate_tune.h 单轴积分器整定参数 ├── tools/icmm0_pack.py 固件打包器(生成 IAP 升级文件) └── build/ticlang/ makefile / makefile.iap / release.cmd / 链接脚本 ``` --- ## 2. 对外协议要点 ### 2.1 标准格式(11 字节帧) **上行**(模组 → 主机,主动流式推送) | DataID | 内容 | D4 | |---|---|---| | `0x51` | 加速度 | 温度 | | `0x52` | 角速度 | 温度 | | `0x53` | 角度 | 温度 | | `0x59` | 四元数 | — | | `0x5F` | 寄存器值 | — | `SUM = 前 10 字节累加 & 0xFF`;温度 `T = raw/100 ℃`。 **下行**(主机 → 模组):`0xFF 0xAA ADDR L H`(配置类**不回包**) **读寄存器**:`0xFF 0xAA 0x27 RegL RegH` → 回 `0x55 0x5F + 4×int16 + SUM` **实现的寄存器**:`0x00` SAVE | `0x01` CALSW | `0x02` RSW | `0x03` RATE | `0x04` BAUD | `0x1A` IICADDR | `0x1B` LEDOFF | `0x23` ORIENT | `0x27` READADDR | `0x2E` VERSION;其余静默忽略。 ### 2.2 单轴格式(5 字节帧) 上行 `5A `,`type`:`0xAA` 角速度、`0xBB` 角度、`0xCC` 索引读回。 下行 `55 AA `;索引读 `55 AA 08 00`。 寄存器表 35 项,地址空间 `0x00..0x7F`,未定义地址读 0。 ### 2.3 兼容格式 另识别 `55 AA …` 下行与 `5A` 上行(11 字节)。收到合法旧格式帧即锁存,收到 `FF AA` 帧切回标准格式(运行期状态,不持久化)。 ### 2.4 I²C 从机 地址 `0x50`(寄存器 `0x1A` 可改,重启生效),16-bit 寄存器地址(先高后低)、数据小端;写支持地址自增连续写,读经 Sr 且自动递增。六轴映射标准格式寄存器表、单轴映射单轴寄存器表;未实现寄存器返回 `0`。 读阶段靠**时钟延展**保证不丢字节:TX FIFO 空时从机拉低 SCL,主循环按 `SSR.TREQ`(主机正在取数)补下一个 16-bit 字后放行。 因此**主机必须支持时钟延展**;读操作必须用重复起始(写寄存器地址 → Sr → 读),两次独立事务会从寄存器 0 开始返回。 ### 2.5 私有扩展 | 寄存器 | 说明 | |---|---| | `0x77` SETYAW | 设置当前 yaw,编码与上行角度一致,不打断积分、不落盘 | | `0x7E` BUILD | 固件构建号(只读) | | `0x7B/0x7C/0x7D` | 三轴零偏自动校准状态(低 3 位状态码,高 5 位拒绝原因) | --- ## 3. 引脚分配 | 功能 | 引脚 | 说明 | |---|---|---| | I²C0 SDA / SCL | PA0 / PA1 | 对外从机 0x50,板载 4.7 kΩ 上拉 | | SPI0 POCI / PICO / SCK | PA4 / PA5 / PA6 | mode3,8 MHz | | IMU 片选 | PA3 | **软件 GPIO 控制**(默认高) | | IMU INT1 | PA7 | 可选 | | LED | PA8 | 高有效;正常 1 Hz 心跳,异常常亮 | | UART0 TX / RX | PA10 / PA11 | 默认 **115200** 8N1 | | SWDIO / SWCLK | PA19 / PA20 | 调试 | | ROSC | PA2 | 100 kΩ,FCL 用(**不可作 GPIO**) | | BSL_INV | PA18 | 常态须为低(10 kΩ 下拉) | --- ## 4. 构建 ### 4.1 依赖 | 组件 | 版本 | 说明 | |---|---|---| | MSPM0 SDK | 2.03.00.07 | 提供 driverlib 与启动文件 | | TI ARM Clang | 5.1.1.LTS | `tiarmclang` / `tiarmobjcopy` | | SysConfig | —— | 构建**不需要**(生成物已入库) | | Python 3 | ≥ 3.8 | 仅打包工具使用 | 路径通过环境变量或 make 变量覆盖: ```bash export MSPM0_SDK_INSTALL_DIR=/path/to/mspm0_sdk_2_03_00_07 export TICLANG_ARMCOMPILER=/path/to/ti-cgt-armllvm_5.1.1.LTS ``` ### 4.2 构建 ```bash cd code make -f build/ticlang/makefile ``` 产物:`build/ticlang/icmm0.out`(+ `.map` / `.hex` / `.bin`) > **改动头文件或配置宏后请加 `-B` 全量重建。** ### 4.3 为什么 `ti_msp_dl_config` 是改造版 在 SysConfig 1.28.1 + SDK 2.03 下,SPI 模块无法生成 driverlib 代码,且 SPI0 会强制占用 PA3(与 GPIO 片选冲突)。因此本工程以 SysConfig 生成物为骨架,改造出 `ti_msp_dl_config.c/h`:PINCM 编号与 PF 功能值取自器件头文件并逐项核对;SPI 片选从外设 CS 改为 GPIO 软件控制。 | 引脚 | PINCM | 功能 | |---|---|---| | PA0 / PA1 | 1 / 2 | `I2C0_SDA` / `I2C0_SCL` | | PA3 / PA4 / PA5 / PA6 | 8 / 9 / 10 / 11 | `SPI0_CS1_POCI1` / `POCI` / `PICO` / `SCLK` | | PA8 | 19 | GPIO(LED) | | PA10 / PA11 | 21 / 22 | `UART0_TX` / `UART0_RX` | ### 4.4 型号 ID VERSION 寄存器(`0x2E`)默认回本产品自定义值 `0x0001`(单轴)/ `0x0002`(六轴),定义在 `cfg/project_config.h`。联调时可用 `-DICMM0_MODEL_ID_AX1=...` / `-DICMM0_MODEL_ID_AX6=...` 覆盖。 --- ## 5. IAP 与固件升级 ### 5.1 Flash 分区 ``` 0x0000_0000 ┌──────────────────────┐ │ IAP 引导程序 12 KB │ 本工程 iap/ 独立编译 0x0000_3000 ├──────────────────────┤ │ 包头区 4 KB │ 128 B 包头 + 填充 0x0000_4000 ├──────────────────────┤ │ App 64 KB │ 应用固件 0x0001_4000 ├──────────────────────┤ │ 参数区 48 KB │ 升级不触碰 0x0002_0000 └──────────────────────┘ ``` ### 5.2 构建 IAP ```bash make -f build/ticlang/makefile.iap ``` ### 5.3 打包与升级 ```bash # 打包:裸 bin → 升级文件 python tools/icmm0_pack.py pack --in build/ticlang/icmm0.bin \ --out build/dist/icmm0_v1.0.0.bin --ver 1.0.0 # 查看包头 python tools/icmm0_pack.py info --in build/dist/icmm0_v1.0.0.bin ``` 升级串口协议(明文,115200 8N1): | 步骤 | 主机发送 | IAP 回应 | |---|---|---| | 查版本 | `check_vision`(12 B) | `IAP_vision_1.0.0` | | 请求升级 | `updata_prepare`(14 B,命令字如此) | `Updata_prepare_finish` | | 灌数据 | 4 KB 头块(128 B 包头 + 3968 B 填充)+ 固件流 | 无回应 | | 完成 | — | `Updata_Success` / `Updata_Fail` | > 回应字符串按 `sizeof` 发送,**含末尾 `\0`**(如 `IAP_vision_1.0.0` 实发 16 字节)。 > > **发送端必须控速:每块 ≤64 B,块间 ≥8 ms。** > 本板 UART RX FIFO 仅 4 字节,且写 Flash 期间不轮询接收;块越大丢得越多—— > 实测 **256 B / 10 ms 会稳定丢 9 字节**,导致累加和校验失败(`Updata_Fail`)。 > IAP 侧已把单次写入限制为 `IAP_WRITE_CHUNK`(64 B,见 `iap_config.h`), > 但发送端仍须按上述参数,否则 19704 B 的镜像仍会出错。 > 按 64 B / 8 ms 实测:19704 B 用时约 2.7 s,校验一次通过。 ### 5.4 App 侧进入 IAP 主机发送 `A5 5A 01` → App 写 RAM 标志 `0xAA96BB97` 到 `0x2020_0000` → 软复位 → IAP 驻留升级模式。 --- ## 6. 运行时结构 ``` 中断层(只搬运/置标志) SysTick 1ms → 分频出采样节拍 UART RX → rx_ring;UART TX → tx_ring(入队即启动) I²C 从机(START/STOP/阈值中断 + 主循环按 TREQ 补 FIFO,FIFO 空时硬件延展 SCL) 主循环 采样节拍 → 读 IMU → 安装映射 → 扣零偏 → 融合 → 欧拉角 → 快照 → 按 RSW/RATE 分频输出 轮询下行指令(含 0x27 读寄存器回包) I²C 从机轮询(搬 RX、TREQ 时补 TX) 处理 save/restart/factory/calib/yawzero/baud 标志 ``` **关键设计**: - 采样与输出解耦:改 RATE 不影响融合 - TX 入队即发(含 kick),控制回复不受节拍约束 - 丢拍检测:节拍间隔 > 1 时按倍率补偿 dt(应对 Flash 写入) --- ## 7. 参数与标定 - 参数区 A/B 双份 + CRC32 + 版本校验;版本不符或双份皆坏时恢复出厂值。 - 单轴零偏:开机种子来自 `GYROBAIS`,运行期由静止窗估计器持续维护并回写。 - 静止检测、零偏估计、积分与角度归一化的门限集中在 `cfg/project_config.h`,可按器件与安装方式重新标定。 --- ## 8. 已知限制 | 项 | 说明 | |---|---| | XV70xx 量程 | 本板实测片型额定 ±400 °/s(70 LSB/(°/s));超限即削顶,软件不可恢复 | | 静止零偏 | 受温度与器件个体差异影响,长时间静置仍有缓慢漂移 | | IAP 完整性 | 明文传输 + 32 位回绕累加和,无签名、无版本防护,可刷任意固件 | | 六轴标度 | 陀螺分母 28571 为标称值,精密应用需转台标定 | | 温补 | 未实现,需高低温箱标定 | --- ## 9. 构建依赖与商标 - 构建依赖 TI MSPM0 SDK 与 TI ARM Clang,按 TI 的许可条款使用。 - 文中出现的器件型号(MSPM0G3507、XV70xx、LSM6DSO)仅用于说明硬件兼容性, 相关商标归各自权利人。 - 本产品与上述器件厂商无隶属、授权或认证关系。 ## 10. 许可证 MIT。见 `LICENSE` 与 `NOTICE`;`build/ticlang/` 下三个 TI 文件为 BSD-3-Clause。