您的位置 首页 IOT

Msp430单片机内部Flash存储器的特色及功用解析

Msp430单片机内部Flash存储器的特点及功能解析-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种擦除形式。

MERAS

ERASE

擦除形式

0

1

段擦除

1

0

多段擦除(一切主存储器的段)

1

1

全体擦除(LOCKA=0时,擦除一切主存储器和信息存储器的段;主存储器的段只要当LOCKA=0时可以擦除)

擦除操作开端于对擦除的地址规模内的恣意方位履行一次空写入。空写入的意图是发动时序产生器和擦除操作。在空写入操作之后,BUSY位主动置位,并坚持到擦除周期完毕。BUSY、MERAS、ERASE在擦除周期完毕后主动复位。

3.2写入

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

BLKWRT(块写入形式挑选)

WRT(写形式挑选位)

写入形式

0

1

单字节、单字写入

1

1

块写入

一切的写入形式运用一系列特有的写入指令,选用块写入的速度大约是单个写入的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++;

}

}

在网上查找材料的时分,如同看到过有位网友的博客说,内部Flash的地址是主动加1的,依照他的了解,函数中pc_byte++句子就没有用处了,但是现实否则,我在调试过程中,发现并不能主动加1,pc_byte++句子仍是有必要的。调用上述函数,可以经过这样的方法FlashRead((uchar *)0x1000,a,4);即从0x1080地址处开端,接连读取4个字节的数据,送给数组a。

5小结

对Msp430片内Flash的操作是经过对3个操控字中的相应位来完结的,只要操控位的正确组合,才干完成相应的功用。

一起在编程中留意灵敏运用数组和指针,以及指向数组的指针等,可以到达灵敏编程的意图,不过本文中给出的几个程序段,基本上可以完成对Msp430 Flash的擦除、写入等操作。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/iot/345086.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部