历史上的今天
返回首页

历史上的今天

今天是:2025年05月06日(星期二)

正在发生

2020年05月06日 | 关于Msp430 Flash型单片机内部Flash的操作

2020-05-06 来源:eefocus

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;//MCLK  16*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;//MCLK  16*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;//MCLK  16*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的擦除、写入等操作。

推荐阅读

史海拾趣

Everspin Technologies公司的发展小趣事

在寻求更广泛的市场应用和技术合作方面,Everspin与Quicklogic Corporation签订了分包协议。根据协议,Quicklogic将其部分开发服务分包给Everspin,共同推进战略辐射加固现场可编程门阵列原型项目的开发。这一合作不仅展示了Everspin在电子行业中的技术实力和市场影响力,也为其未来的发展开辟了新的道路。

以上五个故事概述了Everspin Technologies公司在电子行业中发展起来的关键历程和成就。这些故事展示了Everspin在MRAM技术领域的领先地位、创新能力和市场应用方面的成功。

Dae Ryung Electronic Co Ltd公司的发展小趣事

Dae Ryung Electronic Co Ltd公司自创立之初,就致力于电子技术的研发与创新。公司创始人深知技术是企业发展的核心驱动力,因此投入大量资源用于研发。经过数年努力,公司成功研发出一款高性能、低成本的微处理器,这一产品迅速在市场上获得认可,为公司带来了可观的利润。随后,公司继续加大研发投入,不断推出新产品,逐渐在电子行业中树立了技术领先的形象。

Data Delay Devices公司的发展小趣事

企业文化是企业的灵魂和核心竞争力之一。DDD公司一直注重企业文化的建设和发展。公司倡导“创新、协作、务实、进取”的企业精神,鼓励员工勇于创新、敢于担当、追求卓越。同时,DDD公司还注重员工培训和福利待遇的改善,为员工提供了广阔的发展空间和良好的工作环境。这种积极向上的企业文化氛围使得DDD公司成为了一个充满活力和凝聚力的团队。

EF Johnson Technologies Inc公司的发展小趣事

面对日益激烈的国内市场竞争,EF Johnson公司制定了国际化战略,将目光投向了海外市场。公司通过与国外代理商的合作,成功将产品打入国际市场,并获得了良好的口碑。同时,公司还积极参与国际展会和技术交流活动,不断提升品牌影响力。在国际化战略的推动下,EF Johnson的海外市场份额逐步扩大,成为一家具有全球影响力的电子通信企业。

东晶(ECEC)公司的发展小趣事

东晶电子自创立以来,始终将技术创新作为公司发展的核心动力。在21世纪初,随着通信技术的迅猛发展,对高性能、高稳定性的石英晶体元器件需求急剧增加。东晶电子凭借其强大的研发团队,成功研发出一系列高精度、高稳定的石英晶体谐振器和振荡器,打破了国外厂商的技术垄断,为中国通信产业提供了关键元器件支持。这一技术突破为公司赢得了市场口碑,也奠定了其在电子行业中的领先地位。

广芯电子(BROADCHIP)公司的发展小趣事

近年来,随着电子信息技术的快速发展和智能化趋势的加剧,东晶电子也面临着新的机遇和挑战。为了适应市场变化和满足客户需求,公司开始实施战略转型和升级。公司加大了对新型电子元器件的研发力度,推动产品向微型化、功能化、高精度方向发展。同时,公司还积极开拓新领域和新市场,拓展业务范围和市场份额。这些举措为公司未来的发展奠定了坚实的基础。

请注意,这些故事是基于已知信息的概括性描述,并非具体的历史事件。在实际情况中,东晶电子的发展历程可能更加复杂和多样化。

问答坊 | AI 解惑

方波有源滤波器谐波电流检测的一种新方法

方波有源滤波器谐波电流检测的一种新方法 随着电力电子技术的发展,电力电子装置的应用日益广泛,引起的电网谐波污染也日趋严重[1][2]。因此,对电网谐波采取有效的抑制并对无功功率进行动态补偿已成为重要的研究方向。 采用电力滤波装置就近吸收谐 ...…

查看全部问答>

智能监控机器人

本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 智能监控机器人  …

查看全部问答>

LM5574/5/6系列元器件手册分享

LM5574Q is an Automotive Grade product that is AEC-Q100 grade 1 qualified (−40°C to + 125°C operating junction temperature),75V Input Voltage Max, 0.5A Output Current。 器件手册: LM5575Q is an Automotive Grade product ...…

查看全部问答>

关于DSP 与FPGA 数据线连接的问题

用DSP和FPGA连接,发现FPGA配置后,DSP的数据线某些位被拉低了,不配置FPGA就没问题。这就是典型的DSP与FPGA间数据总线没处理好。FPGA的数据都要通过三态门接到数据总线上,输出,输入受DSP的控制。这儿还有一个问题就是关于FPGA的IO双向操作的问题 ...…

查看全部问答>

关于dm9000a延时的问题

最近在wince下使用了dm9000a网卡,现在发现在主机ping开发板时会出现ping个几祯就会出现1祯延时很高(秒级的),其他都在1,2ms左右,查了好久没找到原因,请各位大虾帮忙分析下原因可能在哪里。驱动用的是davicom提供的程序。…

查看全部问答>

新手问题,求大家帮个忙

我运行自己建的一个工程,却弹出 Attempt to connect failed immediately 错误! 我装了EVC4.0+STANDARD_SDK5,CPU选了WINCE(EMULATOR)。…

查看全部问答>

LM3S8962试用前的准备—KEIL软件破解

快拿到论坛的试用LM3S8962开发板了,心里很激动,搜集了好多资料,准备好好学习TI M3。俗话说工欲善其事必先利其器,好的开发工具能提高开发效率,由于学51时就用KEIL软件,所以对KEIL软件情有独钟,现在开始学习ARM了,还是选择KEIL,看到大家写了 ...…

查看全部问答>

求一LM3S811的SPI使用的例程

我现在学习LM3S811,但不知道如何使用SPI,想问有没有对SPI的使用比较熟悉的坛友,求指教,谢谢。…

查看全部问答>

dsp 编译出现的 error

TI6763:   error:: system error, can\'t open file \'w.obj\' for input: No such file or dire   请问这是为什么啊?…

查看全部问答>

求8*8点阵电路、显示程序

要求:①用8*8的LED点阵作为字符显示器       ②显示全部的大写英文字符       ③显示方式:依次显示和连续显示。         显示频率可调       ④ ...…

查看全部问答>