STM32F405开启安全标志后安全启动FLOW_CONTROL_CHECK校验失败问题
STM32F4安全启动流控校验失败问题原因
该问题本质是编译阶段计算FLOW_CTRL_RUNTIME_PROTECT时,你开启的安全选项对应的异或步骤没有被纳入计算链,具体触发原因通常是以下三类:
- 头文件包含顺序错误
ST官方安全启动loader的逻辑中,app_sfu.h是用户配置安全开关的入口,所有安全开关宏必须在加载FLOW_CTRL系列宏定义的头文件(通常为sfu_boot_flow.h或sfu_def.h)之前被引入。如果sfu_boot.c中先包含了FLOW_CTRL宏定义头文件,再包含app_sfu.h,那么你修改的安全开关在宏计算时还未生效,对应的异或步骤会被跳过,最终得到的FLOW_CTRL_RUNTIME_PROTECT就是未开启对应保护的旧值。 - 增量编译缓存未清理
如果你修改app_sfu.h的安全配置后没有执行全量清理编译,IDE的增量编译机制不会重新编译sfu_boot.c,生成的sfu_boot.o还是基于旧配置编译的产物,宏值自然和实际运行时的保护值不匹配。直接清理整个工程的编译产物后重新编译即可排查这类问题。 - 移植包的条件编译匹配错误
部分ST官方F4系列的SBL移植包存在疏漏,app_sfu.h中的安全开关宏,和FLOW_CTRL计算链中用来判断是否启用对应异或步骤的宏不匹配。比如你在app_sfu.h中开启的是SFU_IWDG_ENABLE,但FLOW_CTRL计算链中判断IWDG是否开启用的是SFU_PROTECT_IWDG,就会导致你开了开关,对应的异或步骤还是被跳过。
验证方法
你可以在sfu_boot.c中FLOW_CONTROL_CHECK调用的同位置,插入以下编译指令打印编译时的宏值:
// 需提前定义XSTR宏用来转义宏值 #define XSTR(x) STR(x) #define STR(x) #x #pragma message "Compile time FLOW_CTRL_RUNTIME_PROTECT: " XSTR(FLOW_CTRL_RUNTIME_PROTECT)
如果输出值确实为0x30f1,可继续打印FLOW_CTRL_DMA、FLOW_CTRL_IWDG等中间宏的编译值,就能定位到是哪一步的异或没有被纳入计算链。
内容的提问来源于stack exchange,提问作者Oddbjornik
相关产品推荐
相关产品推荐

