亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? updater_f02x.c

?? 實驗了C8051f020 在線升級代碼IAP
?? C
字號:
/*
可用于用戶程序的空間共為122個扇區(qū)共62464個字節(jié)(0x0000-0xF3FF)
引導(dǎo)程序占用四個扇區(qū)(0xF400-0xFBFF) 2048字節(jié) 
*/
#include <c8051f020.h>                 // SFR declarations
#include "crc.h"

//-----------------------------------------------------------------------------
// Global CONSTANTS
//-----------------------------------------------------------------------------
#define TRUE         1
#define FALSE        0

#define SYSCLK       22118400          // SYSCLK frequency in Hz
#define BAUDRATE     115200            // Baud rate of UART in bps

#define BINCELL_LEN  518               //數(shù)據(jù)段大小

sbit Run = P3^7;                       // LED='1' means ON

unsigned char xdata Rec_Buf[600];
unsigned char xdata Send_Buf[512];
unsigned int P_RecBuf=0;
//-----------------------------------------------------------------------------
// Function PROTOTYPES
//-----------------------------------------------------------------------------

void main (void);

// Initialization Subroutines
void SYSCLK_Init (void);
void PORT_Init (void);
void UART0_Init (void);


//-----------------------------------------------------------------------------
// Global VARIABLES
//-----------------------------------------------------------------------------

void (*f)();                           // function pointer declaration

bit code_erased = FALSE;               // flag used to indicate that the FLASH
                                       // erase operation is complete
bit f_valid = FALSE;                   // flag to indicate that the FLASH 
                                       // programming operation is complete
bit Need_Update=0;

unsigned char Update_Step=0;
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------

void DealRec();
void SendData(unsigned char *SendBuf,unsigned char SendLen);
void Erase_Flash(unsigned char Erase_Page);
void Write_Flash(unsigned char *Write_Buf,unsigned char Write_Page);
unsigned char Read_Flash(unsigned int Read_Address );

//延時1ms
void DelayMs(unsigned int TimeNum)
{
	unsigned int i,j;
	for(i=0;i<TimeNum;i++)
	{
		for(j=0;j<185;j++);
	}
}

void JumpToRun()
{
	 IE=0;
	 CKCON=0;
	 PCON=0;
	 TMOD=0;
	 SCON0=0;
	 TH1=0;
	 TL1=0;
	 TR1=0;
	 ((void(code *)(void))0xF400)();

}

void main (void) 
{
   unsigned int Update_OverTime=0;   

   WDTCN = 0xde;                       // disable watchdog timer
   WDTCN = 0xad;

   EA = 0;                             // disable interrupts (this statement
                                       // is needed because the device is not
                                       // neccesarily in a reset state prior 
                                       // to executing this code) 
   OSCXCN=0;


   PORT_Init ();                       // initialize crossbar and GPIO
   SYSCLK_Init ();                     // initialize oscillator
   UART0_Init ();                      // initialize UART0
   
   Run=0;
   
   DelayMs(100);
   Update_Step=1;
   Send_Buf[0]=0x55;
   Send_Buf[1]=0xAA;
   Send_Buf[2]=0xA1;
   SendData(Send_Buf,3);

   /*while(RI0==0)
   {
      if(Update_OverTime>60000) //如果升級超時,則進入正常程序
	  {
		  JumpToRun();

	  }
	  else
	  {
	     Update_OverTime++; 
	  }
   }
   Rec_Buf[P_RecBuf++]=SBUF0;
   RI0=0;
   Update_OverTime=0;*/

       
   while (1)
   {
	   while(RI0==0)
	   {
	      if(Need_Update==0)
	     {
             if(Update_OverTime>60000) //如果升級超時,則進入正常程序
	        {
		        JumpToRun();

	        }
	         else
	        {
	           Update_OverTime++; 
	        }
	     }
	   }

	   Rec_Buf[P_RecBuf++]=SBUF0;
	   RI0=0;
	   Update_OverTime=0;
	   DealRec();
   } // end while

} // end main

void SendData(unsigned char *SendBuf,unsigned char SendLen)
{
      unsigned char i;
	  for(i=0;i<SendLen;i++)
	  {
	      SBUF0=SendBuf[i];
		  while(TI0==0);
		  TI0=0;
	  }
}

