本章介绍MSP430的Flash存储结构
1,FLASH存储器
1.1 FLASH存储器
MSP430的FLASH型芯片由于采用FLASH存储器作为程序代码及信息的存储,因此可以实现多次擦除和写入,也可以实现在线写入。FLASH存储器的写入可以经过MSP430系列芯片的JTAG接口来完成,也可以由芯片内的驻留软件实现FLASH的写入操作,只是要求运行的程序代码存储区和待编程的存储区不在同一模块中。因此,甚至可以实现用FLASH存储器中的程序来对FLASH存储器进行编程。
2.2 FLASH存储器构成
MSP430是可以按照位、字节和字进行寻址,它的可编程FLASH存储器主要是由一个集成的控制器和FLASH存储单元来组成的,控制器由3个寄存器:一个定时器,一个定时发生器和一个电压产生器来构成的。这个电压产生器主要用来对提供FLASH编程电压和擦除电压,我们知道其实FLASH是一种特殊的存储介质,对他进行操作时所需要的电压实际上高于这个器件平常的工作电压的,这也就是为什么有些单片机是不支持ISP的,比如像最古老的AT89C51,它内部也是FLASH结构,但是你要是想对它进行编程的话,就必须用专用的编程器才可以。有了内部的电压发生器以后呢,就可以保证这个单片机在正常的工作电压下工作,比如说给一个3.3V的供电电压时,就可以对它内部的FLASH进行编程,或者说就可以让它自己对自己的FLASH进行编程,这个在后面介绍。
2.3计算分支跳转和子程序调用
MSP430的FLASH的主要特征:
※内部的编程电压发生器;
※可以进行位、字节和字寻址;
※超低功耗的操作;
※可以进行段的擦除和整体擦除。
有一点需要注意的就是:在对MSP430内部的FLASH进行操作的时候,供电电压不能小于2.7V。因为内部的电压发生器是有一个最小的供电电压的,如果小于这个电压,电压产生器就不能产生它对FLASH操作需要的足够电压了。
2.4FLASH的内部框图
这就是MSP430的FLASH的内部框图,大家可以看一下,这是FLASH存储的阵列,然后呢,这就是FCTL1,控制寄存器1,下面依次是控制寄存器2,控制寄存器3。这3个寄存器呢,对它的设定就可以完成对FLASH操作的一些基本的设定。这是定时发生器,它主要用来产生对FLASH操作的时钟。还有就是编程电压产生器。这是它内部的一个基本结构。
2.5FLASH内部的分段
我们来看一下FLASH内部的分段。我们知道FLASH是一个比较特殊的存储介质。它在写入的时候用户可以按照位写入、字节写入或者字写入。但是呢,如果想要擦除的话,那么就必须要擦除一个整段。就是它内部的这个段,是一个擦除时的最小单位。这就和传统的EEPROM不一样了,我们都知道EEPROM是电可擦除的存储介质,它内部也可以按照位、字节和字写入,但是擦除的时候也可以按照位、字节和字擦除。但是FLASH不同,FLASH特殊的结构要求必须按照段segment擦除,这是一个它的特例。
2.6FLASH存储区分段图
MSP430的FLASH内部通常情况是分成两部分的,一部分是主存储区,也就是main memory。一部分叫做信息存储区,也就是information memory。其实他们的作用是完全一样的,不同的就是在于每个存储区的分段的大小。
这个图是一个大概4KB的存储区的示意图。可以看到,在这个主存储区里面,它每一个分段是按照512个字节为一段进行分段的;而在这个信息存储区里面是按照128个字节为一段进行操作的,就是说你在擦出的时候信息端擦一次是128个字节,而在主存储区擦一段是512字节,这就是他们最主要的不同点。其余的在操作上,信息端和主存储端是没有差别的。
2.7对FLASH存储器的操作
FLASH存储区支持以下的一些操作:
※字或字节的写入;也就是说一次写入一个字节或一个字。
※块状的写入;也就是说一次连续的写入多个数据。
※段的擦除;
※主存储区的使用段的擦除;
※所有段的擦除。
2.8FLASH的定时发生器
MSP430内部的FLASH的定时发生器,它用来产生对FLASH编程的时钟,这个时钟有一个特殊的要求就是,它必须在大概257KHz到4763KHz之间,这是一个编程时钟频率的一个范围。
定时发生器的时钟源可以由三种时钟源的任何一种。然后会经过一个分频器,然后就产生了f(FTG)这个对FLASH编程的时钟。这是一个基本的时钟编程器。
2.9擦除模式
在擦除的时候,有三种模式擦除模式:
第一种是段擦除,就是擦除一个段的内容。
第二种是大量的段擦除,就是擦除所有主存储区的段的内容。
第三种是擦除所有的段,就是擦除所有段的内容。
这个模式是由MERAS和ERASE两个控制位控制的。
2.10 擦除时序图
我们现在看到的就是FLASH的擦除时序图。
BUSY是一个标志位。实际操作过程是这样的,用户首先要经过一个假的写入,用一个指针指向需要擦除的段的首地址,然后向段里面写入一个数据。这样的话就可以启动擦除的过程。
这是一个擦除的时序,一旦启动擦除后,BUSY就是一个标志位,指示现在对FLASH进行操作,然后BUSY就会变高,经过一段时间,产生这个编程电压,然后开始进行擦除操作,最后需要一段时间来除掉这个编程电压,然后BUSY就变低了。
2.11启动擦除
这就是一个擦除的流程图。首先在擦除之前需要关闭所有的中断和看门狗,因为在进行擦除FLASH的会后,CPU是进去休眠状态的,这时候如果有中段发生的话,CPU也不会响应,如果有看门狗复位的话,将导致整个系统复位,这样擦除的时候将会导致错误,会有不可预知的结果。
关闭中断和看门狗之后,就是设置FLASH控制器和启动擦除模式,然后通过一个伪的写入,就会启动擦除模式,擦除完成之后就会继续执行下一条指令。
2.12写入时钟
对FLASH的写入有两种模式,一种是字节或字的写入,一种是块写入。
在写入时,还是这么一个时序图,大家可以看一下。首先是产生一个编程电压,然后就行编程操作,最后移除这个编程电压。然后这个BUSY位变0。在整个编程过程中,BUSY位一直保持为1,表示当前正在对FLASH进行操作。
2.13启动写入过程
写入过程同样是有两种流程,一种是从FLASH中,流程图是这个。而另一种是代码从RAM中写入,流程图是这个。区别就是当代码从FLASH中写入时,CPU会被挂起进入休眠模式。
2.14块写入操作
块写入可以有效的加快编程速度,但是它也有一些问题。就是说在进行块写入的时候,会有一段累计编程时间,写入块的时间是不能超过这个累计编程时间的,通常这个累计编程实践位4ms。可以一次写入多个字节,但是时间不能超过累计编程时间。是因为编程电压不能长时间加在存储介质上的,否则容易损坏,所以需要用户计算好进行块写入时的时间。时间不能超过4ms。这个问题需要注意。还有就是块写入的代码必须要从RAM中执行。
块写入流程图:
首先关闭中断和看门狗,检查BUSY位,设置控制寄存器,然后写入。