⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updater_f02x.lst

📁 F020.rar
💻 LST
📖 第 1 页 / 共 2 页
字号:
 205   4                                                              {
 206   5                                                                   Cell_No=Rec_Buf[3];     //取出当前是第几个数据块
 207   5                                                                       if(Cell_No==0)                  //如果当前是第一条数据,进行处理
 208   5                                                                       {
 209   6                                                                       for(i=1;i<123;i++)
 210   6                                                                      {
 211   7                                                                          Erase_Flash(i);
 212   7                                                                      }
 213   6      
 214   6                                                                           //Erase_Flash(122);
 215   6                                                                               Write_Flash(Rec_Buf+4,122);
 216   6                                                                               Rec_Buf[5]=Read_Flash(1);
 217   6                                                                               Rec_Buf[6]=Read_Flash(2);
 218   6                                                                               Erase_Flash(0);
 219   6                                                                               Write_Flash(Rec_Buf+4,0);
 220   6                                                                       }
 221   5                                                                       else if(Cell_No<=121)   //收到的数据没有超出可写范围则写入
 222   5                                                                       {
 223   6                                                                           //Erase_Flash(Cell_No);
 224   6                                                                               Write_Flash(Rec_Buf+4,Cell_No);
 225   6                                                                       }
 226   5                                                                       for(i=0;i<512;i++)
 227   5                                                                      {
 228   6                                                                         if(Rec_Buf[4+i]!=Read_Flash(Cell_No*512+i))Write_Error=1;
 229   6                                                                      }
 230   5                                                                       if(!Write_Error)
 231   5                                                                       {
 232   6                                                                          Send_Buf[0]=0x55;
 233   6                                                                      Send_Buf[1]=0xAA;
 234   6                                                                      Send_Buf[2]=0xD2;
 235   6                                                                      SendData(Send_Buf,3); //返回可以接收下一条数据
 236   6                                                                       }
 237   5                                                                       else
 238   5                                                                       {
 239   6                                                                      Send_Buf[0]=0x55;
 240   6                                                                          Send_Buf[1]=0xAA;
 241   6                                                                          Send_Buf[2]=0xD4;
C51 COMPILER V7.50   UPDATER_F02X                                                          06/05/2007 11:01:38 PAGE 5   

 242   6                                                                          SendData(Send_Buf,3); //返回升级失败
 243   6                                                                          
 244   6                                                                       }
 245   5                                                              }
 246   4                                                              else
 247   4                                                              {
 248   5                                                                   Send_Buf[0]=0x55;
 249   5                                                                       Send_Buf[1]=0xAA;
 250   5                                                                       Send_Buf[2]=0xD4;
 251   5                                                                       SendData(Send_Buf,3); //返回升级失败
 252   5                                                              }
 253   4                                                              P_RecBuf=0;
 254   4                                                              break;
 255   4                                         case 0xE2:              //上位机给出升级成功指令,则开始运行正常程序
 256   4                                                          if(Update_Step!=3) {P_RecBuf=0;return;}
 257   4                                                              P_RecBuf=0;
 258   4                                                  JumpToRun();
 259   4                                                              break;
 260   4                                         default :
 261   4                                                  P_RecBuf=0;
 262   4                                                  break;
 263   4                               }
 264   3                       }
 265   2                       else
 266   2                       {
 267   3                           P_RecBuf=0;   //帧头无效则清除接收缓存
 268   3                       }
 269   2      
 270   2               }
 271   1      }
 272          //-----------------------------------------------------------------------------
 273          // erase_flash
 274          //-----------------------------------------------------------------------------
 275          //
 276          // This routine erases the first 8 pages of FLASH (0x0000 to 0x0FFF).
 277          //
 278          void Erase_Flash(unsigned char Erase_Page)
 279          {
 280   1         char xdata* data pagePointer = 0;// a pointer to xdata located in data space
 281   1                                          // points to the first FLASH page that 
 282   1                                          // will be erased
 283   1            
 284   1         bit EA_state;                    // holds interrupt state
 285   1      
 286   1         EA_state = EA;                   // save interrupt state
 287   1      
 288   1         EA = 0;                          // disable interrupts
 289   1         FLSCL |= 0x01;                   // enable FLASH write/erase
 290   1         PSCTL  = 0x03;                   // MOVX erases FLASH
 291   1         
 292   1         // Erase the first 8 FLASH pages
 293   1         pagePointer=Erase_Page*512;
 294   1            *pagePointer = 0;             // initiate the erase
 295   1            
 296   1         PSCTL = 0x00;                    // MOVX writes target XRAM
 297   1         FLSCL &= ~0x01;                  // disable FLASH write/erase
 298   1         
 299   1         EA =  EA_state;                  // restore interrupt state
 300   1      
 301   1         f_valid = FALSE;                 // indicate that code is no longer valid
 302   1         code_erased = TRUE;              // indicate that FLASH has been erased
 303   1      }
C51 COMPILER V7.50   UPDATER_F02X                                                          06/05/2007 11:01:38 PAGE 6   

 304          
 305          void Write_Flash(unsigned char *Write_Buf,unsigned char Write_Page)
 306          {
 307   1                char xdata* data pwrite;
 308   1                unsigned int i;
 309   1      
 310   1            EA = 0;                             // disable interrupts (precautionary)   
 311   1            FLSCL |= 0x01;                      // enable FLASH write/erase
 312   1            PSCTL  = 0x01;                      // MOVX writes FLASH
 313   1      
 314   1            pwrite = Write_Page*512;      // initialize the write pointer
 315   1          
 316   1            // write the record into flash
 317   1            for( i = 0; i < 512; i++)
 318   1                {
 319   2               *pwrite=Write_Buf[i];
 320   2                       pwrite++;
 321   2            }
 322   1            
 323   1            PSCTL = 0x00;                       // MOVX writes target XRAM
 324   1            FLSCL &= ~0x01;                     // disable FLASH write/erase
 325   1      }
 326          
 327          unsigned char Read_Flash(unsigned int Read_Address )
 328          {
 329   1            char code* data pread; 
 330   1                unsigned char ReadTemp;
 331   1                pread =  (char code*)Read_Address;
 332   1                ReadTemp=*pread;
 333   1                return(ReadTemp);
 334   1      }
 335          
 336          //-----------------------------------------------------------------------------
 337          // Initialization Subroutines
 338          //-----------------------------------------------------------------------------
 339          
 340          //-----------------------------------------------------------------------------
 341          // SYSCLK_Init
 342          //-----------------------------------------------------------------------------
 343          //
 344          // This routine initializes the system clock to use an 22.1184MHz crystal
 345          // as its clock source.
 346          //
 347          void SYSCLK_Init (void)
 348          {
 349   1         int i;                              // delay counter
 350   1      
 351   1         OSCXCN = 0x67;                      // start external oscillator with
 352   1                                             // 22.1184MHz crystal
 353   1      
 354   1         for (i=0; i < 256; i++) ;           // wait for osc to start
 355   1      
 356   1         while (!(OSCXCN & 0x80)) ;          // Wait for crystal osc. to settle
 357   1      
 358   1         OSCICN = 0x88;                      // select external oscillator as SYSCLK
 359   1                                             // source and enable missing clock
 360   1                                             // detector
 361   1      }
 362          
 363          //-----------------------------------------------------------------------------
 364          // PORT_Init
 365          //-----------------------------------------------------------------------------
C51 COMPILER V7.50   UPDATER_F02X                                                          06/05/2007 11:01:38 PAGE 7   

 366          //
 367          // Configure the Crossbar and GPIO ports
 368          //
 369          void PORT_Init (void)
 370          {
 371   1         XBR0    = 0x17;                     // Enable UART0,SPI,I2C,CEX0,CEX1
 372   1         XBR1    = 0x16;                                         //使能两外部中断,TO输入口
 373   1         P0MDOUT=0x15;
 374   1         P1MDOUT=0x01;
 375   1         P2MDOUT=0xC0;
 376   1         P3MDOUT  = 0xC0;                    
 377   1         P74OUT   = 0x00;                    //P4~P7设为开漏输出
 378   1         EMI0CF   = 0x2B;                    //XRAM的访问方式为带块选择分片方式。输入输出端口使用P4~P7,地址复用
             -方式;
 379   1         XBR2    = 0x44;                     // Enable crossbar and weak pull-ups      ,UART1
 380   1      
 381   1      }
 382          
 383          //-----------------------------------------------------------------------------
 384          // UART0_Init
 385          //-----------------------------------------------------------------------------
 386          //
 387          // Configure the UART0 using Timer1, for <baudrate> and 8-N-1.
 388          //
 389          void UART0_Init (void)
 390          {
 391   1         SCON0   = 0x50;                     // SCON0: mode 1, 8-bit UART, enable RX
 392   1         TMOD    = 0x20;                     // TMOD: timer 1, mode 2, 8-bit reload
 393   1         TH1    = -(SYSCLK/BAUDRATE/16);     // set Timer1 reload value for baudrate
 394   1         TR1    = 1;                         // start Timer1
 395   1         CKCON |= 0x10;                      // Timer1 uses SYSCLK as time base
 396   1         PCON  |= 0x80;                      // SMOD00 = 1
 397   1         ES0=0;
 398   1         TI0= 0;                       
 399   1         RI0=0;
 400   1      }
 401          


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    821    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =   1112    ----
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      6      14
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      3       2
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -