您的位置:首页 > 其它

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

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

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



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



图 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
这些结论是我经过实际调试得出来的,不知道理解的如何,如果有高手,希望能指点指点!谢谢!
http://liufan2007.blog.163.com/blog/static/30323133201210194627863/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: