//将数据字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);
}
// 写入地址 *pc_byte 写入数据:*pc_byte
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的程序代码如下:
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的擦除、写入等操作。这是我最近3天所作的一些努力,整理一下与大家分享。
本文参考了TI的《MSP430x1xx Family Users Guide》及TI网上提供的关于Flash操作的实例代码,并在网络上收集了一些资料,在此不一一列出,不过本文应该算本人原创,转载请注明。谢谢
MSP430X14X Flash 读写操作总结
开发平台:IAR Embedded Workbench、MSP430F149开发板
作者:谭贝贝
Flash操作注意事项
在读写的过程中电压不能小于2.7V否则擦除和读写的结果将不可预测。Flash的可操作时钟频率为~257KHZ---~476KHZ。如果频率不符合要求,则结果不可预测。
在擦除先需要关闭中断和看门狗,在擦除的过程中如果产生了中断,则会在重新使能中断后产生一个中断请求。Flash只能从1写为0,不能从从0写为1,所以需要擦除。
可以被擦除的最小模块是片段,tAll Erase = tMass Erase = 5297/fFTG, tSeg Erase = 4819/fFTG。
Flash ERASE
MSP430X14X的擦除模式可以从Flash或者RAM中进行。
从Flash中擦除
从Flash中擦除的过程中所有的定时都会被Flash控制,CPU被挂起。擦除完成后需要一个假写入CPU才能复位。从Flash擦除时有可能把后面CPU需要执行的代码擦除。如果发生这样的情况,在擦除后CPU的执行状况将不可预测。
Flash中擦除流程图
图片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html
从RAM中擦除
从RAM中擦除时CPU不会被挂起,可以继续执行代码。必须检测BUSY位以判断擦除是否结束,如果在擦除的过程中(即BUSY=1时)访问Flash,这是一个违规的访问,ACCVIFG会置位,而擦除的结果也将不可预测。
RAM中擦除流程图
图片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html
Flash Write
MSP430X14X有两种写入模式,分为段写入(byte/word write),和块写入(Block Write),块写入要快得多,但是操作麻烦,在擦除的过程中不能有一个Flash word(low + high byte),则会发生损坏。CPU不能在BUSY=1时访问Flash,否则ACCFIG将置位写入将不可预测。
1.Byte/Word write
Byte/Word 写入可以从Flash或者RAM初始化,当从Flash中初始化时,所有的定时都会被Flash控制,CPU被挂起。写完后CPU将继续执行后面的代码。
当
|