你好、
有些模块(如 MC_ME)可以设置寄存器保护,如图 1 所示,但有些模块(如 CMU_0)则无法使用该功能,也不存在软锁定位,如图 2 所示。
另一个问题是,在受保护寄存器列表中,为什么不同模块的基地址相同?CMU0 和 CMU1 具有相同的基地址 0xFBFB0200,对吗?
嗨,彼得 、
这些是我为 MPC5746C 实现寄存器保护下锁定机制的模块。 -
0xFFFB0140, /* CMU------------*/
0xFFFB0040, /* FXOSC----------*/
0xFFFB0180, /* MC_CGM --------*/
0xFFFB8000, /* MC_ME ---------*/
0xFFFA8000, /* MC_RGM --------*/
0xFFF50000, /* MEMU_0 -------*/
0xFFFB0080, /* PLLDIG --------*/
0xFFFA0400, /* PMCDIG --------*/
0xFFFC0000, /* SIUL2 ---------*/
0xFFFB0100, /* SXOSC ---------*/
0xFFF9C000 /* LPU_CTL -------*/
我面临的问题是,如果尝试访问某些模块 GCR 和 SLB 位会引发总线错误。同样,对于那些软/硬锁正常工作的模块,我在设置几个寄存器时仍然会遇到同样的问题。我在附件中提供了两个屏幕截图样本,第一个样本正常工作,可以看到所有寄存器/镜像/SLB 和 GCR 地址都已启用,而在第二个样本中,如果尝试使用 SLB&GCR,则会出现错误。
出现这种不同行为的原因是什么?如果您需要,我可以附上寄存器/镜像/SLB 和 GCR 地址的手工计算结果。
嗨,彼得、
如果将表 2-77 中 CMU"Offset" 的值修改为 0x200、0x208、0x20C 等,我认为会更好理解。但现在我明白了,谢谢你。
顺祝商祺!
Jamber
嗨,彼得、
谢谢您的答复。现在我知道 "注释 "是什么意思了,这是一个关键点,而且我还进行了测试,效果很好。
顺祝商祺!
Jamber
你好
为方便起见,以下是可用于配置寄存器保护的宏。
/*PowerPC*/
/*-----------------------------------------------------------------------------------------------------------*/
#define REGPROTPPMIRROR 0x2000
#define REGPROTPPSLBR 0x3800
#define REGPROTPPGCR 0x3FFC
#define WRITE_WITH_LOCK_PP_8BIT(registeraddress, value)
#define WRITE_WITH_LOCK_PP_16BIT(registeraddress, value)
#define WRITE_WITH_LOCK_PP_32BIT(registeraddress, value)
#define GET_SOFTLOCK_PP(modulebaseaddress, registeraddress, value)
#define CLR_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress)
#define CLR_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress)
#define CLR_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress)
#define SET_SOFTLOCK_PP_32BIT(modulebaseaddress, registeraddress)
#define SET_SOFTLOCK_PP_16BIT(modulebaseaddress, registeraddress)
#define SET_SOFTLOCK_PP_8BIT(modulebaseaddress, registeraddress)
#define SET_HARDLOCK_PP(modulebaseaddress)
#define USER_ACCESS_FORBIDDEN_PP(modulebaseaddress)
#define USER_ACCESS_ALLOWED_PP(modulebaseaddress)
使用实例
//16k - 32 bit,CAN1
CAN_6.MCR.B.MDIS = 0x0;
WRITE_WITH_LOCK_16K_32BIT((&CAN_6.MCR.R), 0xD890000F);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
CAN_6.MCR.B.MDIS = 0x0;
CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
CAN_6.MCR.B.MDIS = 0x0;
SET_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
//SET_HARDLOCK_16k(&CAN_6);
CLR_SOFTLOCK_16K_32BIT(&CAN_6, &CAN_6.MCR.R);
GET_SOFTLOCK_16K(&CAN_6, &CAN_6.MCR.R,&testik);
CAN_6.MCR.B.MDIS = 0x1;
USER_ACCESS_FORBIDDEN_16k(&CAN_6);
GET_GCR_16K(&CAN_6,&GCRvalue);
CAN_6.MCR.B.MDIS = 0x0;
USER_ACCESS_ALLOWED_16k(&CAN_6);
GET_GCR_16K(&CAN_6,&GCRvalue);
CAN_6.MCR.B.MDIS = 0x0;
SET_HARDLOCK_16k(&CAN_6);
GET_GCR_16K(&CAN_6,&GCRvalue);
你好
注释是正确的。
所有 CMU 的基地址均为 0xFBFB_0000.
如果基地址为 0xFBFB0000,则软锁定位应该为 0xFBFB0000+0x3800=0xFBFB3800,但如下图所示,该地址仍然不可测。您能告诉我如何计算 CMU 的镜像地址、软锁地址和硬锁地址吗?
你的计算不正确。
您必须使用寄存器的基地址:0xFBFB_0200 仅适用于 CMU 模块,对于其他外设,您的基地址是模块的基地址。
因此,要软锁定 CMU0_ CSR 寄存器,需要写入 0xFBFB_2200。
锁定寄存器的地址为 0xFBFB_3880,即 CMU0_CSR。
顺祝商祺!
Peter
嗯,奇怪、
我并不知道这一点。正在考虑如何计算地址。
让我在这里测试一下,我会尽快给你答复。
顺祝商祺!
Peter
嗨,彼得、
我想我找到答案了,但我不明白。感谢您的截图,我看到了注释,上面写着" 所有 CMU 模块都在同一保护区域,基地址对齐到 16k - 0xFBFB_0000"这是什么意思?
如果基地址是 0xFBFB0000,软锁定位应该是 0xFBFB0000+0x3800=0xFBFB3800,但如下图所示,该地址仍然不可测。您能告诉我如何计算 CMU 的镜像地址、软锁地址和硬锁地址吗?
与其他模块不同,它是如此有趣。
顺祝商祺!
Jamber
嗨,彼得、
感谢您的回复。
"只有附录 A 中列出的寄存器可以被寄存器保护锁定:"令我困惑的是,CMU0 模块就在附录 A 中,但我无法访问其 SoftLock 位,我在问题中贴出了截图。
顺祝商祺!
Jamber
你好
只有附录 A 中列出的寄存器可以被寄存器保护锁定:
因此,并非所有模块中的寄存器都支持这一功能。通常它只与功能安全有关。
另一个问题是,在受保护寄存器列表中,为什么不同模块的基地址相同?CMU0 和 CMU1 具有相同的基地址 0xFBFB0200,对吗?
这是手册中的复制粘贴错字,请查阅手册附录:
地址如下
#define CMU_0 (*(volatile struct CMU_tag *) 0xFBFB0200UL)
#define CMU_1 (*(volatile struct CMU_tag *) 0xFBFB0240UL)
#define CMU_2 (*(volatile struct CMU_tag *) 0xFBFB0280UL) #define CMU_3 (*(volatile struct CMU_tag *) 0xFBFB02C0UL)
#define CMU_3 (*(volatile struct CMU_tag *) 0xFBFB02C0UL)
#define CMU_4 (*(volatile struct CMU_tag *) 0xFBFB0300UL)
顺祝商祺!
Peter
谁能帮帮我?
I 测试 MC_ME、CMU、ADC、CTU、PWM,只有 CMU 设置软锁定失败,其他模块可成功设置软锁定。为什么?