文章
博客 网店

 HCS08地址空间分配


  HCS08采用的是程序和数据存储器统一编址的冯诺依曼结构,总线宽度为16位,所以总的地址空间只有64k,最大可访问的地址 为0xffff 。
   HCS08指令中有一些访问8位地址的高校指令,8位地址就意味着只有256个字节,为了有效的利用这个256个地址,前128个地址分配给了外设寄存器,后128个地址分配给了用户可用的RAM。如右图0x0000到0x006f处分配了一些IO等外设寄存器,从0x0070开始分配RAM对于外设寄存器来讲仅128个地址显然不够的,所以又在RAM之后分配了96个字节(0x1800 - 0x185f),这里可能要放置一些对访问速度没有太高要求的寄存器。
  从0x1860到0xffff这个地址段属于flash。
  分配RAM地址时是从0x0070处开始分配,例如一个内部RAM为1k字节的芯片,RAM地址范围为0x0070 - 0x046f,剩余的0x0470-0x17ff地址将被废弃。然而分配flash程序存储器地址与此不同。flash地址从高处往下分配,例如一个16K程序存储器的芯片中实际flash地址空间为0xc000 - 0xffff。从0x1860到0xbfff这一段地址将被废弃。


  HCS08的flash地址配置相对比较复杂一些,如下图所示,对于一种芯片flash地址从FLASH_START到0xffff。中断 向量在0xffff处,而编译器会把用户程序默认放置到FLASH_START开始处,所以编译器生成的可执行代码文件会是地址 段两头有数据中间为空。中断向量前面还有一个FLASH寄存器地址空间,HCS08将一些掉电不丢失的配置用FLASH寄存器存储,例如FLASH保护区设置、中断向量重定向配置 等。flash寄存器占用的地址是0xffb0到0xffbf,这段地址显然也是用户程序的禁区。
  FLASH寄存器中有一个NVPROT寄存器用于设定flash保护区,保护区的内的数据是不允许通过指令来改写的。保护区会在flash的高地址区产生,非保护区的最后一个地址用NVOPT寄存器的FPS7~FPS1位来设定。要设立保护区不仅要设置fps7~fps1这个地址,还要设置此寄存器的FPDIS位才能生效。
  FLASH寄存器中有一个NVOPT寄存器,当这个寄存器的FNORED位为0时中断向量被重定向到非受保护区的最后地址处,要注意的是重定向后复位向量是不会重定向的,复位时仍从0xffff处取指令。
   最有可能的应用配置有两个,一是设立保护区将所有FLASH保护起来,中断向量不做重定向,这是一般应用。另一个可能的配置是用于IAP(BOOTLOADER),一个在应用中升级 用户程序的情况。我们可以把flash的最后几页保护起来并做向量重定向,IAP程序写到保护区,而用户程序放到非保护区。复位时IAP程序得到执行, 根据其它可能的条件判断执行用户程序还是进行用户区程序的升级操作。因为做了中断向量重定向,IAP程序显然不能再使用中断了。
  因为FLASH寄存器本质是嵌在FLASH内的一段存储器,所以配置过程显然应该就是写flash过程,hcs08在烧写flash程序的同时配置这些寄存器,为些在源代码中需要指出这些寄存器的值:

  //FLASH保护映像字节 
 const unsigned char NVPROT_INIT @0x0000FFBD = 0xF6; //F800~FFFF保护(C000~B7FF未被保护)
 //加密映像字节 NVOPT: KEYEN=0,FNORED=0(向量重定位),SEC01=1,SEC00=0
 const unsigned char NVOPT_INIT @0x0000FFBF = 0x3E;

这段代码往往与中断向量表一起写在Start08.c文件中。



芯艺工作室    蒙ICP备06005492号
Copyright© 2004-2023 ChipArt Studio All Rights Reserved