今天我们来学习一下MSP430单片机的FLASH操作程序设计
1,FLASH操作程序设计
下面我们来学习编程的内容。在学习编程前,我们要先了解一下FLASH存储模块的控制寄存器。
FLASH存储模块的所有操作都通过控制相关的控制寄存器来实现的。包括FCTL1、FCTL2、FCTL3三个控制寄存器,其中FCTL1主要包含对FLASH的编程和擦除操作的控制位;FCTL2主要定义进入时序发生器前的时钟源和分频系数;FCTL3保存FLASH存储模块的一些标志位。
2, FCTL1控制寄存器
FWKEY:FLASH存储模块的安全键值。共8位,对FLASH操作时应该向其中写入对应的安全键值,否则会引起PUC信号以及KEYV信号。0x96:读取时的安全键值;0x5A:写入时的安全键值。
BLKWRT:段编程控制位。当需要对某一个段或者几个段连续编程时,使用段编程方式可以加快编程的速度。1:使用段编程方式;0:不适用段编程方式。
WRT:编程控制位。当需要对FLASH编程时,必须对该位置位,否则会导致ACCVIFG(非法访问中断标志位)置位。1:允许对FLASH编程;0:禁止对FLASH编程。
MERAS:多段擦除控制位,当需要擦除多段时,对改为置位。1:擦除多段;0:不擦除。
ERASE:但段擦除控制位,当需要擦除一个段时,对该位进行置位。1:擦除一个段;0:不擦除。
3,FCTL2控制寄存器
FWKEY:FLASH存储模块的安全键值。共8位,对FLASH操作时应该向其中写入对应的安全键值,否则会引起PUC信号以及KEYV信号。0x96:读取时的安全键值;0x5A:写入时的安全键值。
FSSEL1~0:选择FLASH存储模块的时序发生器的时钟源。3:选择SMCLK;2:选择SMCLK;1:选择CMLK;0:选择ACLK。
FN5-0:为时序发生器的时钟源选择分频系数,最终的分频比为32*FN5+16*FN4+8*FN3+4*FN2+2*FN1+FN0+1.
4, FCTL3控制寄存器
FWKEY为安全键值,和前两个一样,我们不在赘述。
EMEX:紧急退出位。对该位置位能够紧急停止对FLASH的操作。1:紧急停止FLASH操作;0:不操作。
LOCK:FLASH锁定位。如果在该位置位时对FLASH进行擦除和写入操作会导致非法访问,对应的标志位ACCVIFGF置位。1:锁定FLASH存储模块,锁定时可读,但不可擦除和写入;0:不锁定FLASH存储模块,可读可写可擦除。
WAIT:等待标志位,用户通过读取该位的状态已获得FLASH存储器和段编程状态。1:段编程有效;0:段编程操作正在进行。
ACCVIFG:非法访问标志位。1:非法访问;0:没有非法访问。
KEYV:非法安全键值标志位。1:错误安全键值;0:正确的安全键值。
BUSY:FLASH存储模块忙标志位。1:当前FLASH存储模块忙;0:当前FLASH存储模块空闲。
5,单字节写入操作
程序时对单字节写入的操作,向Seg_A中的地址0x1090写入数据0xAA。从这个程序段,我们可以看出向FLASH写入的数据的基本流程,大部分与擦除还是很相似的。需要特别注意的是,在这段程序中我们省略了检测BUSY状态位的环节,并且在实际情况下,只要用户程序不是频繁的、交叉的操作FLASH存储模块,一般是需要检测BUSY位的。
对于多字节的写入操作,其基本操作方式单字节类似,只需要每次修改FLASH地址指针,并写入对应的数据即可。
6,段擦除操作
MSP430系列MCU尽管可以向FLASH存储模块的任意地址写入数据,但是擦除操作只能以段位基本单位操作,即最少只能擦除Seg_A和Seg_B段。从示例的程序中,可以看出段擦除的基本流程:除了启动擦除操作之前的基本设置,擦除之后的基本设置之外,还需特别注意的是:向要擦除的段(程序中位Seg_A)任意一个地址中写入任意数据以启动擦除操作。同样,这是一个简化的程序段,也没有检测BUSY等标志位。
这是一个非常经典的TI的关于FLASH存储模块的程序,在几乎所有的关于MSP430的书籍等资料上都可以看见他的身影。这段程序包含了擦除,段写入、段复制等操作,是一个非常好的例子。
需要特别注意的是:前面的程序仅仅是一个示例,当你在很复杂的程序中操作FLASH前,一定要先禁止所有的中断并禁用看门狗,切记切记。