系统高可用-IWDG
为了保证设备长时间的运行有足够的稳定性,即使是出现严重的系统故障也能继续尝试重启设备,我们需要配置 IWDG。IWDG 是独立看门狗,依赖于 LSI 内部低速时钟,这可以让这个功能保证高可用,只要 MCU 有电,无论是什么外设损坏了,或者是外部时钟出现了问题,IWDG 都可以保持运行,尝试重置设备。
IWDG 依赖于 LSI,LSI 速度是 31-32kHz,且容易受到温度等因素产生偏差。

在 L 系列 MCU 上,IWDG 的最大预分频值是 256,对于 U575 来说,这个值最大是 1024。也就是说,对于 U575 上的 IWDG,能够提供最长 2 分钟(128s)的定时周期,超过这个周期仍然没有喂狗的话就会触发系统复位。那么问题来了:现在我们的休眠时长设置为 30s,自然不会出问题;如果休眠时长超过 128s 了呢?休眠无法喂狗岂不是直接导致直接复位了吗?对于这个问题我们需要查看数据手册:

数据手册的 FLASH 部分,注意第 18 位IWDG_STOP

可以看到 IWDG 是支持在休眠模式下继续运行的
所以我们需要修改 FLASH 中的配置,将 IWDG 配置为休眠时冻结,这样就不会因为休眠导致 IWDG 触发系统复位了。具体配置方法有直接通过编程写入 FLASH,或者使用 CubeProgrammer 来配置。我选择使用 CubeProgrammer。

使用 CubeProgrammer 连接 MCU,打开 OB 界面中的 User Configuration 取消 IWDG_STOP 的勾选,这样就可以实现休眠状态下的 IWDG 冻结。
低功耗实现-GPIO
想要实现极致的低功耗,还需要将所有的 GPIO 配置为 Analog 模式,这样可以免除 GPIO 漏电流的影响。由于我是在最小系统板上进行开发,没有自己打板,导致无法精确测量 MCU 的 STOP2 模式电流,只能将所有 GPIO 配置完成后认为没有漏电流影响系统的低功耗表现。实际上应该查看低功耗电流是否符合数据手册的数值,如不符合还需要检查 GPIO。
尽管没有打板,我还是使用万用表简单测量了 STOP2 模式下的系统电流表现:算上三个传感器和 LoRa 模块的情况下,休眠电流保持在 10-11mA,运行时电流快速跳到 100mA+。这个数值并不理想,如果有机会自己打板应该还有很大的优化空间。