5408|0

6828

帖子

0

TA的资源

五彩晶圆(高级)

楼主
 

Msp430 Flash的擦除、写入、读取操作 [复制链接]

1 Msp430Flash型单片机内部Flash存储器介绍


MSP430的Flash存储器是可位、字节、字寻址和编程的存储器。该模块由一个集成控制器来控制编程和擦除的操作。控制器包括三个寄存器,一个时序发生器及一个提供编程、擦除电压的电压发生器。


Msp430的Flash存储器的特点有:


1)产生内部编程电压


2)可位、字节、字编程,可以单个操作,也可以连续多个操作


3)超低功耗操作


4)支持段擦除和多段模块擦除


2 Flash存储器的分割


Msp430 Flash存储器分成多个段。可对其进行单个字节、字的写入,也可以进行连续多个字、字节的写入操作,但是最小的擦除单位是段。


Flash存储器被分割成两部分:主存储器和信息存储器,两者在操作上没有什么区别。两部分的区别在于段的大小和物理地址的不同。


以Msp430F149为例,信息存储器有两个128字节的段,即segmentA和segmentB,主存储器有多个512字节的段。Msp430F149内部Flash的地址为0x1000H~0xFFFFH,计60K。信息段SegA的起始地址为0x1080H,信息段SegB的起始地址为0x1000H。


3 Flash存储器的操作


在默认状态下,处于读操作模式。在读操作模式中,Flash存储器不能被擦除和写入,时序发生器和电压发生被关闭,存储器操作指向ROM区。


Msp430 Flash存储器在系统编程ISP(in-system programmable)不需要额外的外部电压。CPU能够对Flash直接编程。Flash存储器的写入/擦除通过BLKWRT、WRT、MERAS、ERASE等位确定。


3.1擦除


Flash存储器各位的缺省值为1,每一位都可以单独编程为0,但只有擦除操作才能将其恢复为1。擦除操作的最小单位是段。通过erase和meras位设置可选择3种擦除模式。



擦除操作开始于对擦除的地址范围内的任意位置执行一次空写入。空写入的目的是启动时序发生器和擦除操作。在空写入操作之后,BUSY位自动置位,并保持到擦除周期结束。BUSY、MERAS、ERASE在擦除周期结束后自动复位。


3.2写入


写入模式由WRT和BLKWRT位进行设置。



所有的写入模式使用一系列特有的写入命令,采用块写入的速度大约是单个写入的2倍,因为电压发生器在块写入完成器件均能保持。对于这两种写入模式,任何能修改目的操作数的指令均能用于修改地址。一个Flash字不能再擦除器件进行两次以上的写入。


当启动写入操作时,BUSY置位,写入结束时复位。


4操作编程


4.1 Flash擦除


对Flash要写入数据,必须先擦除相应的段,且对Flash存储器的擦除必须是整段进行的,可以一段一段擦,也可以多段一起擦除。擦除操作的顺序如下:


1)选择适当的时钟源和分频因子;


2)清除LOCK位


3)判断BUSY位,只有当BUSY=0时才可以执行下一步


4)使能段操作,设置ERASE、MERAS位等(如果是擦除一段,则ERASE=1,如果擦除多段,则MERAS=1,如果擦除整个Flash,则ERASE=1,MERAS=1)


5)对擦除的地址范围内的任意位置作一次空写入,以启动擦除操作


6)在擦除周期内,时钟源始终有效,不修改分频因子


7)操作完成后,置位LOCK


根据上述操作顺序,编写程序代码如下:


void FlashErase(unsigned int adr)


{


uchar *p0;


FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//选择时钟源,分频


FCTL3 = FWKEY;//清除LOCK


while(FCTL3 & BUSY);//如果出于忙,则等待


FCTL1 = FWKEY + ERASE;//使能段操作


p0 = (unsigned char *)adr;//数值强制转换成指针


*p0 = 0;//向段内任意地址写0,即空写入,启动擦除操作


FCTL1 = FWKEY;


FCTL3 = FWKEY + LOCK;


while(FCTL3 & BUSY);


}


4.2写入


对Flash的写入数据可以是单字、单字节,也可以是连续多个字或字节(即块操作)。编程写入操作的顺序如下:


1)选择适当的时钟源和分频因子;


2)清除LOCK位


3)判断BUSY位,只有当BUSY=0时才可以执行下一步操作


4)使能写入功能,设置WRT、BLKWRT(如果写入单字或单字节则WRT=1,如果是块写入,或者是多字、多字节连续写入则WRT=1,BLKWRT=1);


5)判断BUSY位,只有当BUSY=0时才可以执行下一步操作


6)写入数据


7)判忙,完了之后清除WRT,置位LOCK


根据上述操作顺序,编写程序代码如下:


//write single byte


//Adr为要编程的地址,没有奇偶地址要求、DataB为要编程的字节数据


void FlashWB(unsigned char Adr,unsigned char DataB)


{


FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK16*FN4 + 8*FN3


FCTL3 = FWKEY;


FCTL1 = FWKEY + WRT;


while(FCTL3 & BUSY);


*((unsigned int *)Adr)=DataB;//数值强制转换成指针,指向地址数据Adr所表示的内存单元


//将数据字DataW赋值给内存单元


FCTL1 = FWKEY;


FCTL3 = FWKEY + LOCK;


while(FCTL3 & BUSY);


}


//write single word


//Adr为要编程的地址,应该是偶地址、DataW为要编程的字数据


void FlashWW(unsigned int Adr,unsigned int DataW)


{


FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK16*FN4 + 8*FN3


FCTL3 = FWKEY;


FCTL1 = FWKEY + WRT;


while(FCTL3 & BUSY);


*((unsigned int *)Adr)=DataW;//数值强制转换成指针,指向地址数据Adr所表示的内存单元


//将数据字DataW赋值给内存单元


FCTL1 = FWKEY;


FCTL3 = FWKEY + LOCK;


while(FCTL3 & BUSY);


}


/*************************************************


//向FLASH信息区写入指定数量的字节数据


//unsigned char *pc_byte信息区数据指针


//unsigned char *Datain :读出数据存放数据数组,8位长


//unsigned char count :读操的数量,范围0-127


**************************************************/


void FlashWrite(uchar *pc_byte,uchar *Datain,uint count)


{


FCTL2 = FWKEY + FSSEL_1 + FN3 + FN4;//MCLK16*FN4 + 8*FN3


FCTL3 = FWKEY;


FCTL1 = FWKEY + WRT;


while(FCTL3 & BUSY);//如果处于忙状态,则等待




while(count--)


{


while(FCTL3 & BUSY);


*pc_byte++ = *Datain++;


}




FCTL1 = FWKEY;


FCTL3 = FWKEY + LOCK;


while(FCTL3 & BUSY);


}


注意:在对字写入和字节写入的时候,用于指向信息区数据指针类型的区别,字写入时候为*((unsigned int *)Adr),字节写入时候为*((unsigned char *)Adr)。


4.3读取


根据查看的书籍资料和网络资料得出,内部Flash的读取操作没有顺序的要求,一般Flash默认的操作方式即为读模式。读取Flash的程序代码如下:


/*************************************************


//向FLASH信息区读出指定数量的字节数据


//unsigned char *pc_byte信息区数据指针


//unsigned char *Dataout :读出数据存放数据数组,8位长


//unsigned char count :读操的数量,范围0-127


**************************************************/


void FlashRead(uchar *pc_byte,uchar *Dataout,uint count)


{


while(count--)


{


*Dataout = *pc_byte;


Dataout++;


pc_byte++;


}


}


 
点赞 关注(1)

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表