前语:
本来一向不太理解单片机的地址映射,也没有细心的研讨过,我想这便是我不是牛人的原因吧。一般开端学单片机,都是写一些比较小的程序,假如不做项目开发之类的,以飞思卡尔16位单片机的资源装备来说也足够了。可是前一阵子遇到了一个问题,需要在RAM中存一个比较大的常数数组,可是单单存在RAM中的话,肯定是存不下,考虑到数组是常数,所以只能存在ROM里,可是其时时刻较短,没有研讨理解,还得到了十分沉痛的经验,觉得不甘心,计划再花时刻研讨了一下。在今后的文章中我会把我的研讨心得记录下来,期望我们提出定见。
飞思卡尔16位单片机的资源装备
图一
图二
在单片一般方式中,复位后,一切内存资源的映射如图二所示,其间从0x0000-0x07FF的2K规模内映射为寄存器区,如I/O端口寄存器等,当然寄存器没有那么多,后边的一部分其实没有运用;
从0x0800-0x0BFF,共1K的空间,映射为EEPROM区,由上面的剖析,XS128中共有8页的共8K的EEPROM,所以这8页的EEPROM都是以分页的方式呈现的,能够经过设置寄存器EPAGE挑选不同的页并进行拜访;
从0x0C00到0x0FFF的1K空间为保存区(其实这里边也有学识,今后评论);
从0x1000到0x3FFF的12K空间为RAM区,分为三页,可是和前面所说的EEPROM不同,这三页中有2页(关于XS128和XS256)或一页(关于XS64)为固定页,坐落12K空间的后一部分,以XS128为例,其内部的RAM资源为8K,所以其三页中的最终两页(0x2000-0x3FFF)为固定页,第一页(0x1000-0x1FFF)为窗口区,经过设置寄存器RPAGE来映射其他分页的RAM,当然在单片一般方式下,XS128内部现已没有其他的RAM了,所以这一页其实也没有用。可是关于XS256,这一页是有用的,由于它一共有12K的RAM。可是,在单片一般方式下,即没有外扩RAM的情况下,用户是不必故意的去装备RPAGE的,由于复位的时分,现已默许指向那一页的RAM。
从0x4000-0xFFFF的一共48K的空间为Flash区,分为三页。其间第一页和第三页为固定的Flash页,中心的一页(0x8000-0xBFFF)为窗口区,经过设置PPAGE寄存器,能够映射到其他的分页Flash。
在最终的一页固定的Flash区域中的最终256字节中,保存的是中断向量。
关于RAM和Flash来说,其实固定页和其他的分页资源是一致编址的,不同的是固定页不能够经过寄存器(RPAGE、PPAGE)改动映射,而其他的页有必要经过寄存器的设置来挑选映射不同的页。
codewarrior中的prm文件
网上广泛撒播的一篇文章叙述的是8位飞思卡尔单片机的内存映射,这几天,研讨了一下Codewarrior 5.0 prm文件,根据16位单片机MC9S12XS128,一点心得,和我们共享。有什么过错请纠正。
要评论单片机的地址映射,就有必要要触摸.prm文件,本篇的评论根据 Codewarrior 5.0 编译器,单片机选用MC9S12XS128。
经过项目模板树立的新项目中都有一个姓名为“project.prm”的文件,坐落Project Settings->Linker Files文件夹下。一个规范的根据XS128的.prm文件开始内容如下:
.prm文件典范:
NAMES
END
SEGMENTS
RAM = READ_WRITE DATA_NEAR 0x2000 TO 0x3FFF;
ROM_4000 = READ_ONLY DATA_NEAR IBCC_NEAR 0x4000 TO 0x7FFF;
ROM_C000 = READ_ONLY DATA_NEAR IBCC_NEAR 0xC000 TO 0xFEFF;
//OSVECTORS = READ_ONLY 0xFF10 TO 0xFFFF;
EEPROM_00 = READ_ONLY DATA_FAR IBCC_FAR 0x000800 TO 0x000BFF;
EEPROM_01 = READ_ONLY DATA_FAR IBCC_FAR 0x010800 TO 0x010BFF;
EEPROM_02 = READ_ONLY DATA_FAR IBCC_FAR 0x020800 TO 0x020BFF;
EEPROM_03 = READ_ONLY DATA_FAR IBCC_FAR 0x030800 TO 0x030BFF;
EEPROM_04 = READ_ONLY DATA_FAR IBCC_FAR 0x040800 TO 0x040BFF;
EEPROM_05 = READ_ONLY DATA_FAR IBCC_FAR 0x050800 TO 0x050BFF;
EEPROM_06 = READ_ONLY DATA_FAR IBCC_FAR 0x060800 TO 0x060BFF;
EEPROM_07 = READ_ONLY DATA_FAR IBCC_FAR 0x070800 TO 0x070BFF;
PAGE_F8 = READ_ONLY DATA_FAR IBCC_FAR 0xF88000 TO 0xF8BFFF;
PAGE_F9 = READ_ONLY DATA_FAR IBCC_FAR 0xF98000 TO 0xF9BFFF;
PAGE_FA = READ_ONLY DATA_FAR IBCC_FAR 0xFA8000 TO 0xFABFFF;
PAGE_FB = READ_ONLY DATA_FAR IBCC_FAR 0xFB8000 TO 0xFBBFFF;
PAGE_FC = READ_ONLY DATA_FAR IBCC_FAR 0xFC8000 TO 0xFCBFFF;
PAGE_FE = READ_ONLY DATA_FAR IBCC_FAR 0xFE8000 TO 0xFEBFFF;
END
PLACEMENT
_PRESTART,
STARTUP,
ROM_VAR,
STRINGS,
VIRTUAL_TABLE_SEGMENT,
//.ostext,
DEFAULT_ROM, NON_BANKED,
COPY