|
这三个是读写擦除的程序。从文档中下载的。
void FLASH_ByteWrite(FLADDR addr,char byte,bit SFLE)
{
char SFRPAGE_SAVE = SFRPAGE;
bit EA_SAVE = EA;
char PSBANK_SAVE=PSBANK;
char xdata *data pwrite;
EA = 0;
SFRPAGE = LEGACY_PAGE;
if( addr < 0x8000) //bank 0 64KB linear address
{
pwrite = (char xdata *)addr;
PSBANK &= ~0x30; // COBANK = 0x0
PSBANK |= 0x00;
} else if(addr < 0x10000) //bank2 COBANK = 0x1
{
addr |= 0x8000;
pwrite = (char xdata *)addr;
PSBANK &= ~0x30;//0011 0000
PSBANK |= 0X10; //0010 0000
}else if(addr < 0x18000) //bank 2
{
addr |= 0x8000;
pwrite = (char xdata *)addr;
PSBANK &= ~0x30;//0011 0000
PSBANK |= 0x20; //0010 0000 COBANK = 0x2
}else { //bank 3
pwrite = (char xdata *)addr;
PSBANK &= ~0x30;//0011 0000
PSBANK |= 0X30; //0010 0000 COBANK = 0x3
}
FLSCL |= 0x01; // 鍏佽鐢ㄦ埛鍐欏叆/鎿﹂櫎flash 0:flwe 鍏佽鍐?鎿﹂櫎
//浣跨敤MOVX鍛戒护鎸囦护鍐檉lash
PSCTL |= 0x01; //PSCTL 0:PSWE绋嬪簭瀛樺偍鍣ㄥ啓鍏佽= 1鎸囧悜鍐呴儴flash 1绋嬪簭瀛樺偍鎿﹂櫎鍏佽锛? 2 鍐檉lash璁剧疆浣?
if(SFLE)
{
PSCTL |=0x04; // 鍐欎复鏃跺尯
}
RSTSRC = 0x02;//RSTSRC 閫夋嫨VDD鐩戣鍣ㄤ綅澶嶄綅婧?
*pwrite = byte; //浣跨敤MOVX鎸囦护寰€鏈熸湜鐨勫湴鍧€鍐欏叆涓€涓暟鎹瓧鑺?
if(SFLE)
{
PSCTL &= ~0x04; //// 鍐欎复鏃跺尯
}
PSCTL &= ~0x01; // MOVX 0锛歅SWE 浣垮緱MOVX鎸囧悜xram鏁版嵁绌洪棿
FLSCL &= ~0x01; //FLASH FLWE 绂佹flash鍐欐摝闄?
PSBANK = PSBANK_SAVE;
SFRPAGE = SFRPAGE_SAVE;
EA=EA_SAVE ; //RESTORE
}
unsigned char FLASH_ByteRead(FLADDR addr,bit SFLE)
{
char SFRPAGE_SAVE = SFRPAGE;
bit EA_SAVE = EA;
char PSBANK_SAVE=PSBANK;
char code *data pread; //flash read pointer
unsigned char byte;
EA=0;
SFRPAGE = LEGACY_PAGE;
if (addr < 0x8000) { // 64K linear address
pread = (char code *) addr;
PSBANK &= ~0x30; // COBANK = 0x0
PSBANK |= 0x00;
} else if (addr < 0x10000) { // BANK 1
addr |= 0x8000;
pread = (char code *) addr;
PSBANK &= ~0x30; // COBANK = 0x1
PSBANK |= 0x10;
} else if (addr < 0x18000) { // BANK 2
addr |= 0x8000;
pread = (char code *) addr;
PSBANK &= ~0x30; // COBANK = 0x2
PSBANK |= 0x20;
} else { // BANK 3
pread = (char code *) addr;
PSBANK &= ~0x30; // COBANK = 0x3
PSBANK |= 0x30;
}
if(SFLE)
{
PSCTL |= 0x04;
}
byte = *pread;
if(SFLE)
{
PSCTL &= ~0x04;
}
PSBANK = PSBANK_SAVE;
SFRPAGE = SFRPAGE_SAVE;
EA=EA_SAVE ; //RESTORE
return byte;
}
void Page_Erase(FLADDR addr,bit SFLE)
{
char SFRPAGE_SAVE = SFRPAGE;
bit EA_SAVE = EA;
char PSBANK_SAVE=PSBANK;
char xdata* data pwrite; //flash write pointer
EA = 0;
SFRPAGE = LEGACY_PAGE;
if (addr < 0x8000) { // 64K linear address
pwrite = (char xdata *) addr;
PSBANK &= ~0x30; // COBANK = 0x0
PSBANK |= 0x00;
} else if (addr < 0x10000) { // BANK 2
addr |= 0x8000;
pwrite = (char xdata *) addr;
PSBANK &= ~0x30; // COBANK = 0x1
PSBANK |= 0x10;
} else if (addr < 0x18000) { // BANK 2
addr |= 0x8000;
pwrite = (char xdata *) addr;
PSBANK &= ~0x30; // COBANK = 0x2
PSBANK |= 0x20;
} else { // BANK 3
pwrite = (char xdata *) addr;
PSBANK &= ~0x30; // COBANK = 0x3
PSBANK |= 0x30;
}
FLSCL |= 0x01; // 缃綅FLWE 鍏佽杞欢鍐欐摝闄lash 0
PSCTL |= 0x03; // PSEE 鍏佽鎿﹂櫎鎵囧尯0 1
if(SFLE){
PSCTL |= 0x04;
}
RSTSRC = 0x02;//0000 0010
*pwrite=0;
if(SFLE){
PSCTL &= ~0x04;
}
PSCTL &= ~0X03; // PSEE PSWE
FLSCL &= ~0x01; // FLWE 娓呴櫎
PSBANK = PSBANK_SAVE;
SFRPAGE = SFRPAGE_SAVE;
EA=EA_SAVE ; //RESTORE
}
FLADDR start_address = 0x08000;
void main()
{
ulong Rd;
uchar temp_byte = 0x00;
bit error_flag = 0;
WDTCN = 0xde; // Disable watchdog timer
WDTCN = 0xad;
EA=0;
SYSCLK_Init ();
PORT_Init();
UART0_Init();
ms=40000;
Page_Erase (start_address,0); //1
FLASH_ByteWrite (start_address, 0xA5,0); //2
temp_byte = FLASH_ByteRead (start_address,0);//3
if (temp_byte != 0xA5)//4
{
error_flag = 1;
}
}
//主程序中 1.2.3.4用来测试 结果temp_byte 读出来是0XFF,说明没有写入成功。请教下是什么原因呢 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|