1261074_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1261074_zh-CN

1261074_zh-CN

MPC5744 寄存器保护

你好、

有些模块(如 MC_ME)可以设置寄存器保护,如图 1 所示,但有些模块(如 CMU_0)则无法使用该功能,也不存在软锁定位,如图 2 所示。

另一个问题是,在受保护寄存器列表中,为什么不同模块的基地址相同?CMU0 和 CMU1 具有相同的基地址 0xFBFB0200,对吗?


2021-04-13_151624.png

 

2021-04-13_151502.png

 

2021-04-13_152957.png

 

Re: MPC5744 Register Protection

嗨,彼得 、

这些是我为 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 地址的手工计算结果。

Re: MPC5744 Register Protection

嗨,彼得、

如果将表 2-77 中 CMU"Offset" 的值修改为 0x200、0x208、0x20C 等,我认为会更好理解。但现在我明白了,谢谢你。

2021-04-16_184156.png

 

顺祝商祺!

Jamber


Re: MPC5744 Register Protection

嗨,彼得、

谢谢您的答复。现在我知道 "注释 "是什么意思了,这是一个关键点,而且我还进行了测试,效果很好。

顺祝商祺!

Jamber

Re: MPC5744 Register Protection

你好

为方便起见,以下是可用于配置寄存器保护的宏。

/*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);
Re: MPC5744 Register Protection

你好

注释是正确的。

所有 CMU 的基地址均为 0xFBFB_0000.

如果基地址为 0xFBFB0000,则软锁定位应该为 0xFBFB0000+0x3800=0xFBFB3800,但如下图所示,该地址仍然不可测。您能告诉我如何计算 CMU 的镜像地址、软锁地址和硬锁地址吗?

你的计算不正确。

您必须使用寄存器的基地址:0xFBFB_0200 仅适用于 CMU 模块,对于其他外设,您的基地址是模块的基地址。

petervlna_1-1618563997092.png


petervlna_0-1618563954927.png

因此,要软锁定 CMU0_ CSR 寄存器,需要写入 0xFBFB_2200。

锁定寄存器的地址为 0xFBFB_3880,即 CMU0_CSR。

顺祝商祺!

Peter


Re: MPC5744 Register Protection

嗯,奇怪、

我并不知道这一点。正在考虑如何计算地址。

让我在这里测试一下,我会尽快给你答复。

顺祝商祺!

Peter

Re: MPC5744 Register Protection

嗨,彼得、

我想我找到答案了,但我不明白。感谢您的截图,我看到了注释,上面写着" 所有 CMU 模块都在同一保护区域,基地址对齐到 16k - 0xFBFB_0000"这是什么意思?

如果基地址是 0xFBFB0000,软锁定位应该是 0xFBFB0000+0x3800=0xFBFB3800,但如下图所示,该地址仍然不可测。您能告诉我如何计算 CMU 的镜像地址、软锁地址和硬锁地址吗?

与其他模块不同,它是如此有趣。

2021-04-15_164430.png

2021-04-15_164141.png

顺祝商祺!

Jamber

 

 


Re: MPC5744 Register Protection

嗨,彼得、

感谢您的回复。

"只有附录 A 中列出的寄存器可以被寄存器保护锁定:"令我困惑的是,CMU0 模块就在附录 A 中,但我无法访问其 SoftLock 位,我在问题中贴出了截图。

顺祝商祺!

Jamber

Re: MPC5744 Register Protection

你好

只有附录 A 中列出的寄存器可以被寄存器保护锁定:

petervlna_0-1618472142468.png

因此,并非所有模块中的寄存器都支持这一功能。通常它只与功能安全有关。

另一个问题是,在受保护寄存器列表中,为什么不同模块的基地址相同?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)

petervlna_1-1618472584102.png

顺祝商祺!

Peter

Re: MPC5744 Register Protection

谁能帮帮我?

Re: MPC5744 Register Protection

I 测试 MC_ME、CMU、ADC、CTU、PWM,只有 CMU 设置软锁定失败,其他模块可成功设置软锁定。为什么?

Tags (1)
No ratings
Version history
Last update:
‎11-21-2025 10:25 AM
Updated by: