【飞思卡尔 MC9S12】PRM文件与内存映射(Flash、RAM、EEE)

本文深入解析飞思卡尔MC9S12系列芯片的内存映射,特别是其分页机制。内容涵盖Flash、RAM和EEPROM的内存布局,以及如何通过页寄存器(如EPAGE、RPAGE和PPAGE)进行地址访问。此外,还讨论了全局地址寄存器GPAGE的作用和PRM文件在配置内存空间时的应用。
摘要由CSDN通过智能技术生成

本篇介绍飞思卡尔MC9S12系列芯片基本内存映射知识,主要是其特有的分页机制。一般的小型项目可能很多人都不会去专门了解这些内容,但是对于大型项目(代码超过16KB 或 内部变量过多超过4KB),势必要在默认设置下修改能适配项目的配置,以便于能灵活使用。另外BootLoader的编写也是要了解这方面的内容才能进行。

MC9S12(X)有2个大的系列,区别是带不带XGATE(有X后缀的是带有XGATE的),XGATE是一个辅核,可以处理中断,不能作为主要业务逻辑处理,也就是说,XGATE只能通过中断触发执行,而不能在main循环中跳入。XGATE的中断处理速度远超S12主核(相同时间内数据自增数值更大),因此某些中断响应可以放在XGATE中,既可以提高处理速度,又能减轻主核负担,XGATE与S12主核共享Flash与RAM,因此需要在共享区域使用前加锁,使用完毕解锁。

以下主要以MC9S12XEP100系列为例,内部P-Flash大小为1MB,RAM为64KB,D-FLASH(模拟EEPROM)大小36KB。如此大的空间,MCU是如何知道去哪个地方找数据呢?当然是通过地址寻找了。但是MC9S12系列所有单片机都是16位,总寻址范围为 2^16 = 65536,也就是64KB,为了解决寻址问题,Freescale提供了分页的概念,通过页地址+页内地址来访问,有点像是将中国分成几十个省,通过省名+省内地址来具体定位到某个特定地址,例如 河北+廊坊(实际上地名比这个复杂,此处仅作范例)。

Freescale将64KB寻址空间分成4段,寄存器段(2KB)、EEPROM段(1*2KB)、RAM段(4*3KB)、Flash段(16*3KB)。

可直接寻址的区域叫做非分页区(Non-Banked);对于不能直接寻址的区域,要通过修改页寄存器值来定位的叫做分页区(Banked),非分页区也可以通过页寄存器设置来访问(但是属于多次一举,相对于直接寻址会浪费时间)。

需要注意的是,分页寄存器的值并非是从0开始。在该块前部分的,从0x00开始往后,在该块后部分的,从0xFF往前。具体与实际Memory Map有关,这个会在后面体现(Global Memory Map 内标注有),EEPROM就分成2大段,中间是断开的,前面从0x00起始,后面的从0xFF往前。

寄存器2KB可以直接覆盖,不需要分页;

EEPROM有36KB,但是分配的寻址范围只有2KB,1KB可以直接访问,1KB作为EEPROM窗口,通过设置EPAGE寄存器的值(36个值,可直接寻址的1KB,也可以在这个窗口内访问,与直接寻址效果相同,只是耗时较长,这1KB一般不在窗口访问),可以在这个窗口中访问到所有36KB内容;

RAM有64KB,2个4KB可直接访问,剩下的(总16,可直接寻址的有2个,实际使用14个)可通过一个4KB窗口访问,通过RPAGE来选择不同的RAM块;

Flash有1MB,2个16KB可直接访问,还有个16KB作为窗口,通过设置PPAGE来选择不同分页区。

以下为实际地址顺序:

0x0000-0x07FF  Registers (2KB)

 

//total 36KB
0x0800-0x0BFF  EEPROM Page Window (1KB) *35
0x0C00-0x0FFF  EEPROM Page 0xFF (1KB)

 

//total 64KB
0x1000-0x1FFF  RAM Window (4KB)    *14
0x2000-0x2FFF  RAM 0xFE (4KB)
0x3000-0x3FFF  RAM 0xFF (4KB)

 

//total 1024KB
0x4000-0x7FFF  Flash 0xFD (16KB) 
0x8000-0xBFFF  Flash Page Window (16KB)  *62
0xC000-0xFEFF  Flash 0xFF (≈16KB)
0xFF00-0xFFFF  Vectors

 

通过以上描述,我们对于分页有了一个基本的认识,但是我们发现,RAM、EEPROM、Flash、各自有不同的分页寄存器,使用起来比较麻烦,而且对整个地址空间描述还是不够理想,是否有更好的方法呢?当然有,Freescale早就想到了这一点,因此推出了GPAGE寄存器,统一管理所有空间地址,Global Memory Address。

全局地址分布于两个寄存器的设置有关ROMHM和RAMHM,此处我们不做过多解释,以免大家感到更困惑。这两个寄存器值一般默认即可,无需特别设置。在默认情况下,Global Memory Map如下(需要注意各个寄存器的值,与prm文件配置有关):

默认情况下(ROMHM=0 RAMHM=0)Global Memory Map 如下:


0x000000-0x0007FF    Registers    2KB


0x000800-0x000FFF    2K RAM , 扩展空间CS3
0x001000-0x0FDFFF    253*4K Paged RAM
0x0FE000-0x0FFFFF    8K RAM(2*4K)


0x100000-0x13FBFF    255*1K Paged EEPROM
    0x100000-0x1003FF    1K (EPAGE 0x00)    
    ……
    0x103C00-0x103FFF    1K (EPAGE 0x1F)    
    ---
    0x13F000-0x13F3FF    1K (EPAGE 0xFC)                --
    0x13F400-0x13F7FF    1K (EPAGE 0xFD)                |    RAM Bufferd
    0x13F800-0x13FBFF    1K (EPAGE 0xFE)                |
0x13FC00-0x13FFFF    1K EEPROM(EPAGE 0xFF)            --


0x140000-0x1FFFFF    扩展空间CS2
0x200000-0x3FFFFF    扩展空间CS1


0x400000-0x7F3FFF    253*16K Paged Flash, 扩展空间CS0
    0x700000-0x73FFFF    B3(256KB)
    0x740000-0x77FFFF    B2(256KB)
    0x780000-0x79FFFF    B1S(128KB)
    0x7A0000-0x7BFFFF    B1N(128KB)
    0x7C0000-0x7F3FFF    B0(208KB)
0x7F4000-0x7F7FFF    16KB Flash(PPAGE 0xFD)
    0x7F4000-0x7F7FFF B0(16KB)
0x7F8000-0x7FBFFF    16KB Flash(PPAGE 0xFE)
    0x7F8000-0x7FBFFF B0(16KB)
0x7FC000-0x7FFFFF    16KB Flash(PPAGE 0xFF)
    0x7FC000-0x7FFFFF B0(16KB)

Flash及EEPROM读写就是通过全局地址来进行的。

GPAGE并非

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值