📄 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 + -