本文由“汽车电子expert成长之路”公众号中“S12(X)系列MCU的片上存储器资源与分页访问机制详解”文章整理得来
最近接触S12MCU中关于FLASH的擦写相关知识,需要捋清楚几个概念。 (16位单片机) 具体内存分配看 MC9S12G系列芯片手册中 40 页
本地地址(Local Address):也称为局部地址,指内核CPU能够线性访问的地址,对于16位MCU来说就是0x0000~0xFFFF的64KB地址空间;
逻辑地址(Logic Address): 也可以称为虚拟地址,是链接文件.prm和内存映射文件.map以及默认的编译结果S19文件所使用的地址。为分页号 + 分页窗口(Paging Window)组成的24-bit间断地址空间,对逻辑地址的访问需要使用__far指针。
全局地址(Global Address):也称为物理地址(Physical Address),是芯片在设计时给P-Flash分配的线性连续地址空间,一般在多P-Flash进行操作(比如编写P-Flash驱动程序,对P-Flash进行擦除、编写/写入等)时使用。
按照地址是否位于分页段,可将地址分为未分页地址(Non-paged address/non-bank address)及分页地址(paged/bandked address)
① 分页地址:其实就是逻辑地址。根据不同的器件,其可能存在P-Flash分地址、RAM分页地址和EEPROM/D-Flash分页地址。
P-Flash分页地址:其地址空间是16KB对齐的的间断地址,由P-Flash分页号+Flash分页窗口地址(0x8000~0xBFFF,本地地址的第三个和16KB地址空间)组成。Flash分页号(Page Number)保存在存储器映射控制器PPAGE寄存器(地址为0x0015)中,用于在通过分页窗口访问Flash时索引逻辑地址。
RAM分页地址:其地址空间为4KB对齐的间断地址,由RAM分页号+RAM分页窗口地址(0x1000~0x1FFFF,其在本地地址的第一个16KB地址空间)组成。RAM分页号(Page Number)保存在存储器映射控制RPAGE寄存器(地址为0x0016)中,用于在通过分页窗口访问RAM时索引逻辑地址。
EEPROM分页地址:其地址空间为1KB对齐的间断地址,由EEPROM分页号+EEPROM分页窗口地址(0x0800~0x0BFF,其在本地地址的第一个16KB地址空间)组成。EEPROM分页号(Page Number)保存在存储器映射控制器EPAGE寄存器(地址为0x0017)中,用于在通过分页窗口访问EEPROM时索引逻辑地址。
② 未分页地址:本地地址中除了分页窗口(0x8000~0xBFFF,第三个16KB地址空间)之外的48KB地址空间都被称为未分页区。
逻辑地址直接由分页号+分页窗口组成,该地址容易得到。例如 Page E的Flash对应的逻辑地址为0xE8000~0xEBFFF。
全局地址由逻辑地址计算得出:
分页段: 全局地址 = ( 分页号 << 14 ) | ( 本地地址 - 0x8000 )
非分页段: 全局地址 = 本地地址 | 0x30000