当前位置:首页 > 单片机 > 单片机
[导读] 1 Msp430Flash型单片机内部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的擦除、写入等操作。


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

该系列产品有助于嵌入式设计人员在更广泛的系统中轻松实现USB功能

关键字: 单片机 嵌入式设计 USB

单片机编程语言是程序员与微控制器进行交流的桥梁,它们构成了单片机系统的软件开发基石,决定着如何有效、高效地控制和管理单片机的各项资源。随着微控制器技术的不断发展,针对不同应用场景的需求,形成了丰富多样的编程语言体系。本文...

关键字: 单片机 微控制器

单片机,全称为“单片微型计算机”或“微控制器”(Microcontroller Unit,简称MCU),是一种高度集成化的电子器件,它是现代科技领域的关键组件,尤其在自动化控制、物联网、消费电子、汽车电子、工业控制等领域...

关键字: 单片机 MCU

STM32是由意法半导体公司(STMicroelectronics)推出的基于ARM Cortex-M内核的32位微控制器系列,以其高性能、低功耗、丰富的外设接口和强大的生态系统深受广大嵌入式开发者喜爱。本文将详细介绍S...

关键字: STM32 单片机

在当前的科技浪潮中,单片机作为嵌入式系统的重要组成部分,正以其强大的功能和广泛的应用领域受到越来越多行业的青睐。在众多单片机中,W79E2051以其卓越的性能和稳定的工作特性,成为市场上的明星产品。本文将深入探讨W79E...

关键字: 单片机 w79e2051单片机

单片机,又称为微控制器或微处理器,是现代电子设备中的核心部件之一。它集成了中央处理器、存储器、输入输出接口等电路,通过外部信号引脚与外部设备进行通信,实现对设备的控制和管理。本文将详细介绍单片机的外部信号引脚名称及其功能...

关键字: 单片机 微控制器 中央处理器

随着科技的飞速发展,单片机和嵌入式系统在现代电子设备中的应用越来越广泛。它们不仅提高了设备的智能化水平,还推动了各行各业的创新与发展。在单片机和嵌入式系统的开发中,编程语言的选择至关重要。本文将深入探讨单片机和嵌入式系统...

关键字: 单片机 嵌入式系统 电子设备

PLC(可编程逻辑控制器)和单片机是两种不同的控制设备,它们之间存在明显的区别:

关键字: 单片机 plc 控制器

西班牙塞维利亚,2024年3月12日 — Teledyne Technologies旗下公司、全球成像解决方案创新者Teledyne e2v宣布扩展其Flash™ CMOS图像传感器系列,推出Flash 2K LSA,该...

关键字: 图像传感器 Flash 摄像机

Holtek隆重推出全新一代32-bit Arm® Cortex®-M0+ 5V CAN MCU - HT32F53231/HT32F53241/HT32F53242/HT32F53252。这一系列单片机带有来自Bosc...

关键字: MCU 工业自动化 单片机
关闭
关闭