[信息] LAT1554 STM32N6 访问TCM时产生Hard Fault的原因与解决方法

[复制链接]
755|0
STM新闻官 发表于 2025-10-29 22:56 | 显示全部楼层 |阅读模式
, , , ,
本帖最后由 STM新闻官 于 2025-11-1 19:07 编辑

1. 引言
客户在使用 STM32N6 开发的过程中,遇到了访问 DTCM 时产生 Hard Fault 的问题。在本文中,我们使用 IAR V9.40.2 对 STM32N6 FSBL 工程进行测试,复现问题,解释原因并给出了解决办法,供遇到该问题的客户参考。另外请注意 STM32N6 BootROM 是安全启动,意味着其跳转的 FSBL 总是安全的,文中的内存地址(DTCM, ITCM)使用的均是安全地址。

2. DTCM 访问 Hard Fault
2.1.  复现问题
STM32N6 中 DTCM 基础区的安全地址为 0x3000 000。下面是一段简单的测试程序。在一个简单的 FSBL 工程的 main.c 文件中,声明 pDTCMData,unsigned int32 数据指针,指向 DTCM 内存首地址,用来访问 DTCM,32 位数据访问可以避开由于数据未对齐产生 Hardfault 问题。代码如下:


7312769022acb7c5c0.png

9780569022ad814e3b.png

测试过程中,当读取 DTCM 数据时,很容易产生 Hard Fault 中断。当 Hard Fault 中断产生时,查看 Cortex-M55 内核寄存器 AFSR(Auxiliary Fault Status Register,见下图 1),可以看到 PECC(17 位)为 1,查阅手册 PM0273(STM32 Cortex®-M55 MCUs programming manual),该位的解释为“Precise fault caused by uncorrectable ECC error”类型为 RO, 即读取内存(TCM)时产生了 ECC 校验错误。

图 1. STM32N6 Cortex-M55 内核寄存器 AFSR

583169022b07e68f6.png

STM32N6 Cortex-M55 TCM 管理接口中, DTCM 基础区与 ITCM 基础区都带有 ECC校验,这正是我们测试时产生 Hard Fault 的原因。在上电复位时,DTCM 基础区和ITCM 基础区中的数据是随机的,未做数据清除或数据初始化,直接读取时,不可纠正ECC 错误是有极大概率发生的,并由此引发 Hard Fault 中断。内存访问造成 Hard Fault的原因可能还有其它方面,比方内存对齐错误,我们的测试并非这种情况。除此之外,需要注意的一种场景是 PPOISON @AFSR 标志位为 1 的情况,也是由于内存访问硬件错误造成的。有关更多 AFSR 状态寄存器的信息,可以参考 ARM 官方资料:Arm Cortex-M55 Processor Technical Reference Manual r0p2。

2.2. 解决办法
在“<工程>\EWARM\startup_stm32n657xx_fsbl.s中添加下面代码(黄色部分),用于清零DTCM,注意STM32N6手册中,DTCM基础区的大小为128K Bytes。
781306905e9a60ff62.png
使用如上代码,对DTCM进行清零(或初始化)后,main函数中的DTCM访问正常,可读可写,多次测试,Hard Fault问题得以消除。

2.3. TCM 除了DTCM,STM32N6的ITCM基础区同样带ECC校验,其安全地址为0x1000 0000, 大小为64K Bytes,访问前也需要先初始化它。STM32N6使用的是 Cortex-M55 内核,该内核的TCM 接口包括一个 39 位(32 个有效数据位 + 7 个 ECC 保护位)ITCM和四个并行 39 位 DTCM接口。STM32N6中内嵌的RAM(AXI访问)的前半部分中的FlexRAM(400KB)可以灵活扩展为ITCM和DTCM,见下图2(图中的地址是非安全地址,FSBL中访问时需要变换为安全地址,扩展DTCM的起始地址为0x3002 0000,扩展ITCM的开始地址为0x1001 0000)。如果将FlexRAM扩展为ITCM和DTCM,由于内核接口是带ECC的接口,在读取这两部分TCM扩展区时,也需要注意内存访问硬件故障问题,即需要对其进行初始化(可以参考HAL API HAL_RAMCFG_StartECC了解 扩展TCM ECC的使用)。

图2. STM32N6 FelxRAM 扩展
164346905e9d1f4123.png
3. 小结
本文介绍了STM32N6 TCM访问时产生内存访问硬件故障并引发Hard Fault中断的原因与解决方法,需要注意的还包括FlexRAM 的扩展TCM情况。由于STM32N6中Cortex-M55 内核TCM接口为39位接口(32 个有效数据位 + 7 个 ECC 校验位),上电复位后TCM数据随机性会造成直接读取时的ECC错误,因此需要在读取TCM前进行初始化,请使用时加以注意。

参考文献
770106905e9f58efe3.png

您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:意法半导体(中国)投资有限公司
简介:您的嵌入式应用将得益于意法半导体领先的产品架构、技术、多源产地和全方位支持。意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器。

1428

主题

1758

帖子

25

粉丝
快速回复 在线客服 返回列表 返回顶部