?? quickformatflash.c
字號:
//*******************************************************
//以下是快速格式化的程序
//*******************************************************
#include "msp430x14x.h"
#include "format.h"
#include "flash.h"
#include "MspFlashWriteRead.h"
void QuickFormatFlash(void)
{
unsigned short InvalidBlockTable[InvalidBlockMaxValue]={0xffff};//定義存放無效塊信息表的數組
unsigned short PtrRowAddress; //定義在格式化Flash時的地址指針
unsigned short PtrTable; //定義填寫無效信息表數組的地址指針
unsigned short InvalidBlockNumber; //定義無效塊的數量
unsigned short PtrBlock; //指示需要寫入無效塊屏蔽表的實際的塊指針。
unsigned short PtrBlockInMaskTable;//指示實際寫入無效塊屏蔽表內的塊指針。
unsigned short PtrBlockTemp=0; //
unsigned short PtrAddCount=0; //指示因為存在無效塊而增加的無效塊屏蔽表內的數值
unsigned short LoopForSearchInValid;//為了尋找無效塊所設立的for循環變量
unsigned short *piFlash; //用來對Msp進行字寫入的指針
//*******************************************************
//先復位Flash芯片
//*******************************************************
WriteReadResetCommandToFlash();
//*******************************************************
//開始格式化Flash芯片
//*******************************************************
for(PtrRowAddress=32,PtrTable=1,InvalidBlockNumber=0;PtrRowAddress<FlashSizeAddress16M;PtrRowAddress=PtrRowAddress+32)
{ //因為塊的地址是從A14開始的,A9--A13=0
WriteBlockEraseCommandToFlash(PtrRowAddress);//根據塊指針地址來擦除響應的Flash塊
while((InputStatusFromFlash&FlashRB)==0);//查詢擦除是否結束
ReadStatusFromFlash();
if((InputDataFromFlash&FlashProgramEraseError)!=FlashProgramEraseError)//
{
if(((Write00ToFirstPage(PtrRowAddress))&FlashProgramEraseError)!=FlashProgramEraseError)
{
if(((Read00PageFromFlash(PtrRowAddress))&FlashProgramEraseError)==FlashProgramEraseError)
{
InvalidBlockTable[PtrTable]=PtrRowAddress;//如果擦除出錯,把當前的無效塊地址存入信息表內
PtrTable=PtrTable+1;//信息表數組的指針加1
InvalidBlockNumber=InvalidBlockNumber+1; //無效塊數量加1
}
}
else
{
InvalidBlockTable[PtrTable]=PtrRowAddress;//如果擦除出錯,把當前的無效塊地址存入信息表內
PtrTable=PtrTable+1;//信息表數組的指針加1
InvalidBlockNumber=InvalidBlockNumber+1; //無效塊數量加1
}
}
else
{
InvalidBlockTable[PtrTable]=PtrRowAddress;//如果擦除出錯,把當前的無效塊地址存入信息表內
PtrTable=PtrTable+1;//信息表數組的指針加1
InvalidBlockNumber=InvalidBlockNumber+1; //無效塊數量加1
}
}
InvalidBlockTable[0]=InvalidBlockNumber;//在信息表的第一部分加入無效塊的總數
_NOP();
//*******************************************************
//根據無效塊信息表建立Flash信息表,以便屏蔽掉無效塊
//*******************************************************
for(PtrRowAddress=32;PtrRowAddress<FlashSizeAddress16M;PtrRowAddress=PtrRowAddress+32)
{
WriteBlockEraseCommandToFlash(PtrRowAddress);//建立無效塊屏蔽信息表之前先擦除第0塊
while((InputStatusFromFlash&FlashRB)==0);
ReadStatusFromFlash();
}
WriteBlockEraseCommandToFlash(0); //擦除第0塊,以便存放Flash的無效塊屏蔽表
while((InputStatusFromFlash&FlashRB)==0);
ReadStatusFromFlash();
for(PtrBlock=0;PtrBlock<=FlashSizeAddress16M;PtrBlock++)
{
if((PtrBlock&0x00FF)==0)
{
PtrRowAddress=(PtrBlock>>8);
WriteSequentialDataInputCommandToFlash();
WriteWriteModeAddressToFlash(PtrRowAddress,0);
PrepareForWriteDataToFlashIncludeCArea();
}
for(LoopForSearchInValid=1;LoopForSearchInValid<(InvalidBlockTable[0]+1);LoopForSearchInValid++)
{
if(PtrBlockTemp==InvalidBlockTable[LoopForSearchInValid])
{
PtrBlockTemp=PtrBlockTemp+1;
}
}
PtrBlockInMaskTable=PtrBlockTemp;
if(PtrBlockInMaskTable>FlashSizeAddress16M)
{
PtrBlockInMaskTable=0xFFFF;
}
PtrBlockInMaskTable=PtrBlockInMaskTable<<5; //為了保證存放在第0塊的塊地址直接可以使用,不需要再移位
OutputToFlash=PtrBlockInMaskTable;
FlashControlPort&=~FlashWE;
FlashControlPort|=FlashWE;
OutputToFlash=(PtrBlockInMaskTable>>8);
FlashControlPort&=~FlashWE;
FlashControlPort|=FlashWE;
if((PtrBlock&0x00FF)==0x00FF)
{
WritePageProgramCommandToFlash();
while((InputStatusFromFlash&FlashRB)==0);
ReadStatusFromFlash();
}
PtrBlockTemp=PtrBlockTemp+1;
}
_NOP();
//初始化文件目錄表和碎片數據表,因為格式化后,文件數目與碎片數目全為0
FCTL2=FWKEY+FSSEL0+FN0;
piFlash=(unsigned short *)MspInformationA;
FlashClrSegment(piFlash);
for(LoopForSearchInValid=0;LoopForSearchInValid<64;LoopForSearchInValid++)
{
FlashWriteWord(piFlash+LoopForSearchInValid,0x00);
}
//初始化文件分配表,初始化時默認存在一個碎片,首地址是0x0001,末地址是0x03FF。
piFlash=(unsigned short *)MspInformationB;
FlashClrSegment(piFlash);
FlashWriteWord(piFlash,0x0001);
FlashWriteWord(piFlash+1,0x0001);
FlashWriteWord(piFlash+2,0x03FF);
for(LoopForSearchInValid=3;LoopForSearchInValid<64;LoopForSearchInValid++)
{
FlashWriteWord(piFlash+LoopForSearchInValid,0x00);
}
_NOP();
}
unsigned short Write00ToFirstPage(unsigned short PtrRowAddress)
{
unsigned short loop_i;
WriteSequentialDataInputCommandToFlash();
WriteWriteModeAddressToFlash(PtrRowAddress,0);
PrepareForWriteDataToFlashIncludeCArea();
for(loop_i=0;loop_i<528;loop_i++)
{
OutputToFlash=0x00;
FlashControlPort&=~FlashWE;
FlashControlPort|=FlashWE;
}
WritePageProgramCommandToFlash();
while((InputStatusFromFlash&FlashRB)==0);
ReadStatusFromFlash();
return InputDataFromFlash;
}
unsigned short Read00PageFromFlash(unsigned short PtrRowAddress)
{
unsigned short loop_i;
unsigned short ReadValue[2];
WriteRead1ACommandToFlash();
WriteReadModeAddressToFlash(PtrRowAddress,0);
while((InputStatusFromFlash&FlashRB)==0);
DataPortDirection&=~0xFF;
PrepareForReadDataFromFlash();
for(loop_i=0;loop_i<2;loop_i++)
{
FlashControlPort&=~FlashRE;
ReadValue[loop_i]=InputDataFromFlash;
FlashControlPort|=FlashRE;
}
if(((ReadValue[0])==0)&&((ReadValue[1])==0))
{
return 0;
}
else
{
return FlashProgramEraseError;
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -