你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32U575 TrustZone 工程中断异常

[复制链接]
patch1582 提问时间:2026-7-9 15:50 / 未解决

我刚接触 TrustZone,学习门槛较高,还有很多知识点不熟悉。我正在调试开启 TrustZone 的工程,调试工具为 VSCode,。首先我已将 STM32U575 的 TZEN 选项字节置 1,未开启读保护。

工程的安全区程序先启动,其中断向量表基地址为 0xC0000000,目前安全区仅执行少量初始化逻辑,其中包含一段 ST 官方标准示例代码:

static void NonSecure_Init(void)

{

funcptr_NS NonSecure_ResetHandler;

SCB_NS->VTOR = VTOR_TABLE_NS_START_ADDR;

/ Set non-secure main stack (MSP_NS) /

__TZ_set_MSP_NS(((uint32_t )VTOR_TABLE_NS_START_ADDR));

/ Get non-secure reset handler /

NonSecure_ResetHandler = (funcptr_NS)(((uint32_t )((VTOR_TABLE_NS_START_ADDR) + 4U)));

/ Start non-secure state software application /

NonSecure_ResetHandler();

}

开启调试会话后,理论上这段初始化代码会先执行完毕,调试器会停在非安全区的 main 函数等待调试。

非安全区初始化 UART4,打印调试信息 Hello World,但一旦触发 UART4 发送空中断就会进入硬件错误。排查发现 UART4 的中断服务函数根本不在非安全区执行。我把 UART4 中断处理函数放到安全区后,程序计数器 PC 确实会跳转到安全区的中断函数中。

我在安全区添加了如下代码,将该中断配置为非安全中断:

NVIC_SetTargetState(UART4_IRQn);

HAL_GTZC_TZSC_ConfigPeriphAttributes(GTZC_PERIPH_UART4, GTZC_TZSC_PERIPH_NSEC);

但中断依旧匹配安全区向量表。

读取非安全区侧的SCB->VTOR寄存器,数值仍为 0xC0000000,也就是安全区向量表的映射地址。我无法区分该寄存器读取的是安全域 VTOR 还是非安全域 VTOR,也不知道该如何区分。

调试时如果手动把该寄存器值改为非安全区向量表地址 0x08080000,后续运行其他外设初始化代码时会直接触发硬件错误。

当前调试器运行状态不稳定,经常卡死,无法查看各类关键寄存器辅助定位故障。

有踩过同类坑的朋友,恳请分享排查思路与解决办法。

收藏 评论1 发布时间:2026-7-9 15:50

举报

1个回答
xmshao 回答时间:2026-7-21 12:03:53

一般来讲,你把各外设及中断的安全属性配置好,即到底在secure区还是Nonsecure区,应该没啥问题的,对寄存器不熟悉情况下,尽量使用STM32CubeMx进行配置。

下面是我基于STM32H5测试的,都是中断,TIM1 TIM3的中断,分别在不同区,还有另外的外部中断。

image.png

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版