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 + -
显示快捷键?