📄 flash.c
字号:
#include "flash.h"
#include "Delay.h"
#include "f2407_c.h"
#include "global.h"
/*************************************************/
/*FLASH CommandReg's Addr */
#define BASEADDR_FLASH (unsigned int *)0x8000
#define COMMANDREG1_FLASH (unsigned int *)0x8555
#define COMMANDREG2_FLASH (unsigned int *)0x8AAA
#define COMREG1ADDR_FLASH 0xFF2F
#define COMREG2ADDR_FLASH 0xFF17
/*************************************************/
const char WPAGE[32]={
0xFF07,0xFF0F,0xFF17,0xFF1F,0xFF27,0xFF2F,0xFF37,0xFF3F,
0xFF47,0xFF4F,0xFF57,0xFF5F,0xFF67,0xFF6F,0xFF77,0xFF7F,
0xFF87,0xFF8F,0xFF97,0xFF9F,0xFFA7,0xFFAF,0xFFB7,0xFFBF,
0xFFC7,0xFFCF,0xFFD7,0xFFDF,0xFFE7,0xFFEF,0xFFF7,0xFFFF
};
/*****************************************************/
void EraseWholeFlash()
{
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0xAAAA;
*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
*COMMANDREG2_FLASH=0x5555;
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0x8080;
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0xAAAA;
*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
*COMMANDREG2_FLASH=0x5555;
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0x1010;
Delay50mS();
}
void EraseSector(int Sector)
{
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0xAAAA;
*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
*COMMANDREG2_FLASH=0x5555;
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0x8080;
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0xAAAA;
*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
*COMMANDREG2_FLASH=0x5555;
*PEDATDIR=WPAGE[Sector];/*Set ComReg2's Address*/
*COMMANDREG1_FLASH=0x3030;
Delay25mS();
}
void ProgramByte(int Sector,int Offset,int data)
{
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0xAAAA;
*PEDATDIR=COMREG2ADDR_FLASH;/*Set ComReg2's Address*/
*COMMANDREG2_FLASH=0x5555;
*PEDATDIR=COMREG1ADDR_FLASH;/*Set ComReg1's Address*/
*COMMANDREG1_FLASH=0xA0A0;
*PEDATDIR=WPAGE[Sector];/*Send Data to Flash*/
*(BASEADDR_FLASH+Offset)=data;
Delay8uS();
}
void ReadDataFromFlash(int Sector,int StartAddr,char *data,int datalength)
{
int i;
*PEDATDIR=WPAGE[Sector];/*Send Data to Flash*/
for(i=0;i<datalength;++i)
{
data[i]=(char)*(BASEADDR_FLASH+StartAddr+i);
}
}
void WriteDataInFlash(int Sector,int StartAddr,char *data,int datalength)
{
int i;
for(i=0;i<datalength;++i)
{
ProgramByte(Sector,StartAddr+i,data[i]);
}
}
void WriteFileInFlash(int newfile,char *data,int datalength)
{
int i=datalength/2+datalength%2;
if(newfile)
{
curFlashPage+=1;
curFlashOffset=0;
WriteDataInFlash(curFlashPage,curFlashOffset,data,i);
curFlashOffset+=i;
}
else
{
if(curFlashOffset+i>4095)
{
WriteDataInFlash(curFlashPage,curFlashOffset,data,4096-curFlashOffset);
curFlashPage+=1;
WriteDataInFlash(curFlashPage,0,data+4096-curFlashOffset,i-4096+curFlashOffset);
curFlashOffset=i-4096+curFlashOffset;
}
else
{
WriteDataInFlash(curFlashPage,curFlashOffset,data,i);
curFlashOffset+=i;
}
}
}
void GetSTFromFlash(int design_number,int first_st,char *data,int st_numbers)
{
int i,sector,offset;
unsigned int temp;
int st[2];
long filesize;
sector=1;
offset=0;
for(i=0;i<design_number;++i)
{
ReadDataFromFlash(sector,offset,data,16);
temp=(data[15]<<8)+(data[15]>>8);
filesize=temp<<16;
temp=(data[14]<<8)+(data[14]>>8);
filesize+=temp;
sector+=(filesize+16)/8192+1;
}
for(i=0;i<st_numbers;++i)
{
sector+=((long)(first_st*3)+512+32)/8192;
offset=(((long)(first_st*3)+512+32)%8192)/2;
ReadDataFromFlash(sector,offset,st,2);
if(first_st%2)
{
data[i*2]=((st[1]&0x00c0)>>4)+(st[1]&0x0003);
data[i*2+1]=((st[0]&0x0003)+1)%3+((((st[1]&0x0300)>>8)+1)%3)*3+
((((st[0]&0x000c)>>2)+1)%3)*9+((((st[1]&0x0c00)>>10)+1)%3)*27+
((((st[1]&0x000c)>>2)+1)%3)*81-121;
data[i*2+1]<<=8;
data[i*2+1]+=((-1*((((st[0]&0x0030)>>4)+1)%3)+2)*9+(-1*((((st[1]&0xc000)>>14)+1)%3)+2)*3+
(-1*((((st[0]&0x00c0)>>6)+1)%3)+2)+(-1*((((st[1]&0x3000)>>12)+1)%3)+2)*27+
((((st[1]&0x0030)>>4)+1)%3)*81-121)&0x00ff;
}
else
{
data[i*2]=((st[1]&0xc000)>>12)+((st[1]&0x0300)>>8);
data[i*2+1]=(((st[0]&0x0300)>>8)+1)%3+(((st[0]&0x0003)+1)%3)*3+
((((st[0]&0x0c00)>>10)+1)%3)*9+((((st[0]&0x000c)>>2)+1)%3)*27+
((((st[1]&0x0c00)>>10)+1)%3)*81-121;
data[i*2+1]<<=8;
data[i*2+1]+=((-1*((((st[0]&0x3000)>>12)+1)%3)+2)*9+(-1*((((st[0]&0x00c0)>>6)+1)%3)+2)*27+
(-1*((((st[0]&0xc000)>>14)+1)%3)+2)*9+(-1*((((st[0]&0x0030)>>4)+1)%3)+2)*3+
((((st[1]&0x3000)>>12)+1)%3)*81-121)&0x00ff;
}
sector-=((long)(first_st*3)+512+32)/8192;
first_st++;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -