您的位置 首页 ADAS

Freescale 16位单片机的地址映射

前言:原来一直不太明白单片机的地址映射,也没有仔细的研究过,我想这就是我不是牛人的原因吧。通常开始学单片机,都是写一些比较小的程序

前语:
本来一向不太理解单片机的地址映射,也没有细心的研讨过,我想这便是我不是牛人的原因吧。一般开端学单片机,都是写一些比较小的程序,假如不做项目开发之类的,以飞思卡尔16位单片机的资源装备来说也足够了。可是前一阵子遇到了一个问题,需要在RAM中存一个比较大的常数数组,可是单单存在RAM中的话,肯定是存不下,考虑到数组是常数,所以只能存在ROM里,可是其时时刻较短,没有研讨理解,还得到了十分沉痛的经验,觉得不甘心,计划再花时刻研讨了一下。在今后的文章中我会把我的研讨心得记录下来,期望我们提出定见。

飞思卡尔16位单片机的资源装备
以MC9S12XS128MAL为例,其实DG128之类的相似。如图一,128代表的是单片机中的FLASH巨细为128K Byte,同理64代表的是单片机中的FLASH巨细为64 K Byte,256代表的是单片机中的FLASH巨细为256 K Byte。可是S12(X)所运用的内核CPU12(X)的地址总线为16位,寻址规模最大为2^16 =64K Byte,而这64K Byte的寻址空间还包含寄存器、EEPROM(运用Data Flash模仿)、RAM等,因而不是一切的64K Byte都是用来寻址FLASH。所以在S12(X)系列单片机中,许多资源是以分页的方式呈现的,其间包含EEPROM、RAM、FLASH。EEPROM的每页巨细为1K Byte,RAM的每页巨细为4K Byte,FLASH的每页巨细为16K Byte。因而XS128中EEPROM的页数为8K/1K = 8页,RAM的页数为8K/4K = 2页,Flash的页数为128K/16K = 8页。

图一

图二
在单片一般方式中,复位后,一切内存资源的映射如图二所示,其间从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,一点心得,和我们共享。有什么过错请纠正。

正文:
关于Codewarrior 中的 .prm 文件

要评论单片机的地址映射,就有必要要触摸.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

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/adas/256624.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部