这些是我为 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 -------*/
寄存器:与 ME_MCTL(模式控制寄存器,32 位保护,偏移 0x4,见表 77-5)匹配。
基地址:0xFFFB0000。
保护大小:32 位(所有四个字节均受保护)。
计算
正常地址:基数 + 偏移量 = 0xFFFB0000 + 0x4 = 0xFFFB0004
镜像地址(区域 3):基数 + 0x2000 + 偏移 = 0xFFFB0000 + 0x2000 + 0x4 = 0xFFFB2004
软锁定位地址(区域 4):
区域 4 中的偏移量:offset/4 = 0x4 / 4 = 0x1。
地址: base + 0x3800 + offset/4 = 0xFFFB0000 + 0x3800 + 0x1 = 0xFFFB3801。
对于 32 位寄存器,所有四个 SLB(SLB0—SLB3)控制四个字节(例如,0x4 到 0x7)。
软锁定
选项 1:写入镜像地址:
向 0xFFFB2004 写入 32 位值(例如,0x80000000 可启动模式转换;有关有效值,请参阅 MC_ME 章节)。
这将更新 0xFFFB0004 的 ME_MCTL,并在 0xFFFB3801 的 SLBRn 寄存器中设置 SLB0-SLB3。
示例*(volatile uint32_t *)0xFFFB2004 = 0x80000000;
选项 2:直接写入 SLB:
写入 0xFFFB3801,设置 SLB0-SLB3。
写入 0xFF(WE0—WE3=1,SLB0—SLB3=1)以锁定所有四个字节。
示例*(volatile uint8_t *)0xFFFB3801 = 0xFF;
解锁
写入 0xF0 至 0xFFFB3801(WE0-WE3=1,SLB0-SLB3=0)以清除 SLB0-SLB3,解锁寄存器。
示例*(volatile uint8_t *)0xFFFB3801 = 0xF0;
硬锁定
将 0x00000001 写入 0xFFB3FFC 以设置 GCR.HLB,锁定 SLB 直到 RESET。
示例*(volatile uint32_t *)0xFFFB3FFC = 0x00000001;
下面是一个寄存器设置示例,它的所有 4 个地址设置都是启用的,可以是 R/W。
下面是一个寄存器设置示例,其中基址 + 偏移& 镜像地址已启用,可以设置为 R/W,其他地址不能设置。
这带来了一个严重的问题,因为 SLB 位确认了软锁定,而 GCR 位的设置则是为了实现硬锁定。
对于所有 MC_CGM 带帽寄存器,我都发现了同样的问题。
这些不同行为的原因是什么?有些地址可以修改和变更,有些则被保留。
你好
如果我硬锁任何一个模块,所有其他模块都会自动被硬锁定,这在电源模式下会出现问题。因为我不希望 FXOSC/SXOSC 和 CMU 在这里被硬锁定。
寄存器保护采用 P 桥。
petervlna_0-1754636157965.png
PBRIDGE 上有 MC_CGM 模块:
petervlna_1-1754636218800.png
然后将外设映射到 MC_CGM 下。看来您需要使用 SLB 而不是 HLB 来解决这个问题。
因为 HLB 会锁定整个 MC_CGM。
顺祝商祺!
Peter
嗨,彼得 、
感谢您的帮助。我现在可以为所有模块配置软锁和监测 SLB 了。
我还有一个关于硬锁 GCR 位的问题。根据您的解释,所有 MCCGM 上限模块(即 CMU、FXOSC、SXOSC、PLDIG 和 MCCGM)应具有一个共同的基地址,即 0xFFFB0000。
现在根据第 77.1.1 节寄存器保护配置,N OTE讨论了电源模式下的操作。
mayank22_0-1754552830865.png
正如我所说,在相同的基本地址下,如果我硬锁任何一个模块,所有其他模块都会自动被硬锁定,这在低电源模式下会出现问题。因为我不希望 FXOSC/SXOSC 和 CMU 在这里被硬锁定。
有没有办法解决这个问题?
感谢并致意
你好
以下是 SLB 的结果
CMU_LFREFR 32 - 地址基数和偏移量
CGM 模块的基数为 0xFFFB_0000
CMU 偏移为 0x140
petervlna_0-1753947014813.png
CGM LFREFR 从模块基数偏移 0x14C
petervlna_1-1753947034996.png
petervlna_4-1753947541951.png
我通过写入镜像为 CMU_LFREFR 设置了 SLB
petervlna_3-1753947365013.png
顺祝商祺!
Peter
嗨,这也不起作用。
CMU_LFREFR 32 | 偏移 0xCh | 受保护的大小-16(字节 2 和 3) |
0xFFFB0000,/* CMU----------*/
基地址 -0xFFFB000C
镜像地址 -0xFFFB200C
SLB - 0xFFFB3803
GCR - 0xFFFB3FFC
mayank22_0-1753789974341.png
你好
查看简单测试:MC_CMU - CSR
petervlna_0-1753772600568.png
基地址 - 0xFFFB014C - 这是偏移地址。不是基地。
MC_CMU 模块的基数为 0xFFFB 0140。
镜像地址 -0xFFFB214C
即基座 + 偏移 + 镜像
SLB -0xFFFB3943
以参考手册中的整个 CGM 的地址为基准:
petervlna_1-1753772881109.png
所以计算结果是
0xFFFB0000 + 3800 + SLB 的位置
GCR - 0xFFFB413C
同上
0xFFFB0000+3FF0
顺祝商祺!
Peter
嗨,彼得,这里有一些 SLB 和 GCR 失效的示例。 请检查这些地址并确认它们是否显示不同的行为。如果不是,那么这些模块会有什么问题?
1.MC_CMU - 0xFFFB0140 - { MODULE_CMU, 0xC,REG_SIZE_16}, CMU_LFREFR
mayank22_0-1753700010986.png
2.MC_CMU - 0xFFFB0140 { MODULE_CMU, 0x18,REG_SIZE_32}, CMU_MDR
mayank22_1-1753700066515.png
3.PLLDIG 0xFFFB0080 - PLLDIG_PLLCR { MODULE_PLLDIG, 0x20, REG_SIZE_16}, PLLDIG_PLLCR
mayank22_4-1753700213295.png
4.PLLDIG 0xFFFB0080 - { MODULE_PLLDIG, 0x28,REG_SIZE_32}. { MODULE_PLLDIG, 0x28,REG_SIZE_32}, PLLDIG_PLLDV
mayank22_5-1753700236791.png
5.PMCDIG 0xFFFA0400 - { MODULE_PMCDIG, 0x0,REG_SIZE_32}. { MODULE_PMCDIG, 0x0,REG_SIZE_32}、
mayank22_6-1753700259740.png
6.PMCDIG 0xFFFA0400 - { MODULE_PMCDIG, 0x10,REG_SIZE_32}.{ MODULE_PMCDIG, 0x10,REG_SIZE_32}、
mayank22_7-1753700335502.png
你好
我已经检查了 PREG_PROT,它的行为就像参考手册中描述的那样:
在 ME_CGM 寄存器 SC_DC0 上:
基数:0xFFFB0000 + 偏移 7E8
镜像0xFFFB07E8
= 基数 (0xFFFB0000) + 偏移 (7E8) + 镜像 (0x2000)
在示例中,我通过软锁锁定了 SC_DC0 形式的 ME_CGM 模块。
petervlna_0-1753172674705.png
具体情况如下:
petervlna_1-1753172729779.png
区域 4:为 1.5 KB,包含软锁位,区域 1 中每字节一位。与一个模块寄存器字相关的四个软锁位排列在存储器映射中的字节边界处。软锁定位寄存器可使用位掩码直接写入。
因此,必须将软锁定位的面积除以 8,才能看到相应的 SLB 设置。
基础(模块的)+ 3800 +(区域 1 的每字节一位)
petervlna_2-1753172994361.png
petervlna_3-1753173019294.png
对于硬锁位,整个模块只有一个。
区域 5 的大小为 512 字节,用于保存保护模式的配置位。每个模块都有一个配置硬锁位,可以防止对软锁位进行任何进一步的修改,并且只能在设置后通过系统 RESET 来清除。其他位如果被设置,将允许用户访问受保护的模块。
基数(模块) 0xFFFB0000 + 偏移 3FFC
因为 GCR 位于 5 号区域的末端。
petervlna_5-1753173243793.png
petervlna_4-1753173057363.png
顺祝商祺!
Peter
你好
我会进行测试,并尽快给您答复。
顺祝商祺!
Peter