AHRS 板固件仿真与验证¶
围绕 STM32H743VIH6 航姿解算板的「烧入真机前如何提前验证」讨论复盘。 核心结论先放这:仿真省的是「算法 / 逻辑 / 协议」试错钱;硬件时序、D-Cache 缓存一致性、1000 Hz 实时性必须上真硅收口。
当前状态(一眼看懂走到哪了)¶
| 事项 | 状态 | 说明 |
|---|---|---|
| 板卡 | 🟡 已画好、打样未回 | PCB 设计完成,等样片回来才能上电 |
| SPI3 改 SLAVE+Mode3 | ✅ 已完成 | CubeMX 改 .ioc 并重新生成,blocking 项消除 |
| D-Cache/DMA 一致性修复 | ✅ 已落地 | UM982 RX 读前 Invalidate、SPI3 TX 发前 Clean,真硅必现 bug 先修 |
| L1 / SIL(gcc,真实固件零修改) | ✅ PASS | 8 路 init 全过、0 NaN/Inf、姿态跟踪真值、3680 帧 AA55 CRC 全对 |
| Keil 内置 Simulator | ❌ 不可用 | 对 STM32H7 死循环(详见 踩坑实录),别再试 |
| L2 指令级(Renode)/ L3 真板 HIL | 🟡 Renode 探索已启动 | 样片回来用真板 SWD 抓 HardFault;Renode 已开 wiki 作为空窗期 L2 路径(见 Renode 仿真验证) |
| 板级 Bring-up 清单 | ✅ 已写好 | 板级 Bring-up 与验证清单 |
我们走到哪了(一句话旅程)¶
板子还没回 → 先想「烧之前怎么验」→ 搞清了 MIL/SIL/PIL/HIL 阶梯与各类仿真工具谱系 → 把真实固件零修改编译到 PC 跑通 SIL(逻辑闭环验完)→ 想用 Keil Simulator 顶 L2 却踩死循环(已记成踩坑实录)→ 结论:空窗期仿真线先到头,剩下真硅验证等样片。
本章内容¶
- 验证策略总览(MIL/SIL/PIL/HIL 与仿真工具谱系)
- 三层验证金字塔 L1/L2/L3 各抓什么
- MIL/SIL/PIL/HIL 一把尺 + 阶段澄清(手写 C 团队为何从 SIL 起步、等价链图)
- 仿真工具四类谱系(学校 / 企业 / 军工各用什么)
- MATLAB/Simulink 到底怎么用、C 代码要不要进仿真、得到什么结果算好
- PC 端 SIL 实战(真实固件零修改跑通)
- gcc-SIL 脚手架架构、运行结果(PASS 证据表)、能抓 / 不能抓边界、一键复跑命令
- 板级 Bring-up 与验证清单
- 样片回来后的上电 / 点亮 / 逐传感器 / 融合 / 收尾全流程 + 本项目特有查缺
- 仿真踩坑实录:Keil Simulator 对 H7 不可用
- error 65 → MAP → 死循环
while ((PWR->CSR1 & PWR_CSR1_ACTVOSRDY) == 0U)全过程与正确替代路径 - MATLAB ESKF 算法验证(Phase 1)
- 独立 MATLAB ESKF 参考实现 + 数据发生器 + 验证脚本,证明 ESKF 数学收敛无误
- 三张核心图:数据流、单步循环、15 维状态布局
- 已知坑:气压计默认关闭、数据须从 body 角速度积分、函数名须与文件名一致
- Renode 仿真验证(L2 指令级)
- 官方已内置
stm32h743.repl(cortex-m7),但无.rescdemo,需自写模板 - 跑通 Keil
.axf的.resc模板 + armclang 产物的 VTOR/PC/SP 坑 - 三条路线:A 仅 MCU / B 自建传感器 C# 模型挂总线 + 合成数据喂真实 INS / C RESD 数据表
- 与 SIL/PIL/HIL 衔接、D-Cache+DMA 在 Renode 下不一定建模的提醒
- 验证矩阵与真实数据回放(L4)
- 数据真实度 × 执行载体的 2×2 矩阵:SIL / 回放评估 / PIL / HIL 各抓什么
- 真实数据回放评估不需要板子——样片回来前即可用真实噪声/磁扰/丢星数据评估
- 完整七步验证链路(MATLAB 参考 → 等价对拍 → SIL → 回放 → PIL → HIL → 地面试验)
- L4 工具链:ins_logger(板载记录)/ raw2sim(格式转换)/ replay_eval(回放判定)
- ESKF 验证与踩坑实录
- 高机动发散根因:错 F 矩阵伪耦合 + 雅可比多乘 R + 朴素协方差坍缩,被 reset_att quirk 掩盖
- 修复:标准 Solà 右误差 ESKF + Joseph 协方差 + decoupled gating(65.4s 高机动 1.82° 收敛)
- baro 消融(与姿态块解耦)、float/double 假阴性与缩放判据、MATLAB 封装 C 的坑
- MTi v2.x/v3.x 版本核对、check_mag 幅值阈值与参考向量不一致的真机隐患
下一步该干什么(做仿真?还是写 C?)¶
结论:对「算法 / 逻辑」层的仿真已到头(SIL PASS + MATLAB 验完);但 Renode 作为空窗期 L2 路径已开 wiki 探索 —— 它补的是「真实 .axf 在 H743 上跑不跑得起来」,和继续写 C 不冲突。
- ❌ 别盲目投仿真:
- Keil Simulator 对 H7 死循环(不可用,见踩坑实录);
- Gazebo/X-Plane 不跑你的固件,是数据源 / 参照系,没板子也没法闭环;
- Renode 的 **B 路线(建模 7 个外设)**工作量确实大,不急着全上 —— 但 A 路线(仅 MCU 最小系统)成本低、今天就能跑,已开 Renode 仿真验证 专门记,且和写 C 可并行。
- ✅ 该写 C(硬件无关、板回即测),可选项:
- SIL 回放框架:把合成数据源改成「回放真实采数」,让 SIL 变成可重复回归基线;
- 底板 SPI3 主机侧解析:航姿板已按 68B 帧从机输出,底板需读 → 纯 C、硬件无关;
- FRAM(SPI2)驱动:补全存储节点,硬件无关可写、暂不可测;
- SIL 加覆盖率 / 最坏执行时间(gcov + 计时桩)。
具体选哪个开干,见对话里给出的选项。