freescale飞思卡尔 HC9S12 系列单片机 Flash擦写详解(二)之Flash指令寄存器

  在上一节中我介绍了Flash控制器时钟频率的设置,对于一般不需要解保护的Flash操作而言,设置了时钟频率就可以开始对Flash控制器的控制寄存器写入指令从而对之前我们觉得神秘莫测的Flash进行操作了。关于Flash的指令操作,我们首先先介绍其相关的几个寄存器,以及它们的指令形式,还有如何应用这些指令到寄存器上。

  首先我们先看Flash状态寄存器FSTAT,凡是涉及到状态的,无非就是标志位,所以在这个寄存器中的所有位都是标志位,由于我们这篇文档不涉及到写保护与错误处理,所以只需要看其中的两位,CCIF与MGBUSY。

  对CCIF位与MGBUSY位,手册中都已经做了解释如下:

  CCIF位是指令执行完成中断标志,我们这里是将其当做中断标志位查询来用的(有兴趣可以好好看看手册如何实现中断),CCIF用来显示一个Flash指令是否已经执行完成,若CCIF = 0 则表示Flash控制器正在执行指令,若CCIF = 1则表示Flash控制器当前空闲,前一条指令已经执行完毕。除此以外,CCIF的重要作用就是让Flash控制器开始执行指令,由于Flash控制器的指令内容需要在开始前先行准备到Flash指令寄存器中,当指令准备完成后,通过将CCIF位置1就可以使Flash控制器执行当前写入在指令寄存器中的指令。需要注意的是,当Flash需要执行下一条指令前,务必要检查前一条指令是否已经执行完毕,即CCIF是否为1,若CCIF = 1则再写入1方可执行指令寄存器中的内容

  读取MGBUSY位与读取CCIF位功能类似,手册中关于这一位的描述是这样的:

  当MGBUSY = 0 表示Flash控制器目前空闲,MGBUSY = 1 表示当前Flash控制器正在执行指令。一般而言我们还是用CCIF多一点,看个人喜好了

  认识了标志寄存器后,就该隆重介绍Flash擦写过程中最重要的两大寄存器——FCCOB寄存器与FCCOBIX寄存器了。

  关于FCCOBIX寄存器,由于介绍比较短,我们先来介绍了FCCOBIX寄存器,一样先看手册:

  这是个只有3位的寄存器最多只能有8个状态,上面的简介显示,这个寄存器是FCCOB的索引寄存器,更进一步来看文档:

  通过手册中的解释,也就是说FCCOBIX的两位决定当前读取或者写入FCCOB的是哪一个word(一般而言一个word在单片机中指两个字节),也就是说FCCOB是一个多word的寄存器,通过FCCOBIX来确定当前操作或者读取的是哪一位。

  下面我们就来看看FCCOB(Flash通用命令对象寄存器,简称Flash指令寄存器)这个寄存器的介绍:

  第一句说FCCOB是一个六个word长度的数组,通过FCCOBIX寄存器来定位当前操作的是哪个word。一个word是16位的,前[7:0]位Low,后[15:8]为High。我们似乎很少见到这种数组类型的寄存器,但如果我们将它与我们C语言中的数组联系起来就非常容易理解了。由于FCCOB只有6个word长,所以FCCOBIX范围为0x00-0x05,也就是说当FCCOBIX = 0x00时,读写FCCOB寄存器操作第0个word的内容,当FCCOBIX = 0x01时,读写FCCOB寄存器操作第1个word的内容以此类推。也就是说我们操作的FCCOB实际的内容是由FCCOBIX这个索引寄存器来完全控制的。

  本篇文档中着重介绍了Flash擦写相关的几个重要寄存器:

  1. Flash操作状态寄存器FSTAT,其中读取CCIF位可以判断当前Flash控制器正在执行指令与否。在Flash控制器空闲时,向CCIF中写入1可以开始指令执行

  2. Flash指令寄存器FCCOB与FCCOBIX,其中FCCOB为长度为6个word的数组寄存器,通过FCCOBIX中的内容索引当前操作的是哪一个word

  在介绍完执行指令的寄存器后,下面我们将介绍Flash操作的指令与执行过程

  未完待续

  注: 本系列文章均为原创,如有转载引用请标明来源 

 

posted @ 2018-09-22 14:03  花花世界1202  阅读(1916)  评论(0编辑  收藏  举报