1. 测试复现环境与前置条件
硬件:NUCLEO‑H563ZI 开发板;需要示波器或者逻辑分析仪用于观测 GPIO/PWM 波形。
软件:STM32CubeMX v6.17.0、STM32CubeIDE v2.1.1。
前置操作:选项字节开启 TrustZone;Bank1 配置 Secure 区域,Bank2 配置 Non‑secure 区域。
资料获取:实战经验 | LAT1718 STM32H563启用TrustZone和FreeRTOS后中断无法抢占的原因分析
2. CubeMX 完整工程配置步骤
- 新建工程选择芯片 STM32H563ZIT6;弹窗选择
with TrustZone activated,生成双域工程。 - 系统时钟配置 250MHz;APB1 时钟 250MHz。
- 修改 timebase 源:Non‑secure 侧 timebase 源切换为 TIM16;Secure 侧 timebase 源切换 TIM17;禁止继续使用 SysTick 作为时基,防止与 FreeRTOS 冲突。
- TIM2 配置 PWM 输出:周期 100μs,占空比 50%;TIM3 配置 PWM 输出,周期 30μs,占空比 50%;用于产生定时更新中断。
- 配置观测 GPIO 引脚:
IS_PORT_START:标记 RTOS 调度器启动时刻;- SEV 引脚配置 EVENTOUT 模式,标记精确事件点;
TIM2_IRQ、TIM3_IRQ:标记中断进出时序电平。
- 中间件配置 X‑CUBE‑FREERTOS,Secure 上下文 RTOS Core 选择
TZ_Secure;Non‑secure 上下文 RTOS Core 选择TZ_Non_Secure;两侧勾选 CMSIS‑RTOS2;Non‑secure 添加测试空任务。 - NVIC‑NS(非安全 NVIC)配置:优先级分组设置 4bit 抢占优先级;TIM2 全局中断抢占优先级 = 1;TIM3 全局中断抢占优先级 = 0;关闭 HAL Handler 自动生成,直接使用原始 IRQHandler 入口。
3. 软件代码要点
- 中断服务函数内部添加 NOP 延时、SEV 指令、GPIO 翻转,方便波形观测,降低 HAL 库带来额外开销。
- main 函数(Non‑secure 侧)逻辑顺序:
- 初始化外设、GPIO、TIM;
- 使能 TIM2、TIM3 Update 中断,启动 PWM 输出;
- 执行
HAL_Delay(3000),延时 3 秒,用于观察 RTOS 启动之前的抢占行为; - 将
IS_RTOS_START引脚置高; - 执行
osKernelInitialize()、MX_FREERTOS_Init(); - 调用
osKernelStart()启动 RTOS 调度器。
4. 现象观测验证方法
使用示波器采集 PWM 波形、IS_RTOS_START、TIM2_IRQ、TIM3_IRQ、SEV 事件脉冲:
- IS_RTOS_START 为低电平(RTOS 未启动,AIRCR.PRIS=0):TIM3 优先级 0 可以抢占 TIM2,波形可以看到 TIM2 中断执行期间被 TIM3 打断。
- IS_RTOS_START 变为高电平,执行 osKernelStart 之后,AIRCR.PRIS 置 1:TIM3 中断到来,TIM2 正在执行;不会发生抢占,TIM3 等待 TIM2 中断执行完毕才执行。
对比两段波形,即可确认故障现象复现。
5 工程落地检查清单
- 确认芯片选项字节 TrustZone 功能已经开启;CubeMX 工程为
with TrustZone activated模式。 - Secure、Non‑secure 两侧 FreeRTOS Core 的 TZ 模式配置正确。
- SysTick 不作为 HAL 时基,Secure/Non‑secure 两侧替换为定时器 TIM17/TIM16。
- 确认 NVIC 优先级分组配置;确认目标中断运行在 Non‑secure 域。
- 确认故障现象只发生在
osKernelStart()执行之后;启动调度器前抢占行为正常。 - 核对中断优先级:相邻优先级(0&1、2&3 等)会映射同一组优先级,不能互相抢占。
- 区分 Secure 中断与 Non‑secure 中断,Secure 中断不受 PRIS 位映射规则影响。
工程附件:LAT1718 附带
STM32H563 启用TrustZone和FreeRTOS后中断无法抢占的原因分析_SP_v0.1.zip参考工程。
6. 业务落地应用场景
STM32H5 系列具备 TrustZone 硬件安全隔离,多用于高安全性、高实时性的嵌入式产品:
- 工业控制器:工业 IO、运动控制,多路实时中断,部分业务逻辑运行 Non‑secure 域;开启 TrustZone 做固件安全防护;相邻优先级中断出现抢占失效会造成 IO 控制异常。
- 安全物联网终端:加密、密钥存储放在 Secure 域;业务逻辑、外设驱动运行 Non‑secure 域;使用 FreeRTOS 操作系统。
- 功能安全类设备:依赖中断抢占完成故障快速响应;该隐性问题会直接影响故障响应时间,需要在系统设计阶段就考虑优先级映射压缩。
- 网关、通信设备:多路 UART/CAN 以太网中断,依赖中断优先级做事件分级;开启 TrustZone 后有效抢占优先级减半。
产品关键点:启用 TrustZone 搭配 FreeRTOS,Non‑secure 域可用抢占优先级由 16 级下降为 8 级,软件设计时优先级规划必须按照 8 级来设计,而不是 16 级。
7. 典型踩坑现象汇总
- CubeMX 配置中断优先级 0、1,仿真看 NVIC 寄存器写入正确,高优先级中断无法抢占低优先级中断。
- RTOS 启动之前抢占正常,RTOS 跑起来之后抢占失效;测试人员容易忽略启动前后差异。
- 工程师只读取 NVIC_IPRn 寄存器数值,寄存器没有变化,误以为硬件 bug。实际是内核内部做优先级映射。
- 混淆 Secure 与 Non‑secure 域:把中断放在 Secure 域测试抢占正常;同样优先级挪到 Non‑secure 域抢占失效。
- 沿用无 TrustZone 工程的中断优先级分配表,没有考虑优先级数量减半,相邻优先级分配给需要互相抢占的中断。
8. TrustZone+FreeRTOS 中断系统开发最佳实践
- 开启 TrustZone+FreeRTOS 的前提下,Non‑secure 域按 8 级有效抢占优先级规划中断,不要使用相邻数字优先级(不要同时用 0 和 1,2 和 3);需要互相抢占的中断间隔至少为 2。
- 分清中断归属域:高紧急度中断,如故障类中断,可以放置 Secure 安全域,不受 PRIS 映射约束;普通业务外设中断放在 Non‑secure 域。
- 测试验证必须在
osKernelStart()调度器启动之后验证抢占行为,不能仅看初始化阶段的现象。 - 调试排查思路:确认 TrustZone 是否开启;确认中断运行的安全域;观察 AIRCR.PRIS 寄存器状态;核对映射之后的组优先级。
- 系统设计评审,把
AIRCR.PRIS=1优先级映射规则纳入评审项,不能直接复用普通 Cortex‑M33 无 TrustZone 项目的中断优先级方案。
阅读全文
194