原来一直不太明白单片机的地址映射?/p>
也没有仔细的研究过,
我想这就是我不是牛人的原?/p>
吧。通常开始学单片机,
都是写一些比较小的程序,如果不做项目开发之类的,以飞思卡?/p>
16
位单片机的资源配置来说也足够了。但是前一阵子遇到了一个问题,需要在
RAM
中存一
个比较大的常数数组,但是单单存在
RAM
中的话,肯定是存不下,考虑到数组是常数,所
以只能存?/p>
ROM
里,但是当时时间较短,没有研究明白,还得到了非常惨痛的教训,觉得
不甘心,
打算再花时间研究了一下?/p>
在以后的文章中我会把我的研究心得记录下来?/p>
希望?/p>
家提出意见?/p>
飞思卡?/p>
16
位单片机的资源配?/p>
?/p>
MC9S12XS128MAL
为例?/p>
其实
DG128
之类的类似?/p>
如图一?/p>
128
代表的是单片机中?/p>
FLASH
大小?/p>
128K Byte
,同?/p>
64
代表的是单片机中?/p>
FLASH
大小?/p>
64 K Byte
?/p>
256
代表的是单片
机中?/p>
FLASH
大小?/p>
256 K Byte
?/p>
但是
S12(X)
所使用的内?/p>
CPU12(X)
的地址总线?/p>
16
位,
?/p>
址范围最大为
2^16 =64K Byte
?/p>
而这
64K Byte
的寻址空间还包括寄存器?/p>
EEPROM
(利?/p>
Data
Flash
模拟?/p>
?/p>
RAM
等,因此不是所有的
64K Byte
都是用来寻址
FLASH
。所以在
S12(X)
系列?/p>
片机中,很多资源是以分页的形式出现的,其中包?/p>
EEPROM
?/p>
RAM
?/p>
FLASH
?/p>
EEPROM
?/p>
每页大小?/p>
1K Byte
?/p>
RAM
的每页大小为
4K Byte
?/p>
FLASH
的每页大小为
16K Byte
?/p>
因此
XS128
?/p>
EEPROM
的页数为
8K/1K = 8
页,
RAM
的页数为
8K/4K = 2
页,
Flash
的页数为
128K/16K = 8
页?/p>
图一
图二
在单片普通模式中?/p>
复位后,
所有内存资源的映射如图二所示,
其中?/p>
0x0000-0x07FF
?/p>
2K
范围内映射为寄存器区,如
I/O
端口寄存器等,当然寄存器没有那么多,后面的一部分其实
没有使用?/p>
?/p>
0x0800-0x0BFF
,共
1K
的空间,映射?/p>
EEPROM
区,由上面的分析?/p>
XS128
中共?/p>
8
页的
?/p>
8K
?/p>
EEPROM
,所以这
8
页的
EEPROM
都是以分页的形式出现的,可以通过设置寄存?/p>
EPAGE
选择不同的页并进行访问;
?/p>
0x0C00
?/p>
0x0FFF
?/p>
1K
空间为保留区(其实这里面也有学问,以后探讨)
?/p>
?/p>
0x1000
?/p>
0x3FFF
?/p>
12K
空间?/p>
RAM
区,分为三页,但是和前面所说的
EEPROM
不同?/p>
这三页中?/p>
2
页(对于
XS128
?/p>
XS256
)或一页(对于
XS64
)为固定页,位于
12K
空间的后
一部分?/p>
?/p>
XS128
为例?/p>
其内部的
RAM
资源?/p>
8K
?/p>
所以其三页中的最后两?/p>
?/p>
0x2000-0x3FFF
?/p>
为固定页,第一页(
0x1000-0x1FFF
)为窗口区,通过设置寄存?/p>
RPAGE
来映射其他分页的
RAM
,当然在单片普通模式下?/p>
XS128
内部已经没有其他?/p>
RAM
了,所以这一页其实也?/p>
有用。但是对?/p>
XS256
,这一页是有用的,因为它总共?/p>
12K
?/p>
RAM
。但是,在单片普通模
式下,即没有外扩
RAM
的情况下,用户是不用刻意的去配置
RPAGE
的,因为复位的时候,
已经默认指向那一页的
RAM
?/p>
?/p>
0x4000-0xFFFF
的总共
48K
的空间为
Flash
区,分为三页。其中第一页和第三页为固定?/p>
Flash
页,中间的一页(
0x8000-0xBFFF
)为窗口区,通过设置
PPAGE
寄存器,可以映射到其
他的分页
Flash
?/p>
在最后的一页固定的
Flash
区域中的最?/p>
256
字节中,保存的是中断向量?/p>
对于
RAM
?/p>
Flash
来说,其实固定页和其他的分页资源是统一编址的,不同的是固定页不
可以通过寄存器(
RPAGE
?/p>
PPAGE
)改变映射,而其他的页必须通过寄存器的设置来选择?/p>
射不同的页?/p>