void DealRec()
{
     unsigned int i;
	 unsigned int CRC;
	 unsigned char CRC_H;
	 unsigned char CRC_L;
	 unsigned int Cell_No;
	 bit Write_Error=0;
	 if(P_RecBuf>=3) //至少收到三個字節(jié)。
	 {
	     if(Rec_Buf[0]==0x55&&Rec_Buf[1]==0xAA)	//數(shù)據(jù)幀頭有效
		 {
		     switch(Rec_Buf[2])
			 {
			      case 0xB1:		   //收到上位機應(yīng)答升級請求的命令
				            if(Update_Step==1)
							{
							   Update_Step=2;
							   Need_Update=1;
							}
							P_RecBuf=0;
				            break;
				  case 0xC1:		   //收到上位機要求升級的指令
				            if(Update_Step==2)
							{
							  Update_Step=3;
							  Send_Buf[0]=0x55;
							  Send_Buf[1]=0xAA;
							  Send_Buf[2]=0xD1;
							  SendData(Send_Buf,3); //返回可以接收數(shù)據(jù)
				            }
							P_RecBuf=0;
							break;
				  case 0xE1:		   //收到上位機發(fā)送的數(shù)據(jù)幀
				            if(P_RecBuf<BINCELL_LEN) return;  //幀未收全則返回
				            if(Update_Step!=3) {P_RecBuf=0;return;}
							
							CRC=cal_crc(Rec_Buf+4,512);
							CRC_H=CRC>>8;
							CRC_L=CRC;
							if(Rec_Buf[516]==CRC_H&&Rec_Buf[517]==CRC_L)	//通過CRC校驗,則寫入數(shù)據(jù)
							{
							     Cell_No=Rec_Buf[3];     //取出當(dāng)前是第幾個數(shù)據(jù)塊
								 if(Cell_No==0)			 //如果當(dāng)前是第一條數(shù)據(jù),進行處理
								 {
							         for(i=1;i<123;i++)
							        {
							            Erase_Flash(i);
							        }

								     //Erase_Flash(122);
									 Write_Flash(Rec_Buf+4,122);
									 Rec_Buf[5]=Read_Flash(1);
									 Rec_Buf[6]=Read_Flash(2);
									 Erase_Flash(0);
									 Write_Flash(Rec_Buf+4,0);
								 }
								 else if(Cell_No<=121)	 //收到的數(shù)據(jù)沒有超出可寫范圍則寫入
								 {
								     //Erase_Flash(Cell_No);
									 Write_Flash(Rec_Buf+4,Cell_No);
								 }
								 for(i=0;i<512;i++)
								{
								   if(Rec_Buf[4+i]!=Read_Flash(Cell_No*512+i))Write_Error=1;
								}
								 if(!Write_Error)
								 {
								    Send_Buf[0]=0x55;
							        Send_Buf[1]=0xAA;
							        Send_Buf[2]=0xD2;
							        SendData(Send_Buf,3); //返回可以接收下一條數(shù)據(jù)
								 }
								 else
								 {
							        Send_Buf[0]=0x55;
								    Send_Buf[1]=0xAA;
								    Send_Buf[2]=0xD4;
								    SendData(Send_Buf,3); //返回升級失敗
								    
								 }
							}
							else
							{
							     Send_Buf[0]=0x55;
								 Send_Buf[1]=0xAA;
								 Send_Buf[2]=0xD4;
								 SendData(Send_Buf,3); //返回升級失敗
							}
							P_RecBuf=0;
							break;
				   case 0xE2:		   //上位機給出升級成功指令,則開始運行正常程序
						    if(Update_Step!=3) {P_RecBuf=0;return;}
							P_RecBuf=0;
				            JumpToRun();
							break;
				   default :
				            P_RecBuf=0;
				            break;
			 }
		 }
		 else
		 {
		     P_RecBuf=0;   //幀頭無效則清除接收緩存
		 }

	 }
}
//-----------------------------------------------------------------------------
// erase_flash
//-----------------------------------------------------------------------------
//
// This routine erases the first 8 pages of FLASH (0x0000 to 0x0FFF).
//
void Erase_Flash(unsigned char Erase_Page)
{
   char xdata* data pagePointer = 0;// a pointer to xdata located in data space
                                    // points to the first FLASH page that 
                                    // will be erased
      
   bit EA_state;                    // holds interrupt state

   EA_state = EA;                   // save interrupt state

   EA = 0;                          // disable interrupts
   FLSCL |= 0x01;                   // enable FLASH write/erase
   PSCTL  = 0x03;                   // MOVX erases FLASH
   
   // Erase the first 8 FLASH pages
   pagePointer=Erase_Page*512;
      *pagePointer = 0;             // initiate the erase
      
   PSCTL = 0x00;                    // MOVX writes target XRAM
   FLSCL &= ~0x01;                  // disable FLASH write/erase
   
   EA =  EA_state;                  // restore interrupt state

   f_valid = FALSE;                 // indicate that code is no longer valid
   code_erased = TRUE;              // indicate that FLASH has been erased
}

void Write_Flash(unsigned char *Write_Buf,unsigned char Write_Page)
{
	  char xdata* data pwrite;
	  unsigned int i;

      EA = 0;                             // disable interrupts (precautionary)   
      FLSCL |= 0x01;                      // enable FLASH write/erase
      PSCTL  = 0x01;                      // MOVX writes FLASH

      pwrite = Write_Page*512;      // initialize the write pointer
    
      // write the record into flash
      for( i = 0; i < 512; i++)
	  {
         *pwrite=Write_Buf[i];
		 pwrite++;
      }
      
      PSCTL = 0x00;                       // MOVX writes target XRAM
      FLSCL &= ~0x01;                     // disable FLASH write/erase
}

unsigned char Read_Flash(unsigned int Read_Address )
{
      char code* data pread; 
	  unsigned char ReadTemp;
	  pread =  (char code*)Read_Address;
	  ReadTemp=*pread;
	  return(ReadTemp);
}

//-----------------------------------------------------------------------------
// Initialization Subroutines
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
// SYSCLK_Init
//-----------------------------------------------------------------------------
//
// This routine initializes the system clock to use an 22.1184MHz crystal
// as its clock source.
//
void SYSCLK_Init (void)
{
   int i;                              // delay counter

   OSCXCN = 0x67;                      // start external oscillator with
                                       // 22.1184MHz crystal

   for (i=0; i < 256; i++) ;           // wait for osc to start

   while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle

   OSCICN = 0x88;                      // select external oscillator as SYSCLK
                                       // source and enable missing clock
                                       // detector
}

//-----------------------------------------------------------------------------
// PORT_Init
//-----------------------------------------------------------------------------
//
// Configure the Crossbar and GPIO ports
//
void PORT_Init (void)
{
   XBR0    = 0x17;                     // Enable UART0,SPI,I2C,CEX0,CEX1
   XBR1    = 0x16;					   //使能兩外部中斷,TO輸入口
   P0MDOUT=0x15;
   P1MDOUT=0x01;
   P2MDOUT=0xC0;
   P3MDOUT  = 0xC0;                    
   P74OUT   = 0x00;                    //P4~P7設(shè)為開漏輸出
   EMI0CF   = 0x2B;                    //XRAM的訪問方式為帶塊選擇分片方式。輸入輸出端口使用P4~P7,地址復(fù)用方式;
   XBR2    = 0x44;                     // Enable crossbar and weak pull-ups	 ,UART1

}

