飞思卡尔 HCS12(X)系列 MCU 的 Prm 文件中的逻辑地址和全局地址的转换

本文介绍了飞思卡尔HCS12(X)系列MCU中Flash擦写的全局地址操作方法,详细解释了逻辑地址与全局地址之间的转换过程,并通过实例展示了非分页区与分页区的地址转换。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于在我的项目中,需要实现对 HCS12 单片机的 FLASH 进行擦写,所以难免会遇到对全局地址的操作,因为对 FLASH 的擦写操作是必须使用全局地址的。

下图是擦除指令序列的说明

飞思卡尔 HCS12(X)系列 MCU 的 Prm 文件中的逻辑地址和全局地址的转换 - liufan2007 - 爱好电子的阿皮哥
在这里插入图片描述

图 1

其中 Global address[17:16]是需要写入 FLASH 的 Block 值,下面的 Global address[15:0]是低 16 位地址。一共是 18Bit的全局地址,其最大的寻址的空间是 = 2^18 = 256K。

下图是逻辑地址和全局地址的映射图

飞思卡尔 HCS12(X)系列 MCU 的 Prm 文件中的逻辑地址和全局地址的转换 - liufan2007 - 爱好电子的阿皮哥
在这里插入图片描述

图 2

可以发现低 14 位地址就是一页的大小 2^14 = 16K, 高 4 位地址就是页寄存器 PPAGE 的地址,由[17:14]组成。

下面说明 PRM 文件和全局地址的转换关系

取 MC9SHY64 工程的 PRM 文件的片段

/* non-paged FLASHs */

  ROM_1400      = READ_ONLY     0x1400 TO   0x2FFF; //7K

  ROM_4000      = READ_ONLY     0x4000 TO   0x7FFF; //16K

  ROM_C000      = READ_ONLY     0xC000 TO   0xFEFF; //16k

/* paged FLASH: 0x8000 TO 0xBFFF; addressed through PPAGE */

  PAGE_0C       = READ_ONLY   0x0C8000 TO 0x0C93FF;  //5k

  PAGE_0C_B000  = READ_ONLY   0x0CB000 TO 0x0CBFFF;  //4k

  PAGE_0E       = READ_ONLY   0x0E8000 TO 0x0EBFFF;  //16k

对于分页区

其中 PAGE_0C,PAGE_0C_B000,PAGE_0E 属于分页区范围,由于是在分页区,所以如果需要擦写

这个区域,则需要转换,PAGE_0C 的 0C 就是页号,它对应了 PPAGE。

0C = 0000 1100,其中 11 就是 Global address[17:16]这 2 位,11 后面的 00 实际是无效的。

PAGE_0C 后面的起始地址是 0x0C8000,这里的 8000 是分页窗口逻辑地址范围内的起始地址,0C 就是页号,按照图 2进行理解,全局地址 = (0x0C<<14) | 0x8000 = 0x38000,这个理解是错误的。经过调试发现应该是这样的:

全局地址 = (0x0C<<14) | (0x8000 – 0x8000) = 0x30000

则 逻辑地址

Logic address = (Global address & 0x3C000) <<2 | (Global address & 0x03FFF) + 0x8000

则 上例的逻辑地址 = (0x30000 & 0x3C000)<<2 | 0x30000 & 0x03FFF + 0x8000 = 0xC8000

那么

PAGE_0C_B000 = READ_ONLY 0x0CB000 TO 0x0CBFFF; //4k

全局地址 = (0x0C<<14) | (0xB000 – 0x8000) = 0x33000

逻辑地址 = (0x33000 & 0x3C000)<<2 | 0x33000 & 0x03FFF + 0x8000 = 0xCB000

即,如果要擦写 PAGE_0C_B000 这个区域,则如下设置

Global address[17:16] = 0x03

Global address[15:0] = 0x3000

对于非分页区

其中 ROM_1400,ROM_4000,ROM_C000 属于非分页区范围,由于是在非分页区,页寄存器 PPAGE是无效的,所以如果需要擦写这个区域,则将图 1 中的 Global address[17:16]这 2 位写 00 即可,

然后 Global address[15:0]直接写地址值就行,如 Global address[15:0] = 0x1400。

ROM_1400 = READ_ONLY 0x1400 TO 0x2FFF; //7K

全局地址 = (0x00<<14) | 0x1400) = 0x01400

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值