MSP430Flash读写操作总结.docx

上传人:b****6 文档编号:5740849 上传时间:2022-12-31 格式:DOCX 页数:12 大小:257.52KB
下载 相关 举报
MSP430Flash读写操作总结.docx_第1页
第1页 / 共12页
MSP430Flash读写操作总结.docx_第2页
第2页 / 共12页
MSP430Flash读写操作总结.docx_第3页
第3页 / 共12页
MSP430Flash读写操作总结.docx_第4页
第4页 / 共12页
MSP430Flash读写操作总结.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

MSP430Flash读写操作总结.docx

《MSP430Flash读写操作总结.docx》由会员分享,可在线阅读,更多相关《MSP430Flash读写操作总结.docx(12页珍藏版)》请在冰豆网上搜索。

MSP430Flash读写操作总结.docx

MSP430Flash读写操作总结

MSP430X14XFlash读写操作总结

开发平台:

IAREmbeddedWorkbench、MSP430F149开发板

作者:

谭贝贝

Flash简介

Flash分为主存储区和信息存储区,主存储区有8个512byte的片段,信息存储区有两个128byte的片段。

Flash默认为读取模式。

在对Flash进行编程或者擦除时不允许读写,如果需要CPU在这期间进行操作,可以把代码段放在RAM中进行。

Flash操作注意事项

在读写的过程中电压不能小于2.7V否则擦除和读写的结果将不可预测。

Flash的可操作时钟频率为~257KHZ---~476KHZ。

如果频率不符合要求,则结果不可预测。

在擦除先需要关闭中断和看门狗,在擦除的过程中如果产生了中断,则会在重新使能中断后产生一个中断请求。

Flash只能从1写为0,不能从从0写为1,所以需要擦除。

可以被擦除的最小模块是片段,tAllErase=tMassErase=5297/fFTG,tSegErase=4819/fFTG。

FlashERASE

MSP430X14X的擦除模式可以从Flash或者RAM中进行。

从Flash中擦除

从Flash中擦除的过程中所有的定时都会被Flash控制,CPU被挂起。

擦除完成后需要一个假写入CPU才能复位。

从Flash擦除时有可能把后面CPU需要执行的代码擦除。

如果发生这样的情况,在擦除后CPU的执行状况将不可预测。

Flash中擦除流程图

从RAM中擦除

从RAM中擦除时CPU不会被挂起,可以继续执行代码。

必须检测BUSY位以判断擦除是否结束,如果在擦除的过程中(即BUSY=1时)访问Flash,这是一个违规的访问,ACCVIFG会置位,而擦除的结果也将不可预测。

RAM中擦除流程图

FlashWrite

MSP430X14X有两种写入模式,分为段写入(byte/wordwrite),和块写入(BlockWrite),块写入要快得多,但是操作麻烦,在擦除的过程中不能有一个Flashword(low+highbyte),则会发生损坏。

CPU不能在BUSY=1时访问Flash,否则ACCFIG将置位写入将不可预测。

1.Byte/Wordwrite

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.

流程图

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

Flash的寄存器

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

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

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

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

MERASE和ERASE,擦除模式选择位

FCTL2时钟选择寄存器

FWKEYx密码位

FSSELx时钟选择位

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

两个例子

#include

#include"BoardConfig.h"

voidWrite_A(ucharvalue);

voidCopy_A2B(void);

 

voidmain(void)

{

//Stopwatchdogtimertopreventtimeoutreset

WDTCTL=WDTPW+WDTHOLD;

BoardConfig(0xb8);

FCTL2=FWKEY+FSSEL0+FN0;//Selectsource

ucharvalue=0;

for(;;)

{

Write_A(value++);//WritedatatosegmentA

Copy_A2B();//CopydatafromsegmentAtosegmentB

_NOP();

}

}

voidWrite_A(ucharvalue)