//-----------------------------------------------------------------------------
// UART0_Init
//-----------------------------------------------------------------------------
//
// Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
//
void UART0_Init (void)
{
   SCON0   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
   TMOD    = 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload
   TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
   TR1    = 1;                         // start Timer1
   CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
   PCON  |= 0x80;                      // SMOD00 = 1
   ES0=0;
   TI0= 0;                       
   RI0=0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线观看中文字幕不卡| 国产精品影视天天线| 欧洲一区在线观看| 亚洲国产视频a| 欧美在线播放高清精品| 性感美女久久精品| 日韩情涩欧美日韩视频| 国产在线看一区| 欧美国产日韩a欧美在线观看| 豆国产96在线|亚洲| 日韩理论电影院| 欧美日韩在线三级| 另类欧美日韩国产在线| 国产亚洲欧洲997久久综合| 成人精品免费网站| 亚洲一区二区在线视频| 欧美一二区视频| 风流少妇一区二区| 亚洲综合在线免费观看| 91精品国产欧美日韩| 国内精品视频666| 国产精品久久久久一区| 欧美性大战久久久久久久蜜臀| 免费在线看成人av| 国产精品私房写真福利视频| 色老汉av一区二区三区| 蜜臀av性久久久久av蜜臀妖精| 久久精品日产第一区二区三区高清版| 粉嫩蜜臀av国产精品网站| 亚洲国产精品欧美一二99| 精品久久国产字幕高潮| 99久久99久久精品免费看蜜桃| 亚洲第一av色| 久久精品免视看| 欧美日韩一卡二卡| 国产成人在线观看免费网站| 亚洲国产日产av| 久久久久国色av免费看影院| 日本丰满少妇一区二区三区| 看电视剧不卡顿的网站| 亚洲一区二区三区四区五区中文| 日韩精品影音先锋| 日本道免费精品一区二区三区| 久久国产尿小便嘘嘘| 亚洲欧美日韩国产成人精品影院| 日韩欧美一区中文| 色婷婷综合久久久中文字幕| 精品一区二区三区蜜桃| 亚洲自拍偷拍网站| 国产精品女同互慰在线看| 欧美一区二区视频免费观看| 色综合久久天天综合网| 国产精品18久久久久久久久久久久| 亚洲.国产.中文慕字在线| 国产精品女主播在线观看| 日韩精品一区二区三区在线| 91在线观看美女| 国产精品一区一区三区| 亚瑟在线精品视频| 亚洲视频免费看| 日韩欧美国产成人一区二区| 91精品91久久久中77777| 国产91精品露脸国语对白| 美女高潮久久久| 亚洲国产成人精品视频| 亚洲视频一二三| 国产嫩草影院久久久久| 精品国产免费久久| 日韩一区二区精品| 91精品国产91久久久久久最新毛片 | 国产高清一区日本| 美日韩一区二区三区| 奇米影视7777精品一区二区| 亚洲国产精品一区二区www| 亚洲欧美偷拍卡通变态| 日韩毛片视频在线看| 亚洲欧洲国产日本综合| 国产精品乱码人人做人人爱| 欧美激情一区二区三区四区| 国产欧美视频在线观看| 国产女人18水真多18精品一级做| 国产亚洲欧美色| 国产午夜精品一区二区| 国产欧美日本一区视频| 久久精品视频一区二区| 国产精品少妇自拍| 国产精品第四页| 亚洲伦理在线精品| 一区二区成人在线视频| 无吗不卡中文字幕| 美女看a上一区| 国产高清久久久| 成人免费三级在线| 91久久精品一区二区二区| 欧美在线视频不卡| 欧美一级久久久久久久大片| 欧美精品一区二区三区视频| 国产午夜精品一区二区三区四区| 国产精品乱码久久久久久| 亚洲视频小说图片| 婷婷久久综合九色综合绿巨人| 久久99最新地址| 本田岬高潮一区二区三区| 欧美在线视频日韩| 美洲天堂一区二卡三卡四卡视频| 国产美女娇喘av呻吟久久 | 99视频精品在线| 色吧成人激情小说| 日韩小视频在线观看专区| 欧美国产精品v| 亚洲国产精品一区二区www在线| 免费不卡在线观看| av高清久久久| 91精品综合久久久久久| 国产拍揄自揄精品视频麻豆| 一区二区三区日韩欧美| 麻豆精品视频在线| 99国产精品久| 91精品国产91久久久久久一区二区| 国产人伦精品一区二区| 亚洲国产视频一区| 国产激情精品久久久第一区二区 | 亚洲h动漫在线| 国产一区二区看久久| 欧美性色黄大片| 国产亚洲欧洲一区高清在线观看| 亚洲伊人色欲综合网| 国产成人精品一区二| 91精品国产综合久久香蕉麻豆 | 91丝袜呻吟高潮美腿白嫩在线观看| 91精品久久久久久久久99蜜臂| 国产精品乱码久久久久久| 另类小说综合欧美亚洲| 色88888久久久久久影院野外| 精品99一区二区三区| 亚洲资源中文字幕| 成人avav在线| 久久美女高清视频| 免费在线观看日韩欧美| 欧美日韩中字一区| 成人免费在线视频观看| 国产制服丝袜一区| 欧美高清视频不卡网| 亚洲你懂的在线视频| 国产一本一道久久香蕉| 欧美一级高清大全免费观看| 亚洲福利电影网| 色婷婷久久一区二区三区麻豆| 国产视频911| 国产在线精品国自产拍免费| 午夜精品久久久久久久| 91网上在线视频| 国产精品久久久久三级| 成人午夜短视频| 久久久不卡影院| 激情五月激情综合网| 9191国产精品| 日本不卡一二三| 欧美日韩专区在线| 亚洲成人av在线电影| 在线亚洲免费视频| 亚洲精品日产精品乱码不卡| 成人免费观看男女羞羞视频| 国产三级一区二区三区| 激情深爱一区二区| 日韩欧美高清一区| 毛片av一区二区| 日韩欧美在线影院| 久久爱另类一区二区小说| 欧美大肚乱孕交hd孕妇| 久久电影国产免费久久电影| 欧美一二三四区在线| 奇米色一区二区| 精品久久久久久久久久久久包黑料 | 91麻豆精品国产91久久久| 图片区日韩欧美亚洲| 欧美日韩国产区一| 石原莉奈一区二区三区在线观看| 欧美视频一区二区三区四区| 亚洲成人免费av| 91精品黄色片免费大全| 极品尤物av久久免费看| 337p粉嫩大胆噜噜噜噜噜91av| 国产一区二区福利视频| 国产精品久久久久久久蜜臀| 处破女av一区二区| 亚洲欧洲成人精品av97| 91国内精品野花午夜精品| 午夜精品一区在线观看| 91精品国产91热久久久做人人| 极品少妇一区二区| 国产精品国模大尺度视频| 在线观看不卡一区| 日韩成人精品在线观看| 精品少妇一区二区三区在线播放| 成人午夜伦理影院| 亚洲一区二区三区影院| 日韩三级视频中文字幕| 成人一区二区视频| 一区二区三区不卡视频|