Bring-up防烧器件的三道保险
2026/7/22 21:57:24 网站建设 项目流程

一句话: 调试昂贵器件时,三个不到十行的锁——编译期硬件禁用、状态机温控联锁、Flash 安全默认值——各自防住不同阶段的故障,一个锁漏了下一个还能兜。

适合谁读:调试带昂贵器件的板子、做 Bring-up 的嵌入式开发者。

背景

调一台光源设备,MCU 控三路激光加一路光放大。激光器一颗几千块,三颗就是上万。

固件写完,0 Error 0 Warning。通电之前问自己:万一代码有 Bug,最坏会发生什么?

答案:Flash 是空的 → 读出来 NaN → 转成整型可能是满量程 → 电流直接打满 → 几秒烧毁。

于是加了三个锁。

第一锁:硬件使能编译期锁死

调试阶段,你在验证 SPI 通信、DAC 输出、ADC 读数。DAC 通道还没验证过,温控芯片收到的电压可能完全是错的。如果硬件意外开了,没人知道它在干嘛。

用宏直接把使能引脚在编译期干掉:

#define HW_DEBUG_DISABLE 1U // 1=禁止硬件输出, 0=正常 #if HW_DEBUG_DISABLE #define HW_ENABLE ((void)0) // 编译后直接消失 #else #define HW_ENABLE GPIO_SetBits(GPIOD, GPIO_Pin_1) #endif

效果:触摸屏上点"开启"、上位机发指令、自动序列触发——所有代码路径全部被编译期截断。引脚纹丝不动。

只有亲自确认 DAC 输出正确、接线正确、控制环调好,才把这行1U改成0U。想绕过?改代码重编译,没别的路。

第二锁:序列状态机

硬件稳了才能开输出。代码里是硬编码的五态序列:

空闲 → 加热A等待 → 加热B等待 → 输出点亮等重新稳 → 闭环运行

关键在第四态的跳转条件:

// 输出已亮,等温控重新稳定后才能进闭环 if (ptSet->eState == STATE_STABLE) { Pid_Init(ptSet, ptSet->fTarget); ptSet->eSeq = SEQ_RUN; }

如果eState不是STABLE——不管是硬件坏了、还是还在加热——这段代码都不执行。序列永远停在当前态,输出可能亮了但闭环不会开。

不是 Bug,是刻意设计的安全联锁。

第三锁:Flash 安全默认值

Flash 擦除后全是0xFF。四个字节0xFFFFFFFF用 IEEE 754 解析是 NaN。NaN 强转成整型的行为是未定义的——可能是 0,也可能是满量程。如果是满量程,电流直接打满。

这是个概率性炸弹,取决于编译器怎么处理。测十次可能十次都是 0,第十一次换个优化等级就炸。

解法:上板第一步,往 Flash 预写安全默认值——所有通道设到阈值以下的最小值。就算意外触发,输出也不会真的起来。等标定数据有了再覆盖。

三个锁各防什么

防什么没它会怎样
编译期宏调试阶段硬件意外开启硬件失控
序列状态机硬件故障、传感器断线没温控直接开输出
Flash 预填Flash 被意外触发读取NaN → 满量程

三个锁是链条,各有各的边界条件。一个漏了,下一个还能兜。

Bring-up 流程

整个 Bring-up 分阶段,每阶段过了才开下一道锁:

阶段 0:上电前万用表查短路 阶段 1:MCU 最小系统 + 串口通信 阶段 2:SPI 多片子验证(硬件锁开着) 阶段 3:温控验证 + 判稳调参 ← 过完改 HW_DEBUG_DISABLE=0 阶段 4:小电流出光 + 标定 阶段 5:发光序列联调(序列锁生效) 阶段 6:开环标定 阶段 7:闭环调优 阶段 8:全功能 + 长稳测试 阶段 9:发货前看门狗改启用

每一阶段先确认通过,再解锁下一道。烧一颗器件比跳过十步省的时间贵。


有用的话点个收藏,下次调试直接用。有问题欢迎评论区交流,看到了都会回。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询