S32K328:CM7_0 访问 CM7_2 DTCM 后门导致总线故障不精确您好,NXP团队,
我们正在使用 S32K328 和 RTD 7.x。
软件设置:
- CM7_0 运行引导加载程序。
- CM7_1 被第二个应用程序使用。
- CM7_2 不用于执行应用程序代码。
- 我们正在评估 CM7_0 是否可以通过 TCM 后门/AHBS 路径使用 CM7_2 DTCM 作为系统内存。
参考手册内容:
“内存映射”章节指出,其他主设备(包括其他 Cortex-M7 内核和 eDMA)可以通过 32 位 AHBS 接口访问 ITCM/DTCM。
“TCM 作为系统内存”部分指出,已启用的核心可以在以下情况下使用已禁用/等待的核心的 TCM:
1. 启用目标核心 TCM 控制器时钟:
MC_ME PRTN2_COFB2_CLKEN[REQ64] 适用于 Cortex-M7_2
2. 设置目标核心 CPUWAIT:
DCM_GPR DCMRWF4[CM7_2_CPUWAIT]
3. 启用目标内核时钟/访问路径:
MC_ME PRTN0_CORE4_PCONF[CCE]
我们尝试了:
1. 设置 DCM_GPR DCMRWF4[CM7_2_CPUWAIT]。
2. 设置 MC_ME PRTN2_COFB2_CLKEN[REQ64]。
3. 设置 MC_ME PRTN2_PUPD[PCUD]。
4. 应用 MC_ME CTL_KEY 序列。
5. 等待 PRTN2_PUPD[PCUD] 清除。
6. 读取 PRTN2_COFB2_STAT 并观察到 bit0/BLOCK64 处于活动状态。
7. 设置 MC_ME PRTN0_CORE4_PCONF[CCE]。
8. 设置 MC_ME PRTN0_CORE4_PUPD[CCUPD]。
9. 应用 MC_ME CTL_KEY 序列。
10. 等待 PRTN0_CORE4_STAT[CCS] 变为 1。
11. 为进行实验,暂时禁用了 MPU。
12. 尝试向 CM7_2 DTCM 后门地址进行一次 32 位写入。
观察到的结果:
- PRTN2_COFB2_STAT 表示 TCM 控制器时钟请求处于活动状态。
- PRTN0_CORE4_STAT[CCS] 变为 1。
- 首次向 CM7_2 DTCM 后门区域写入 32 位数据会导致不精确的 BusFault 升级为 HardFault。
问题:
1.对于 S32K328,从 CM7_0 可访问的正确 CM7_2 DTCM 后门/系统地址范围是什么?
2. 当 CM7_2 处于 CPUWAIT 状态时,是否支持从 CM7_0 访问 CM7_2 DTCM 后门?
3.除了 MC_ME 和 DCM_GPR 设置之外,是否还需要任何 XRDC 配置才能允许 CM7_0 写入 CM7_2 DTCM 后门?
4. 即使在测试中暂时禁用 MPU,是否也需要任何 MPU 区域?
5. 使用 TCM 后门路径之前是否需要进行任何 MSCM/MCM/XBIC/ENEDC 设置?
6.PRTN2_COFB2_STAT[BLOCK64] 是否是确认 CM7_2 TCM 控制器时钟是否活动的正确状态位?
7. PRTN0_CORE4_STAT[CCS] 是否是确认 CM7_2 时钟/访问路径是否处于活动的正确状态位?
8. 对于通过后门访问进行 DTCM ECC 初始化,从 CM7_0 写入 32 位是否足够?
9. 如果第一次后门写入导致不精确的总线故障,应该检查哪些故障/XRDC 寄存器来确定故障是由于 XRDC、互连还是未映射地址引起的?
当前目标:
我们只想验证一个最基本的冒烟测试:
- 对 CM7_2 DTCM 后门进行一次 32 位写入,
然后回读,
在考虑任何生产用途之前。
谢谢!
Re: S32K328: CM7_0 access to CM7_2 DTCM backdoor causes imprecise BusFault你好@krishna_Bugudi ,
1.
请参阅 S32K3xx_memory_map.xlsx 文件,DTCM_2 后门位于 0x21800000
2.
是
3.
无
4.
无
5.
无
6.
是的,请参阅 RM 第 3.4 节 TCM,即系统内存。
7.
是
8.
是的,请参阅 RM,表 102。内存 ECC 初始化摘要
9.
您提到XRDC已被禁用。因此,XRDC 不会报告此问题。
你要写什么地址?
此致,
丹尼尔
Re: S32K328: CM7_0 access to CM7_2 DTCM backdoor causes imprecise BusFault你好,丹尼尔,
谢谢你的确认。
我们已更新测试,使其完全按照 RM/NXP 的顺序执行,但仍然看到商店挂起。
已确认地址:
我们写信给:
0x21800000
这与 S32K3xx_memory_map.xlsx 匹配:
DTCM_2 后门:
起始地址:0x21800000
- 结束地址:0x2181FFFF
- S32K328 实现大小:128 KB
内存映射表还显示 PRAM2_TCM_XBIC 位于 S32K328 的以下位置:
0x40408000 - 0x4040BFFF
并将其描述为:
“横杆完整性检查器(PRAM2 和 TCM 后门 AHB 分线器)”
TCM_XBIC 位于 0x40400000,标记为 S32K328 保留。
最新测试序列:
1. 设置 MC_ME PRTN2_COFB2_CLKEN[REQ64]。
2. 设置 MC_ME PRTN2_PUPD[PCUD]。
3. 应用 MC_ME CTL_KEY 序列。
4. 等待 PRTN2_PUPD[PCUD] 清除。
5. 读取 PRTN2_COFB2_STAT。
观察到:
PRTN2_COFB2_STAT = 0x00000039
6. 设置 DCM_GPR DCMRWF4[CM7_2_CPUWAIT]。
回读确认:
DCMRWF4 = 0x00080000
7. 将 MC_ME PRTN0_CORE4_ADDR 设置为安全循环地址。
回读:
PRTN0_CORE4_ADDR = 0x00402408
8. 设置 MC_ME PRTN0_CORE4_PCONF[CCE]。
9. 设置 MC_ME PRTN0_CORE4_PUPD[CCUPD]。
10. 应用 MC_ME CTL_KEY 序列。
11. 等待 PRTN0_CORE4_STAT[CCS] 变为 1。
观察到:
PRTN0_CORE4_STAT = 0x00000001
12. 暂时禁用 CM7_0 MPU 进行隔离。
禁用前的 MPU_CTRL = 0x00000003
13. 尝试一次 32 位写入操作:
*(volatile uint32_t *)0x21800000 = 0u;
最新面包屑日志:
[CORE2_DTCM_SMOKE] S4B:WORD0 写入开始地址=0x21800000
商店之后的下一个面包屑导航:
[CORE2_DTCM_SMOKE] S4B1:WORD0 存储于 DSB 之前
因此,商店本身似乎在执行到以下指令之前就停滞不前或未能完成。在最新的测试中,DSB 并未达到。
问题:
既然你已经确认了这一点:
- 0x21800000 是正确的 DTCM_2 后门地址,
- 当 CM7_2 处于 CPUWAIT 状态时,支持对 CM7_0 的访问,
- 无需额外的 XRDC/MPU/MSCM/MCM/XBIC/ENEDC 设置,
- PRTN2_COFB2_STAT[BLOCK64] 是正确的状态位,
- PRTN0_CORE4_STAT[CCS] 是正确的状态位,
- 32 位写入对 DTCM ECC 初始化有效,
什么原因会导致第一次 32 位存储到 0x21800000 的操作在完成前停滞?
我们是否应该检查 S32K328 上 0x40408000 处的 PRAM2_TCM_XBIC 是否存在 TCM 后门 AHB 分路器错误?
如果可以,请您提供以下信息:
1.要读取的 PRAM2_TCM_XBIC 状态/错误寄存器。
2. DTCM_2 后门交易失败的预期错误指示。
3. 在重试访问之前是否需要任何错误清除序列。
4. 当存储操作未完成时,应捕获的任何其他 MC_ME/DCM/MSCM/XBIC/故障寄存器。
此致,
克里希那
Re: S32K328: CM7_0 access to CM7_2 DTCM backdoor causes imprecise BusFault你好,克里希纳,
Copilot 说:我已经测试过了,只有当项目中启用默认 MPU(在 system.c 中配置)时才会出现此错误。由 S32DS RTD 项目生成)。能否导出 MPU 寄存器,以验证您的项目中是否禁用了 MPU?
此致,
丹尼尔