STM32N6570-DK这块板子,第一次玩的人很容易在同一个地方翻车:你费劲把NonSecure应用编译出来,烧进去,上电一看,串口没输出、LED不闪,连调试器暂停进去,PC停在一个完全不认识的位置——NonSecure Application not run。这个"不运行"背后,其实藏着一整套Secure/NonSecure的启动协同逻辑,只有把TrustZone的隔离机制和启动链路都理顺了,才能快速定位到底是谁堵住了路。这篇文章我就从一次真实的故障排查出发,把这个问题的来龙去脉、排查步骤、修复配置和长期避坑经验一次说清楚。
如果你是从STM32F1/F4/G4这些不带TrustZone的单片机转过来的,这篇文章尤其值得看完——以前一个裸机工程搞定一切的日子,在Cortex-M55加TrustZone这套架构下已经不适用了。
1. 现象复现与问题边界界定
1.1 "not run"至少有四种完全不同的表现
很多人在群里只丢一句"NonSecure Application not run",其实这四个字的覆盖范围非常大。我至少见过四种截然不同的表现:
- 表现A:上电后板子毫无反应,LED不亮、串口无输出,调试器能连上,但PC停在复位后的早期地址,看起来像是没跑起来。
- 表现B:能连上调试器,程序跑进了HardFault_Handler,断点停在Secure侧的Fault处理函数里,系统反复进异常。
- 表现C:能进入NonSecure的main,但一旦初始化某个外设、打开某个中断,整个系统立刻卡死,有时候还会被Secure侧的看门狗复位。
- 表现D:NonSecure代码看似在运行,但跑的其实是旧的或者错误的镜像,你改了代码重新编译烧录后,行为没有任何变化。
这四种表现的技术原因各不相同:A多半是启动链条根本没走到NonSecure世界,B多半是安全属性没配置好导致跳转时触发SecurityFault,C多半是外设或中断归属有问题,D多半是烧录流程或镜像映射错了。如果不做现象界定就盲目去查代码,很容易在错误的方向上浪费大半天。
我先说明一个基本事实:在这个标题所对应的场景里,"not run"指的是NonSecure世界中的用户应用没有进入预期入口函数,而不是说CPU完全没有执行指令。因为Secure侧的固件、BootROM、安全初始化代码可能都在正常运行,只是你的NonSecure应用卡在了某道"门"外面。
1.2 我遇到的具体故障现场
我最近调一块STM32N6570-DK时遇到的情况是表现A和C