MC9S12单片机内存映射机制详解

地址空间

这是个16位的单片机。CPU的寻址空间最大为2^16=64K。

这个64K是包括外设、RAM、EEPROM、和FLASH的。现在程序越来越大,64K的空间肯定是不够用的。因此,需要扩展。

扩展方法就是:分页。

把原来的64K空间,划分一块出来,当作“窗口”。再配置一个“页寄存器”,指示哪一段存储器被映射上这个窗口上,供CPU访问。

地址映射图

解读:

1,0x0000~0x0800为2K的寄存器空间;

2,0x0800~0x0C00为1K大小的EEPROM“窗口”空间;

3,0x0C00~0x1000为1K大小的EEPROM固定空间;

4,0x1000~0x2000为4K的RAM“窗口”空间;

5,0x2000~0x4000为8K的RAM固定空间;这样分配的好处是,有8K的固定RAM空间,可以满足大多数应用场景,不需要对RAM进行分布管理;

6,FLASH空间分为3个部分(页),每个都是16K,共48K,对应地址为0x4000~0xFFFF。其中,第1个和第3个是固定空间,中间那个页是“窗口”空间。

7,以FLASH为例。存储器映射控制器(Memory Mapping Control)将扩展后的逻辑地址0x400000~0x7FFFFF映射到0x8000~0xC000。

特殊FLASH地址

具体的要查芯片手册。但这个系列的用法都差不多。

FLASH配置域

0xFF00~0xFF0F 这16个字节是FLASH配置字。

中断向量表

FF10~FFFF是中断向量表(含复位向量):

页表地址

prm文件中定义的:

/* paged FLASH:                                        0x8000 TO   0xBFFF; addressed through PPAGE */
      PAGE_E0       = READ_ONLY   DATA_FAR IBCC_FAR  0xE08000 TO 0xE0BFFF; 
      PAGE_E1       = READ_ONLY   DATA_FAR IBCC_FAR  0xE18000 TO 0xE1BFFF; 
      PAGE_E2       = READ_ONLY   DATA_FAR IBCC_FAR  0xE28000 TO 0xE2BFFF; 
      PAGE_E3       = READ_ONLY   DATA_FAR IBCC_FAR  0xE38000 TO 0xE3BFFF; 
      PAGE_E4       = READ_ONLY   DATA_FAR IBCC_FAR  0xE48000 TO 0xE4BFFF; 
      PAGE_E5       = READ_ONLY   DATA_FAR IBCC_FAR  0xE58000 TO 0xE5BFFF; 
      PAGE_E6       = READ_ONLY   DATA_FAR IBCC_FAR  0xE68000 TO 0xE6BFFF; 
      PAGE_E7       = READ_ONLY   DATA_FAR IBCC_FAR  0xE78000 TO 0xE7BFFF; 

      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_FD       = READ_ONLY                      0xFD8000 TO 0xFDBFFF; intentionally not defined: equivalent to ROM_4000 */
      PAGE_FE       = READ_ONLY   DATA_FAR IBCC_FAR  0xFE8000 TO 0xFEBFFF; 
/*    PAGE_FF       = READ_ONLY                      0xFF8000 TO 0xFFBFFF; intentionally not defined: equivalent to ROM_C000 */

这里是根据页号来配置的逻辑地址。用于编译器生成bin文件时寻址。

这里面的地址是非连续的。每一段大小都是16K。低14位地址都是0x8000~0xBFFF。便于MMC将该地址映射到页号+CPU地址。

全局地址

全局地址与PPAGE寄存器之间的关系:

全局地址最高位为1时,将分页后的FLASH空间映射给CPU。

低14位是CPU本地地址(共16K),刚好一个页的大小。前面的8个位(bit14~bit21)对应的是PPAGE,最多可映射256页。

全局地址与RPAGE寄存器之间的关系:

全局地址最高位为000时,将分页后的RAM空间映射给CPU。

低12位是CPU本地地址(共4K),刚好一个RAM页的大小。前面的8个位(bit12~bit19)对应的是RPAGE,最多可映射256页。

全局地址与EPAGE寄存器之间的关系:

全局地址最高位为00100时,将分页后的EEPROM空间映射给CPU。

低10位是CPU本地地址(共1K),刚好一个EEPROM页的大小。前面的8个位(bit10~bit17)对应的是EPAGE,最多可映射256页。

作者:booksyhay

物联沃分享整理
物联沃-IOTWORD物联网 » MC9S12单片机内存映射机制详解

发表回复