tpublic.c
来自「电力变电站RTU监控软件(80C196NT单片机) 遥控」· C语言 代码 · 共 2,639 行 · 第 1/5 页
C
2,639 行
if (poll == NVM_DATA_POLL)done = TRUE; // compare poll bit bulk erase OK,
else if (error == NVM_ERROR) // check for timeout error
err = TRUE; // indicate timeout error occurred
rst_wdog();
} while((done == FALSE) && (err == FALSE));
if (err == TRUE) // make sure timeout error and data poll didn't
{
asm ld value, [portid];
poll=value; // Read flash status again
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
if (poll == NVM_DATA_POLL) done = TRUE; // compare poll bit the flash erased OK at the same
portid=FLASH_COMMON_BOOT_X554;
value=0xf0f0;
asm st value, [portid]; // reset the flash array (short reset instruction)
}
yktest[30]++;
return(done); // a successful flash erase returns 1, timeout error returns 0
}
unsigned char flash_boot_erase_bulk(unsigned int flash_bulk_erase_address)
{
unsigned char done;
unsigned int poll;
unsigned int error;
unsigned char err;
register unsigned int portid;
register unsigned int value;
done = FALSE;
err = FALSE;
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
value=0xAAAA;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
value=0x5555;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_XAAA; // write 0x80 command to erase entire chip
value=0x8080;
asm st value, [portid];
value=0xAAAA;
asm st value, [portid]; // continue unlock sequence
portid=FLASH_COMMON_BOOT_X554; // continue unlock sequence
value=0x5555;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
value=0x1010; // write 0x10 command to complete erase command
asm st value, [portid];
portid=flash_bulk_erase_address;
do // now use data polling method to verify successful erase
{
asm ld value, [portid];
poll=value; // read flash status from any address
error = poll & NVM_ERROR; // save timeout error bit
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
if (poll == NVM_DATA_POLL)done = TRUE; // compare poll bit bulk erase OK,
else if (error == NVM_ERROR) // check for timeout error
err = TRUE; // indicate timeout error occurred
rst_wdog();
} while((done == FALSE) && (err == FALSE));
if (err == TRUE) // make sure timeout error and data poll didn't
{
asm ld value, [portid];
poll=value; // Read flash status again
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
if (poll == NVM_DATA_POLL) done = TRUE; // compare poll bit the flash erased OK at the same
portid=FLASH_COMMON_BOOT_X554;
value=0xf0f0;
asm st value, [portid]; // reset the flash array (short reset instruction)
}
return(done); // a successful flash erase returns 1, timeout error returns 0
}
void flash_boot_reset() // reset flash, read array mode
{
register unsigned int portid;
register unsigned int value;
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
value=0xAAAA;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
value=0x5555;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_XAAA; // write 0xF0 command to reset
value=0xF0F0;
asm st value, [portid]; // Flash memory to Read Array Mode
}
void flash_boot_set_unlock_bybass()
{
register unsigned int portid;
register unsigned int value;
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0xAA to addess 0xXAAA
value=0xAAAA;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_X554; // unlock main flash, write 0x55 to addess 0xX554
value=0x5555;
asm st value, [portid];
portid=FLASH_COMMON_BOOT_XAAA; // write 0x20 command to invoke unlock bypass feature
value=0x2020;
asm st value, [portid];
}
void flash_boot_clear_unlock_bybass()
{
register unsigned int portid;
register unsigned int value;
portid=FLASH_COMMON_BOOT_XAAA; // unlock main flash, write 0x90 to addess 0xXAAA
value=0x9090;
asm st value, [portid];
value=0x0000; // write 0x00 command to clear unlock bypass feature
asm st value, [portid];
}
unsigned char flash_boot_bypass_write_with_poll(unsigned int addr,unsigned int data)
{
unsigned char done;
unsigned int error;
unsigned char err;
unsigned int poll;
register unsigned int portid;
register unsigned int value;
done = FALSE;
err = FALSE;
portid=FLASH_COMMON_BOOT_XAAA; // write 0xA0 command to program
value=0xA0A0;
asm st value, [portid];
portid=addr;
value=data;
asm st value, [portid]; // write word to flash
data = data & NVM_DATA_POLL; // get bit DQ7 of original data
do // now use data polling method to verify successful write
{
asm ld value, [portid];
poll=value; // Read the location that was just programmed
error = poll & NVM_ERROR; // save timeout error bit
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
if (data == poll) done = TRUE; // compare poll bit
else if (error == NVM_ERROR ) // check for timeout error
err = TRUE; // indicate timeout error occurred
rst_wdog();
} while((done == FALSE) && (err == FALSE));
if (err == TRUE) // make sure timeout error and data poll didn't
{
asm ld value, [portid];
poll=value; // Read the location that was just programmed
poll = poll & NVM_DATA_POLL; // get poll bit of the word read from flash
if (data == poll) done = TRUE; // compare poll bit
portid=FLASH_COMMON_BOOT_XAAA; // write 0xF0 command to reset
value=0xF0F0;
asm st value, [portid]; // reset the flash array (short reset instruction)
}
return(done); // a successful flash write returns 1, timeout error returns 0
}
unsigned char flash_boot_read_sector_protect()
{
register unsigned int portid;
register unsigned char value;
portid=PSD_ALTPROTECT;
asm ldb value, [portid];
return value; //This is a register inside PSD csiop space
}
/*
void flash_boot_write(unsigned int addr,unsigned int data)
{
register unsigned int portid;
register unsigned int value;
unsigned int adrbak;
unsigned int sum;
unsigned int ui;
int i;
flash_boot_reset();// reset flash, read array mode
portid=addr;
portid=portid-PSD_FLASH_BASE;
value=portid/8192;
portid=PSD_FLASH_BASE+value*8192;
adrbak=portid;
for(i=0;i<4096;i++)
{
asm ld value,[portid];
pVar->flash_dat[i]=value;
portid=portid+2;
rst_wdog();
}
portid=addr;
portid=portid-PSD_FLASH_BASE;
i=(portid % 8192)/2;
pVar->flash_dat[i]=data;
sum=0;
for(ui=0;ui<4095;ui++)
{
sum=sum+pVar->flash_dat[ui];
}
pVar->flash_dat[4095]=sum;
portid=addr;
flash_boot_erase_sector(portid);
portid=adrbak;
for(i=0;i<4096;i++)
{
rst_wdog();
flash_boot_write_with_poll(portid,pVar->flash_dat[i]);
portid=portid+2;
}
}
*/
void initflashsum(void)
{
register unsigned int portid;
register unsigned int value;
unsigned int sum,ui,addr;
int i;
for(i=0;i<4;i++)
{
addr=PSD_FLASH_BASE+(unsigned int)i*8192;
portid=addr;
sum=0;
rst_wdog();
for(ui=0;ui<4095;ui++)
{
asm ld value,[portid];
sum=sum+value;
portid=portid+2;
pVar->flash_dat[ui]=value;
}
pVar->flash_dat[4095]=sum;
rst_wdog();
value=addr;
flash_boot_erase_bulk(value);
portid=addr;
for(ui=0;ui<4096;ui++)
{
flash_boot_write_with_poll(portid,pVar->flash_dat[ui]);
portid=portid+2;
rst_wdog();
}
}
}
void init_coef(void)
{
int i;
unsigned int addr;
unsigned char ch;
unsigned int sum;
unsigned int ui;
register unsigned int portid;
register unsigned int value;
rst_wdog();
ch=0;
for(i=0;i<10;i++)
{
if((flashid[0]!=0xAAAA) ||(flashid[1]!=0x5555)) ch++;
}
if(ch>8)
{
for(ui=0;ui<4096;ui++) pVar->flash_dat[ui]=0;
pVar->flash_dat[0]=0xaaaa;
pVar->flash_dat[1]=0x5555;
pVar->flash_dat[2]=8192;
flash_boot_reset(); // reset flash, read array mode
// addr=PSD_FLASH_BASE; rst_wdog();
// flash_boot_erase_bulk(addr); 全擦除
// rst_wdog();
// addr=PSD_FLASH_BASE;
// for(ui=0;ui<4096;ui++)
// {
// flash_boot_write_with_poll(addr,pVar->flash_dat[ui]);
// addr=addr+2;
// rst_wdog();
// }
addr=PSD_FLASH_BASE;
for(i=0;i<1;i++)
{
rst_wdog();
portid=addr+0x2000;
for(ui=0;ui<4095;ui++)
{
asm ld value,[portid];
pVar->flash_dat[ui]=value;
pVar->flash_dat_bak[ui]=value;
portid=portid+2;
if(ui==0)
{
if(pVar->flash_dat[0]!=0xAAAA) break;
}
if(ui==1)
{
if(pVar->flash_dat[1]!=0x5555) break;
}
}
pVar->flash_dat[0]=0xaaaa;
pVar->flash_dat[1]=0x5555;
pVar->flash_dat[2]=8192;
pVar->flash_dat_bak[0]=0xaaaa;
pVar->flash_dat_bak[1]=0x5555;
pVar->flash_dat_bak[2]=8192;
sum=0;
for(ui=0;ui<4095;ui++)
{
sum=sum+pVar->flash_dat[ui];
}
pVar->flash_dat[4095]=sum;
sum=0;
for(ui=0;ui<4095;ui++)
{
sum=sum+pVar->flash_dat_bak[ui];
}
pVar->flash_dat_bak[4095]=sum;
portid=addr;
rst_wdog();
value=addr;
flash_boot_erase_sector(value);
portid=addr;
for(ui=0;ui<4096;ui++)
{
flash_boot_write_with_poll(portid,pVar->flash_dat[ui]);
portid=portid+2;
rst_wdog();
}
addr=addr+0x2000;
}
}else
{
addr=PSD_FLASH_BASE; rst_wdog();
portid=addr;
sum=0;
rst_wdog();
for(ui=0;ui<4095;ui++)
{
asm ld value,[portid];
pVar->flash_dat[ui]=value;
sum=sum+value;
portid=portid+2;
}
pVar->flash_dat[4095]=sum;
portid=PSD_FLASH_BASE+0x2000;
sum=0;
rst_wdog();
for(ui=0;ui<4095;ui++)
{
asm ld value,[portid];
pVar->flash_dat_bak[ui]=value;
sum=sum+value;
portid=portid+2;
}
pVar->flash_dat_bak[4095]=sum;
if(pVar->flash_dat[4095]!=pVar->flash_dat_bak[4095])
{
flash_boot_reset(); // reset flash, read array mode
addr=PSD_FLASH_BASE+0x2000;
for(i=0;i<1;i++)
{
rst_wdog();
for(ui=0;ui<4096;ui++)
{
pVar->flash_dat_bak[ui]=pVar->flash_dat[ui];
}
portid=addr;
rst_wdog();
value=addr;
flash_boot_erase_sector(value);
portid=addr;
for(ui=0;ui<4096;ui++)
{
flash_boot_write_with_poll(portid,pVar->flash_dat_bak[ui]);
portid=portid+2;
rst_wdog();
}
addr=addr+0x2000;
}
}
}
}
void flashwrite(unsigned int addr,unsigned int data)
{
register unsigned int portid;
register unsigned int value;
unsigned int adrbak;
unsigned int sum;
unsigned int ui;
int i;
flash_boot_reset();// reset flash, read array mode
portid=addr;
portid=portid-PSD_FLASH_BASE;
value=portid/8192;
portid=PSD_FLASH_BASE+value*8192;
adrbak=portid;
for(i=0;i<4096;i++)
{
asm ld value,[portid];
pVar->flash_dat[i]=value;
portid=portid+2;
rst_wdog();
}
portid=addr;
portid=portid-PSD_FLASH_BASE;
i=(portid % 8192)/2;
pVar->flash_dat[i]=data;
sum=0;
for(ui=0;ui<4095;ui++)
{
sum=sum+pVar->flash_dat[ui];
}
pVar->flash_dat[4095]=sum;
portid=addr;
flash_boot_erase_sector(portid);
portid=adrbak;
for(i=0;i<4096;i++)
{
rst_wdog();
flash_boot_write_with_poll(portid,pVar->flash_dat[i]);
portid=portid+2;
}
}
void fpwrite(unsigned int addr,unsigned int *pdata)
{
register unsigned int portid;
register unsigned int value;
unsigned int adrbak;
unsigned int sum;
unsigned int ui;
int i,j,k;
flash_boot_reset();// reset flash, read array mode
portid=addr;
portid=portid-PSD_FLASH_BASE;
value=portid/8192;
portid=PSD_FLASH_BASE+value*8192;
adrbak=portid;
for(i=0;i<4096;i++)
{
asm ld value,[portid];
pVar->flash_dat[i]=value;
portid=portid+2;
rst_wdog();
}
portid=addr;
portid=portid-PSD_FLASH_BASE;
i=(portid % 8192)/2;
j=(int)*pdata;
if(j>4092) j=4092;
for(k=0;k<j;k++)
{
pVar->flash_dat[i+k]=*(pdata+k+1);
}
sum=0;
for(ui=0;ui<4095;ui++)
{
sum=sum+pVar->flash_dat[ui];
}
pVar->flash_dat[4095]=sum;
portid=addr;
flash_boot_erase_sector(portid);
portid=adrbak;
for(i=0;i<4096;i++)
{
rst_wdog();
flash_boot_write_with_poll(portid,pVar->flash_dat[i]);
portid=portid+2;
}
}
void flashwrite_h(unsigned int addr)
{
register unsigned int portid;
register unsigned int value;
unsigned int adrbak;
unsigned int sum;
unsigned int ui;
int i;
flash_boot_reset();// reset flash, read array mode
portid=addr;
portid=portid-PSD_FLASH_BASE;
value=portid/8192;
portid=PSD_FLASH_BASE+value*8192;
adrbak=portid;
for(i=0;i<4096;i++)
{
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?