{

uchari;

uchar*Flash_ptr;

Flash_ptr=(uchar*)0x1080;

FCTL1=FWKEY+ERASE;//SetERASEmode

FCTL3=FWKEY;//ClearLOCK

*Flash_ptr=0;//Dummywrite

FCTL1=FWKEY+WRT;

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

{

*Flash_ptr++=value;//Writevalue

}

FCTL1=FWKEY;//ClearWRT

FCTL3=FWKEY+LOCK;//SetLOCK

}

//CopydatafromBtoA

voidCopy_A2B(void)

{

uchar*Flash_ptrA;

uchar*Flash_ptrB;

uinti;

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;

}

 

再来个块写入的(TI例程)

//****************************************************************************

//MSP430F14xDemo-FlashIn-SystemProgramming,BlockWrite

//

//Description:

ThisprogramfirstcopiestheFlashWriteroutinetoRAM,then

//erasesflashsegA,thenitincrementsallvaluesinsegAusingthe64

//byteblockwritemode.

//

//AssumeddefaultMCLK=DCO~800kHz.

//MinimumRAMrequirement=512bytes

//

//**SetBreakpointonNOPintheMainlooptoavoidStressingFlash**

//

//MSP430F149

//-----------------

///|\|XIN|-

//|||

//--|RSTXOUT|-

//||

//

//H.Grewal/L.Westlund

//TexasInstrumentsInc.

//Jun2006

//BuiltwithIAREmbeddedWorkbenchVersion:

3.30A

//******************************************************************************

#include

//Globalvariables

charvalue=0;//8-bitvaluetowritetosegmentA

char*Flash_ptr;//Flashpointer

char*RAM_ptr;//RAMpointer

char*END_ptr;//EndofFlashWriteroutine

//Functionprototypes

voidFlashWrite();

voidCopyRoutine();

voidEnd_of_FlashWrite();

voidmain(void)

{

WDTCTL=WDTPW+WDTHOLD;//Stopwatchdogtimer

_DINT();//DiableInterrupts

CopyRoutine();//CopyFlashWriteroutinetoRAM

_EINT();//EnableInterrupts

while

(1)//Repeatforever

{

Flash_ptr=(char*)0x1000;//InitializeFlashpointer

FCTL2=FWKEY+FSSEL1+FN0;//MCLK/2forFlashTimingGenerator

FCTL1=FWKEY+ERASE;//SetErasebit

FCTL3=FWKEY;//ClearLockbit

*Flash_ptr=0;//DummywritetoeraseFlashsegment

while(!

(FCTL3&WAIT));//WAITuntilFlashisready

asm("CALL#300h");//ExecuteFlashWritefromRAM

//InlineAssembly

value++;//Incrementvalue

_NOP();//SETBREAKPOINTHERE

}

}

voidCopyRoutine()

{

Flash_ptr=(char*)FlashWrite;//SetpointertoFlashWriteroutine

RAM_ptr=(char*)0x0300;//SetpointertoRAM

END_ptr=(char*)End_of_FlashWrite;//SetpointertoEnd_of_FlashWrite

while(END_ptr!

=Flash_ptr)//CheckforendofFlashWrite

{

*RAM_ptr=*Flash_ptr;//CopywordtoRAM

Flash_ptr++;//IncrementFlashpointer

RAM_ptr++;//IncrementRAMpointer

}

}

voidFlashWrite()

{

volatileinti;//Useaswritecounter

Flash_ptr=(char*)0x1000;//InitializeFlashpointer

while(FCTL3&BUSY);//CheckFlashBUSYbit

FCTL1=FWKEY+BLKWRT+WRT;//Enableblock-writeoperation

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

{

*Flash_ptr=value;//Writevaluetoflash

Flash_ptr++;//Double-incrementFlashpointer

while(!

(FCTL3&WAIT));//WAITuntilFlashisready

}

FCTL1=FWKEY;//ClearBLKWRT&WRTbits

while(FCTL3&BUSY);//CheckFlashBUSYbit

FCTL3=FWKEY+LOCK;//ResetLOCKbit

return;//Exitsroutine

}

voidEnd_of_FlashWrite(){}//MarksendofFlashWrite

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1