MSP430单片机flash存储器
MSP430F149单片机基础知识
1、 FCTL1寄存器
15 8 7 6 5 4 3 2 1 0
安全键值 BLKWRT WRT Reserved Reserved Reserved MERAS ERASE Reserved
rw-0 rw-0 r0 r0 r0 rw-0 rw-0 r0
该寄存器定义了Flash模块的擦除和编程的控制位。其中高8位为安全键值,该字段读出的
内容
财务内部控制制度的内容财务内部控制制度的内容人员招聘与配置的内容项目成本控制的内容消防安全演练内容
总是96H,写入时必须为A5H,否则不能进行操作。
下面分别对低8位进行介绍:
BLKWRT Bit7 按块写模式位。复位值为0,在进行块写操作时,WRT位必须置1;当
设置EMEX位时,BLKWRT自动复位。
0 块写模式关闭;
块写模式开启。 1
WRT Bit6 写模式使能位。复位值为0,当设置EMEX位时,WRT自动复位。
0 不能进行写操作;
写操作允许。 1
MERAS、ERASE Bits2-1 该两位用来控制擦除方式选择位。复位值为0。当设置EMEX位时,这
两位自动复位。
不擦除; 00
01 只擦除单个段;
10 擦除所有的主程序区;
擦除所有的主程序区和信息区。 11
2、 FCTL2寄存器
15 8 7 6 5 4 3 2 1 0
安全键值 FSSELx FNx
rw-0 rw-1 rw-0 rw-0 rw-0 rw-0 rw-0 rw-0
该寄存器定义了Flash模块的擦除和编程所需要的时序时错钟。其中高8位为安全键值,该字段读出的内容总是96H,写入时必须为A5H,否则不能进行操作。
下面分别对低8位进行介绍:
FSSELx Bit7~6 该两位用来定义Flash模块控制器时钟源的选择。复位值为01。
00 ACLK; 10 SMCLK;
11 SMCLK。 01 MCLK;
FNx Bit5~0 这6位定义了分频系数。分频系数为FN5~FN0的值。如当FN5~FN0
的值为2时,其分频系数为3。复位值为1,分频系数为2.。 3、 FCTL3寄存器
15 8 7 6 5 4 3 2 1 0
安全键值 Reserved Reserved EMEX LOCK WAIT ACCVIFG KEYV BUSY
r0 r0 rw-0 rw-1 r-1 rw-0 rw-(0) rw-(0)
该寄存器定义了Flash模块的擦除和编程操作的一些标志位。其中高8位为安全键值,该字段读出的内容总是96H,写入时必须为A5H,否则不能进行操作。
下面分别对低8位进行介绍:
EMEX Bit5 紧急退出位。当该位为1时,则产即退出对Flash的操作。
LOCK Bit4 保护位。
0 不加锁,可以对Flash操作;
1 加锁,这时不能对Flash进行写和擦除操作。
WAIT Bit3 等待指示位。该位显示Flash正在进行写操作。
0 还没准备好,此时不能进行写操作;
1 Flash准备好下一次写操作。
ACCVIFG Bit2 违反访问中断标志。该位只能软件清零。
0 没有中断挂起;
1 有中断挂起。
KEYV Bit1. 安全值错误标志。
0 安全值正确;
1 安全值错误。
BUSY Bit0 忙标志。
0 不忙;
1 忙。
4、 IE1寄存器
7 6 5 4 3 2 1 0
ACCVIE
rw-0
该位是用来允许违反中断访问的控制位。当该位为1时,中断允许;当该位为0时,中断禁止。
下面的程序为具体的写内部Flash的实例,往内部信息段的三个地址写入数据1、2、3,三个地址分别为0x1080、0x1083、0x1085。在芯片写入数据前首先要把Flash擦除,擦除后的Flash数据全部为0xFF,之后才能进行写操作。程序运行后,读者可以通过IAR IDE查看内部Flash的数据。
#include
#define uchar unsigned char
#define uint unsigned int
void write_Seg (unsigned char value,unsigned int add)
unsigned char temp[128]
void int_clk()
{
uchar I;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHz,SMCLK为1MHz
{
IFG1&=~OFIFG; //清除振荡错误标志
for(i=0;i<100;i++)
_nop() //延时等待
}
While ((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
IFG1&=~OFIFG;
}
Delay()
{
Unsigned int i=0;
For(i=0;i<=1000;i++)
;
}
Void eraseFlashSegment(unsignged int add)
{
Unsigned char *ptrFlash;
ptrFlash=(unsignge char *)add;
FCTL1= FWKEY+WRASE; //使能擦除位
FCTL3=FWKEY; //清除锁定位
*ptrFlash=0x00;
Delay()
Delay()
FCTL3=FWEY+LOCK; //置锁定位为1
}
Void write_Sen(unsigned char value,unsigned int add)
{
Unsigned char *Flash_prt; //Flash访问指针
Flash_prt=(unsigned char *)add; //初始化指针
FCTL3=FWKEY; //清除锁定位
FCTL1=FWKEY+WRT; //使能写使能位
While(BUSY&FCTL3);
*Flash_prt=value;
FCTL1=FWKEY; //清除写使能
FCTL3=FWKEY+LOCK; //置锁定位为1
}
Void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //禁止看门狗
Int_clk();
FCTL2=FWKEY+FSSEL0+FN0; //MCLK/2作为Flash操作时序的时钟
Generator
eraseFlashSegment(ox1080); //擦除SegmentA Flash
write_Seg(1,0x1080); //写地址0x1080为1
write_Seg(2,0x1083); //写地址0x1083为2
write_Seg(3,0x1085); //写地址0x1085为3
while(1);
}
通过上面的程序可以看出,只要设置好FCTL1、FCTL2、FCTL3和IE1就可以对Flash模块
进行适当的读/写操作。