你好
我在 FRDM-RW612 上使用 ARM TF-M 和 Zephyr(恩智浦下游 v4.3.0)时遇到了一个奇怪的错误。我想将闪存芯片的一个区域用于非安全 LittleFS 文件系统。 我按照恩智浦指南添加了一个 NS 区域(链接),并成功将该区域用于我的文件系统,Zephyr/FS API 或访问问题都没有出现。
我的问题是,当我启用 CONFIG_FLASH KConfig 选项时,我无法再重置我的板了。调用 tfm_platform_system_reset ()、nvic_systemReset (),甚至按下物理 RESET 按钮,都会锁定处理器,实际上不会再重置主板了。
我用调试器执行了一遍,在调试器脱离/断开之前执行的最后一行是 core_cm33.h:2683(在 __NVIC_SystemReset 内):
SCB->AIRCR = (uint32_t)((0x5FAUL<< SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR& SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk );
如果我在 RESET 后连接了调试器,GDB 会永远显示地址为 0x20005840 的程序。
我在一个非常基本的程序上尝试过同样的事情,即使在 zephyr hello world 程序中添加 CONFIG_FLASH 也会以同样的方式导致重置失败。
希望得到任何帮助,谢谢!
你好,@jm-streametric,希望你一切都好。
为了帮助我更好地分析这种行为,请确认在您使用 hello world 示例进行的测试中,您添加的唯一设置是否是 CONFIG_FLASH?或者,您是否也使用根据指南创建的设置(CONFIG_TFM_CUSTOM_DATA_IMPORT_REGION=y)启用了添加的 NS 区域?
我试过运行 Zephyr(下游 v4.3.0)中的你好世界示例,只添加了 CONFIG_FLASH 设置,我就能重置主板。
你好,杰克,谢谢你的解释。
RW610 和 RW612 的区别在于 RW610 不支持 802.15.4 协议,因此与 flexspi 外围设备没有区别。
请确认您是否使用 FRDM-RW612 文件来测试这些功能?或者你在 Zephyr 中为自己的板做了自己的名录了吗?
另外,你能在没有RESET功能的情况下正确运行示例吗?还是说 MCU 会在某个时刻发生故障?
嗨,杰克,谢谢你提供的信息。
那么,当你将 "CONFIG_FLASH=y" 设置添加到任何项目时,你可以正常运行应用程序,除非你尝试进行任何类型的 RESET,这会导致你的程序在地址 0x20005840 处进入无限循环,我的理解正确吗?
您能否检查重置状态寄存器 (SYS_RST_S TATUS) 以检查重置原因是否已注册?此外,您是否使用非安全版本的板完成了所有测试?
如果你有 FRDM-RW612 板,能否请你对它进行一些测试,让我知道这种行为是否存在,使用你在使用自定义板进行测试时添加的配置相同?
嗨,罗曼、
那么,当你将 "CONFIG_FLASH=y" 设置添加到任何项目时,你可以正常运行应用程序,除非你尝试进行任何类型的 RESET,这会导致你的程序在地址 0x20005840 处进入无限循环,我的理解正确吗?
是的,这是正确的。 我只能通过关闭主板的电源然后重新开启来重启程序。
您能否检查 RESET 状态寄存器 (SYS_RST_S TATUS) 以检查 RESET 原因是否已注册?
我目前正在使用 zephyr 样本 hello_world 尝试这些测试。 无论有没有配置 config_flash=Y,再加上我的自定义板或真正的 FRDM-RW612,我都无法在 SYS_RST_STATUS 上获得值。我尝试按下物理 RESET 按钮(连接到 SOC 上的 PdN),在 printf 语句之后调用 tfm_platform_system_reset (),然后通过访问空指针触发硬故障,但是这些都没有在 RESET 状态寄存器上生成值。
我尝试在 RESET 之前、在地址为 0x20005840 的回路中 RESET 之后、在 BL2 阶段 RESET 之后,不管 SYS_RST_STATUS 是 0。我不确定我检查错了吗,我使用 GDB(通过 west attach)进行调试,然后通过打印 p * ((pmu_type*) 0x40031000u) 在 PM U 区块中获得值。如果有帮助的话,当我采样时,SYS_RST_EN 寄存器始终是 0x39。
此外,您是否使用非安全版本的板完成了所有测试?
是的,我通过删除编译文件夹然后运行 w est build-b frdm_rw612/rw612/r w612/ns 来整理所有这些测试。
让我知道这种行为是否存在,使用与您在自定义板测试时添加的配置相同?
我的大部分配置都与柔性通信端口上的外设有关。 为了测试这个问题,我只留下了对TF-M配置文件所做的更改。我使用的是 TF-M medium arotless 配置文件而不是大型配置文件,这样我就可以使用 TF-M FWU 分区进行无线固件更新。为此,我有 3 个额外的 zephyr KConfig 选项:
CONFIG_TFM_PROFILE_TYPE_AROTLESS=y
CONFIG_TFM_SFN=y
CONFIG_TFM_ISOLATION_LEVEL=1
我在 TF-M 模块文件夹中编辑的唯一内容是 modules/tee/tf-m/trusted-firmware-m/platform/platform/ext/target/nxp/frdmrw612/config.cmake 中的以下配置文件设置:
设置 (TFM_PROFILE " profile_medium_arotless " 缓存字符串 " TF-M 配置文件 ")
修改自"profile_large"
谢谢您的帮助,如果我能提供更多信息,请告诉我。
嗨,杰克,谢谢你回答我的问题。
既然你提到过使用 FRDM-RW612 进行过测试,那么你能在这款主板中复制 RESET 行为吗?我已经尝试添加您的配置和 TF-M 版本更改(TF-M 配置文件),但我仍然无法重现您的行为。
如果您能够重现这种情况,请与我们分享在 FRDM-RW612 上重现这种行为的详细步骤。
你好,杰克,别担心,谢谢你让我知道了根本原因。
遗憾的是,没有重新配置闪光灯的具体指南。但是,您可以参考 RD-RW612-BGA 主板目录的结构或 IRIS-W1-EVK 主板目录(来自 U-blox)的结构,这两个目录的闪存 IC 都与 FRDM 板不同,以了解在使用不同的闪存时需要进行哪些更改。
对于 TF-M,还有 RD-RW612-BGA 非安全版主板的目录,该目录也可以作为所需更改的参考。
希望对您有所帮助!