您好,欢迎访问三七文档
飞思卡尔MC9S12系列单片机地址影射以及分页问题对于用MCU的人来说,不一定要明白HCS12(x)memorymap的机制和联系。因为如果没有系统地学习操作系统和编译原理之类的课程,确实有些难度。并且,对于DG128XS128这样的MCU,默认的emory分配方式已经够用了。从这个意义上讲,搞清楚memorymap似乎不必要。但是,你有没有RAM不够用的情况?有没有想定义变量到FLASHROM的情况?有没有因为欲提高寻址效率而定义变量到非分页区的情况?有没有写EEPROM但没写成功的情况?飞思的memory非常灵活,通过地址映射来提高效率是芯片制造商的一惯作风(当然,首先这个CPU要有这种寻址和内存映射转换机制),但是,纵观HCS12(x)memorymap的东西,真是做到极限了。用我以前的话讲是,用有限的资源获得无限的好处了。看看DG128,64K的逻辑空间,映射之后RAMEEPROMFALSHROM,都可以充分发挥作用,而且扩展FLASH也方便。而XS128更高级一筹,有专门的MMC管理HCS12(x)memorymap。我大体上了解这两个片子的HCS12(x)memorymap,因此就此谈谈理解和看法,如有错误,请大家不吝指出首先,说说6个概念。1memorymap地址映射,不要理解成内存映射,内存是RAM。2为什么要映射?因为CPU的寻址是对物理地址操作,但是单片机的RESET之后只有相对地址。相对地址,我理解为是一块一块的,不是连断的。相对地址,顾名思义,是个相对的,没有映射之前,CPU是找不到他的,也用不了相对地址的数据。粘一句百度上的解释:为了保证CPU执行指令时可正确访问存储单元,需将用户程序中的逻辑地址转换为运行时由机器直接寻址的物理地址,这一过程称为地址映射。3RAM,这个不多说,是存变量和栈的东西,高速,掉电即失。4EEPROM,这个是一种特别的FLASH。一般用来保存少量数据,掉电不会丢失。FLASH也是非易失的,SD卡就是一种FLASH。EEPROM和普通FLASH的区别,在于读写时的字节操作上。这个我基本上没有体会,因为是相当底层的东西。5FLASH和ROM,在HCS12(X)里,建议把FLASH和ROM等同起来理解。大家的程序就是放在这里面的。还有一个CONST变量和中断向量也是存在这里面的。ROM可能有个误区,只能读不能写,一次性的,不错。但是,有加个前提,应该是可控的ROM。6还有一个重要的register空间,这个是存放I/0地址和单片机可编程寄存器的空间,是厂家定义的。在头文件里可以看到。如externvolatilePORTABSTR_PORTAB@(REG_BASE+0x00000000)就是典型的register空间映射。我把memorymap理解成为3个内容:一个是映射管理,一个是分页机制,一个是寻址的问题。映射管理,就是单片机RESET之后,逻辑地址和物理地址之间的关系。分页机制的产生主要由于16位寻址能力有限,需要分页解决,另外在虚拟内存管理上可以获得更多的优势。至于,CPU寻址的问题,这个就不深纠了。这次以DG128的为例,XS128的稍复杂一些。理解了DG128的,XS128的问题就不大。先说一说映射管理:DG128里通过设置INITRG、INITRM、INITEE来实现映射。具体的设置看DS吧。默认情况下:register空间映射到0X0000到0x03FF,这个优先级最高。RAM空间映射到0x0400-0X1FFF,看到没有,实际上只有7K,也就是说能用的RAM只有7K。但是,DG128的RAM有8K的逻辑空间啊。所以,可以改INITRG、INITRM、INITEE重映射以提高RAM的实际可用空间。怎么改,看需要了。WJ在这里逻嗦一句,可以看看PE是怎么改的。而FLASH映射了3个,有两个非分页地址0x4000-0x7FFF和0xC000-0xFEFF。还有一个分页地址,这一个分页地址有6个页面。6个页面占用一个分页窗,用一个逻辑空间,如何让这6个页面协作工作并让CPU能找到他们呢?这就是分页管理机制的内容。这6个页面分别是:PAGE_38=READ_ONLY0x388000TO0x38BFFF;PAGE_39=READ_ONLY0x398000TO0x39BFFF;PAGE_3A=READ_ONLY0x3A8000TO0x3ABFFF;PAGE_3B=READ_ONLY0x3B8000TO0x3BBFFF;PAGE_3C=READ_ONLY0x3C8000TO0x3CBFFF;PAGE_3D=READ_ONLY0x3D8000TO0x3DBFFF;上面说的大家可以新建一个DG128工程,到PRM文件里看。再看看分页管理机制:DG128里只有FLASH空间可以分页,而XS128里,分页的东西太多了。DG128里FLASH分页是通过PPAGE寄存器搞定的。PPAGE是5位寄存器,CPU12内核规位每页只能有16KB。因此DG128的FLASH寻址空间就是2^5*16KB=512KB了。首先问一个问题:中断函数为什么要加:#pragmaCODE_SEG__NEAR_SEGNON_BANKED这个声明?这个声明是干什么用的?这要还是要从FLASH分页和非分页的区别说起。下面详细说一说,FLASH里非分页和分页的使用。要明白一点,分页是不可见的,要用的时候PPAGE参与寻址。1FLASH里非分页工作机制FLASH一共为128K,一页是16K,那么应该有8页才是,但是实际只有6个分页。有2个非分页放在4000-7FFF,和C000-FFFF两个逻辑地址窗里。那么,当程序的寻址在64K之内(2^16=64K,16位机的寻址能力是64K)时,就不用分页了,直接使用那两个非分页的数据。实际上,3E页3F页是可见的,其实他们就是那2个非分页的映射。因此,使用非分页FLASH,就不须设置PPAGE寄存器,直接使用逻辑地址即可。见图1。这点我们可以从以下看出:/*non-pagedFLASHs*/ROM_4000=READ_ONLY0x4000TO0x7FFF;ROM_C000=READ_ONLY0xC000TO0xFEFF;PLACEMENTNON_BANKED,INTOROM_C000/*,ROM_4000*/;很直观地看出,把这两个可以直接使用逻辑地址的页面设为NON_BANKED,那么中断函数放在NON_BANKED里,就可以把函数放在64K的寻址程序段中。这么一来,进中断就方便多了,效率也高很多。这就是对本文开篇的解释。2FLASH里分页工作机制好了,上面是3E页3F页是可见的分页区,还有3D3C3B3A3938不可见的分页区。当你的程序要寻址64K以外的空间,即不是是可见的3E页3F页时,就要涉及分页了。PPAGE是MMC模块的东西,我搞了个图片大家看看,如图2。每一页在DG128中的逻辑地址都是由PPAGE中的页号和重叠窗口内地址组成的24位绝对地址。通过设置寄存器PPAGE,可以使用全部的FLASH空间。例如:程序要将数据存入$3D页,设置PPAGE的值为$3D,那么逻辑地址范围说是$3D8000-$3DBFFF。有一点要注意:为了分页描述的完整性,可以如下理解:对于3E页3F页有两个逻辑地址映射到物理地址。拿3E页来说,有$004000-$007FFF和$3E8000-$3EBFFF。对于程序是如何寻址,这个是内核的东西,大家可以看看CPU这个文档。通过分析,相信大家知道地址这个东西是非常有用的吧。下次说说XS128,XS128的RAMFLASHEEPROM都可以分页。更高级,更主动,编程弹性更大。飞思卡尔16位单片机的资源配置以MC9S12XS128MAL为例,其实DG128之类的类似。如图一,128代表的是单片机中的FLASH大小为128KByte,同理64代表的是单片机中的FLASH大小为64KByte,256代表的是单片机中的FLASH大小为256KByte。但是S12(X)所使用的内核CPU12(X)的地址总线为16位,寻址范围最大为2^16=64KByte,而这64KByte的寻址空间还包括寄存器、EEPROM(利用DataFlash模拟)、RAM等,因此不是所有的64KByte都是用来寻址FLASH。所以在S12(X)系列单片机中,很多资源是以分页的形式出现的,其中包括EEPROM、RAM、FLASH。EEPROM的每页大小为1KByte,RAM的每页大小为4KByte,FLASH的每页大小为16KByte。因此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)改变映射,而其他的页必须通过寄存器的设置来选择映射不同的页。
本文标题:FLASH分页
链接地址:https://www.777doc.com/doc-1440802 .html