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的擦除、写入等操作。
关于人工智能在太空探索方面的五个应用
VR需要减重!Kopin进军微型OLED市场
AI芯片独角兽异军突起 寒武纪即将迎来大爆发
从高利润到平均利润 LED芯片将走向微利时代
5G将助力南方电网向智能电网发展
Msp430单片机内部Flash存储器的特点及功能解析
精益生产和数字化是如何相互成就的?
逆变器的功能特点及主要分类
华为基于台积电5nm工艺打造的新款麒麟处理器来了
随着近几年新能源汽车销量逐渐攀升大多是是政策驱动
燃料电池汽车商业化不断推进,国产氢能厂商机遇与挑战并存
中央空调的基本知识 中央空调的三大系统介绍
今年乘用车电芯方向的选择清晰和明
透气可穿戴皮肤传感器_用于长期的健康监测
如何让现代城市如何更智慧
Abb机器人示教器可编程按钮的配置方法
探究人工智能在保险公司的应用
现代PCB设计人员的电子设计自动化
PCB焊接中冷焊与伪焊接的区别
3mm x 3mm线性电流传感器IC的的感应电阻运算放大器解决方案