对FLASH编程必须满足编程最小电压2.2V;
内部FLASH必须在内存定时器设定的工作频率范围内工作,这个频率为257~476KHz。对于FLASH来讲编程和擦除的速度相对较慢。
MSP430内部集成了Flash控制器。主要由三个部分组成,分别为4个配置寄存器,Flash定时器和编程电压发生器。
配置寄存器主要用来配置Flash控制器的工作状态,Flash定时器用来产生编程会哦或者擦出操作的时钟。编程电压发生器用于产生编程火花则擦除操作中所需要的电压。
特别注意的是,从地址空间0xFFFF到0xFFC0是中断向量表的位置,这块区域可以不做中断向量表,也可以作为用户空间使用,但是不建议这样做。如果开启的中断所对应的中段向量表位置被用作用户空间使用,可能会导致中断服务函数发生跳转错误,进而导致代码跑飞。其中,存储在A段的往往存有器件的校准信息,所以对Segment A的操作设立了保护机制。
在Flash的定时器功能框图中,其时钟源可以是任意一个,通过FSSELx位来完成,选中的时钟源可以通过FNx来进行分频操作。
对Flash进行擦除,除了进行擦除模式配置,还需要对Flash进行一次假写入,一个Flash的写操作用来启动定时器和电压发生器,在写入之后便会对Flash进行擦除。
注意:在对Flash进行写操作之前必须进行一次擦除,否则可能会对Flash造成损毁。
基本步骤:1设置时钟源,得到Flash的工作频率。
2.
#include "msp430x14x.h" typedef unsigned char uchar; typedef unsigned int uint; int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; FCTL2=FWKEY+FSSEL0+FN0;// 时钟源设置,得到Flash的工作频率; return 0; } void Write_SegA(uchar value) { uchar * flashP; uchar i; flashP=(uchar * )0x1080; FCTL1=FWKEY+ERASE; FCTL3=FWKEY; *flashP=0; //假写入已启动擦除操作; FCTL1=FWKEY+WRT; for(i=0;i<128;i++) { *flashP++=value; } FCTL1=FWKEY; FCTL3=FWKEY+LOCK; } void Copy() { uchar * flashPa,*flashPb,i; flashPa=(uchar *)0x1080; flashPb=(uchar *)0x1000; FCTL1=FWKEY+ERASE; FCTL3=FWKEY; *flashPb=0; FCTL1=FWKEY+WRT; for(i=0;i<128;i++) { *flashPb++=*flashPa; } FCTL1=FWKEY; FCTL3=FWKEY+LOCK; }