新闻中心

EEPW首页>嵌入式系统>设计应用> 写MSP430片内flash

写MSP430片内flash

作者: 时间:2016-11-25 来源:网络 收藏

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);

}
// 写入地址 *pc_byte写入数据:*pc_byte

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的程序代码如下:

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将继续执行后面的代码。

当从RAM中初始化时,BUSY必须在CPU访问Flash前置0.否则ACCFIG将被置位,写入的结果将不可预测。

在Byte/Word 写模式下写入总时间不能超过4ms,如果超过了,当再想这块任何地址写入数据时必须先擦除。

Byte/Word 写入流程图

从RAM中执行Byte/Word 写入

块写入

块写入时没一小块不能超过t_cpt=4ms,块写入只能从RAM中进行,在块写入的过程中WAIT位要置0,当想Flash中写入数据时,需要先检查WAIT位是否为1.当前块写完后BLKWRT要清0.

流程图

图片地址:http://wenku.baidu.com/view/b82c0b1a52d380eb62946d4b.html

在擦除或者写入的过程中访问Flash,见下表

Flash的寄存器

FCTL1,选择擦除和写入模式的寄存器

FRKEY/FWKEY 高八位为密码读的密码为96h,写的密码为A5h。

BLKWRT块写入模式选择位,可以自动被EMEX置位

WRT字写入模式选择位,可任意自动被EMEX置位

MERASE和ERASE,擦除模式选择位

FCTL2时钟选择寄存器

FWKEYx密码位

FSSELx时钟选择位

FNx分频比 分频值等于FN+1

两个例子

#include

#include "BoardConfig.h"

void Write_A(uchar value);

void Copy_A2B(void);

void main( void )

{

// Stop watchdog timer to prevent time out reset

WDTCTL = WDTPW + WDTHOLD;

BoardConfig(0xb8);

FCTL2 = FWKEY + FSSEL0 + FN0; //Select source

uchar value = 0;

for(;;)

{

Write_A(value++);//Write data to segment A

Copy_A2B();//Copy data from segment A to segment B

_NOP();

}

}

void Write_A(uchar value)

{

uchar i;

uchar *Flash_ptr;

Flash_ptr = (uchar *)0x1080;

FCTL1 = FWKEY + ERASE;//Set ERASE mode

FCTL3 = FWKEY;//Clear LOCK

*Flash_ptr = 0;//Dummy write

FCTL1 = FWKEY + WRT;

for(i = 0;i < 128;i++)

{

*Flash_ptr++ = value;//Write value

}

FCTL1 = FWKEY;//Clear WRT

FCTL3 = FWKEY + LOCK;//Set LOCK

}

//Copy data from B to A

void Copy_A2B(void)

{

uchar *Flash_ptrA;

uchar *Flash_ptrB;

uint i;

Flash_ptrA = (uchar *)0X1080;

Flash_ptrB = (uchar *)0x1000;

FCTL1 = FWKEY + ERASE;

FCTL3 = FWKEY;

*Flash_ptrB = 0;

FCTL1 = FWKEY + WRT;

for(i = 0;i < 128;i++)

{

*Flash_ptrB++ = *Flash_ptrA++;

}

FCTL1 = FWKEY;

FCTL3 = FWKEY + LOCK;

}



关键词:MSP430片内flas

评论


相关推荐

技术专区

关闭