昨天调了一天的FLASH擦写,到最后依旧没有调通,但是对FLASH的结构还总算有一定的了解了。我调的程序是北航出版社的《使用HCS12微控制器的设计与应用》这本书附带光盘上的例子,程序似乎没有问题,但是FLASH确实是擦不掉,串口返回的数据,每一页都相同,令人费解,并且如果我要读FLASH上的数据,就会灵程序报错停止,不知道是跑飞了还是什么。也希望如果有同样问题的朋友能够一起讨论讨论。
下来罗列一些FLASH的基本概念,也算是复习一下。
这是HCS12内部地址的基本结构图,我们可以看到第一部分是寄存器,第二部分是EEPROM,第三部分是RAM,第四部分就是FLASH了,这部分是不分页时我们可以访问到的FLASH,第五部分是扩展的FLASH,这部分需要分页访问,DG128中有38,39,3a,3b,3c,3d,3e,3f这几个部分,而DP256中还包括了30~37这些页都有效,第六部分是另外的固定FLASH地址。
这么来说,$4000–$FFFF间的存储数据是可以访问的。
•由于Flash 模块的地址范围超出了 HCS12 的64K (16-bit)地址空间,所以从 $8000–$BFFF被映射到若干16K字节大小的页框中。 由PPAGE寄存器决定在当前访问的是哪一页。
•$8000 - $BFFF间共有64个可访问的页。使用PPAGE寄存器可以访问到地址在$8000–$BFFF间的所有共16页的16K字节。
•Flash模块中每个块包含许多行控制和状态寄存器,它们都位于的相同地址空间 INITRG + $100 - INITRG + $10F。通过Flash 配置寄存器选择有效的某行寄存器。
•MC9S12DP256 有7个引脚端口, 端口K,用来仿真或者作为通用 I/O。其余六个端口用来决定哪一个Flash页正在被访问。 其余的地址位放在 PPAGE 寄存器中。
所有的256K的FLASH可以通过16K的PPAGE窗口来访问,其中两个16K的页也可以通过固定地址($4000-7FFF, $C000-FFFF)来访问。$4000-$7FFF与$3E相对应,$C000-$FFFF与$3F相对应。这两个固定页克服了内存分页机制的一些缺点。采用分页机制,在某一页中的函数无法直接访问访问另一页中的数据。需要被其它页的函数访问的数据应该放在固定页中,或只有固定页的函数才能访问其他页的数据。因为复位和中断向量表只有16位,所以所有的中断服务程序和复位初始化程序必须从固定页中开始执行。大部分中断服务程序可以放在非固定页中,部分的中断服务程序尤其起始部分要放在固定页中。通过CALL来调用非固定页中的函数,最后用RTI指令返回。