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

📄 eeprom.lst

📁 ST公司的upsd dk2000评估板仿真eeprom的源程序。
💻 LST
📖 第 1 页 / 共 5 页
字号:
 216   3                              {
 217   4                                      if ( Boot_Flash_Write( last_address++, ptr[j] ) ) return FLASH_WRITE_ERROR;
 218   4                              }
 219   3                      }
 220   2              }
 221   1      
 222   1              return 0;
 223   1      }
 224          
 225          /***** Update_Record *****/
 226          // Update record in EEPROM.
 227          // Accepts record id and new record data.
 228          // Swaps to empty sector if current sector is full
 229          BYTE Update_Record(WORD id, BYTE xdata *buf)
 230          {
 231   1          BYTE i;
 232   1          BYTE xdata status;
 233   1              BYTE xdata bufover[EEPROM_RECORD_SIZE];
 234   1      
 235   1              status = Write_Record(id, buf);
 236   1         
 237   1              // when the sector is full, save the new record to ram and transfer to a blank sector   
 238   1              if( status == SECTOR_FULL ) 
 239   1              {
 240   2                      // store new data in temporary buffer
 241   2                      for ( i=0; i < sizeof(bufover); i++ )
C51 COMPILER V7.00  EEPROM                                                                 02/10/2003 10:48:05 PAGE 5   

 242   2                      {
 243   3                              bufover[i] = buf[i];
 244   3                      }
 245   2                      // perform sector swap
 246   2                      status = Eeprom_Sector_Swap(id, &bufover);
 247   2              }
 248   1              
 249   1              return status;  
 250   1      }
 251          
 252          /***** Read_Record *****/
 253          // Reads a data element from EEPROM.
 254          // Accepts record id number.
 255          // Returns record data byte. If error, returns error code.
 256          BYTE Read_Record(WORD id_number, BYTE* buffer)
 257          {
 258   1              BYTE xdata valid_sector = 0xFF;
 259   1              xdata struct sector_header xdata header;
 260   1              xdata struct record_entry xdata record;
 261   1              WORD i;
 262   1              BYTE *ptr;
 263   1              BYTE xdata *data_buf;
 264   1              WORD xdata address;
 265   1              WORD xdata base_address;
 266   1              WORD xdata last_address;
 267   1      
 268   1              // get active sector
 269   1              valid_sector = Find_Active_Sector(F_READ);
 270   1              if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
 271   1      
 272   1              // get pointer to data
 273   1              data_buf = buffer;
 274   1      
 275   1              // calculate base address of data
 276   1              base_address =  SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) + 
 277   1                                              (WORD)sizeof(header) + ( id_number * (WORD)sizeof(record) );
 278   1      
 279   1              // get base record
 280   1              ptr = (BYTE*) (&record);
 281   1              address = base_address;
 282   1              for ( i=0; i<sizeof(record); i++ )
 283   1              {
 284   2                      ptr[i] = Boot_Flash_Read( address++ );
 285   2              }
 286   1      
 287   1              // get last record
 288   1              if ( record.last_record_update != 0xFFFF )
 289   1              {
 290   2                      address = base_address;
 291   2                      do      
 292   2                      {
 293   3                              ptr = (BYTE*) (&record);
 294   3                              last_address = address;
 295   3                              for ( i=0; i<sizeof(record); i++ )
 296   3                              {
 297   4                                      ptr[i] = Boot_Flash_Read( address++ );
 298   4                              }
 299   3                              address = record.last_record_update;
 300   3                      } while ( record.last_record_update != 0xFFFF );
 301   2               }
 302   1               else
 303   1               {
C51 COMPILER V7.00  EEPROM                                                                 02/10/2003 10:48:05 PAGE 6   

 304   2                      last_address = base_address;
 305   2               }
 306   1      
 307   1               if( record.status == UNINITIALIZED ) return UNINITIALIZED;
 308   1      
 309   1              // Set data buffer
 310   1              for ( i=0; i<EEPROM_RECORD_SIZE; i++ )
 311   1              {
 312   2                      data_buf[i] = record.record_data[i];
 313   2              }
 314   1      
 315   1              return 0;
 316   1      }
 317          
 318          /***** Write_Record *****/
 319          // Write or update record in EEPROM.
 320          // Accepts record id and new record data.
 321          // If error, returns error code.
 322          BYTE Write_Record(WORD id, BYTE xdata *buffer)
 323          {
 324   1              xdata struct sector_header xdata header;
 325   1              xdata struct record_entry xdata record;
 326   1              WORD i;
 327   1              BYTE xdata valid_sector;
 328   1              WORD xdata last_address;
 329   1              WORD xdata base_address;
 330   1              WORD xdata new_address;
 331   1              WORD address;
 332   1              BYTE *ptr;
 333   1              BYTE xdata *data_buf;
 334   1      
 335   1              // get active sector
 336   1              valid_sector = Find_Active_Sector(F_WRITE);
 337   1              if ( valid_sector == SECTOR_ID_ERROR ) return SECTOR_ID_ERROR;
 338   1      
 339   1              // get pointer to data
 340   1              data_buf = buffer;
 341   1      
 342   1              // calculate base address of data
 343   1              base_address =  SECTOR_0_BASE_ADDRESS + ((WORD)valid_sector * SECTOR_SIZE) + 
 344   1                                              (WORD)sizeof(header) + ( id * (WORD)sizeof(record) );
 345   1      
 346   1              // get base record
 347   1              ptr = (BYTE*) (&record);
 348   1              address = base_address;
 349   1              for ( i=0; i<sizeof(record); i++ )
 350   1              {
 351   2                      ptr[i] = Boot_Flash_Read( address++ );
 352   2              }
 353   1      
 354   1              // write data if record not initialized
 355   1              if ( record.status == UNINITIALIZED )
 356   1              {
 357   2                      record.status = VALID_DATA;
 358   2                      record.last_record_update = 0xFFFF;
 359   2                      for ( i=0; i < EEPROM_RECORD_SIZE; i++ )
 360   2                      {
 361   3                              record.record_data[i] = data_buf[i];    // set data byte
 362   3                      }
 363   2      
 364   2                      // write record to flash
 365   2                      ptr = (BYTE*) (&record);
C51 COMPILER V7.00  EEPROM                                                                 02/10/2003 10:48:05 PAGE 7   

 366   2                      address = base_address;
 367   2                      for ( i=0; i < sizeof(record); i++ )
 368   2                      {
 369   3                              if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
 370   3                      }
 371   2      
 372   2                      return 0;
 373   2              }
 374   1              
 375   1              // find last entry if record initialized        
 376   1              address = base_address;
 377   1              do
 378   1              {
 379   2                      ptr = (BYTE*) (&record);
 380   2                      for ( i=0; i<sizeof(record); i++ )
 381   2                      {
 382   3                              ptr[i] = Boot_Flash_Read( address++ );
 383   3                      }
 384   2                      if ( record.status == SUPERSEDED )
 385   2                      {
 386   3                              address = record.last_record_update;
 387   3                      }
 388   2                      
 389   2              } while ( record.status == SUPERSEDED );
 390   1      
 391   1              last_address = address - (WORD)sizeof(record);
 392   1      
 393   1              // get next available address
 394   1              new_address = Find_Next_Address();
 395   1              if( new_address == SECTOR_FULL ) return SECTOR_FULL; // abort if sector is full
 396   1      
 397   1              // set old record to update in progress
 398   1              address = last_address;
 399   1              for ( i=0; i<sizeof(record); i++ )
 400   1              {
 401   2                      ptr[i] = Boot_Flash_Read( address++ );
 402   2              }
 403   1              record.status = UPDATE_DATA;
 404   1              address = last_address;
 405   1              for ( i=0; i < sizeof(record); i++ )
 406   1              {
 407   2                      if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
 408   2              }
 409   1      
 410   1              // write data to new address
 411   1              address = new_address;
 412   1              record.status = VALID_DATA;
 413   1              record.last_record_update = 0xFFFF;
 414   1              for ( i=0; i < EEPROM_RECORD_SIZE; i++ )
 415   1              {
 416   2                      record.record_data[i] = data_buf[i];    // set data byte
 417   2              }
 418   1              address = new_address;
 419   1              for ( i=0; i < sizeof(record); i++ )
 420   1              {
 421   2                      if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
 422   2              }
 423   1      
 424   1              // update old record to superseded
 425   1              address = last_address;
 426   1              for ( i=0; i<sizeof(record); i++ )
 427   1              {
C51 COMPILER V7.00  EEPROM                                                                 02/10/2003 10:48:05 PAGE 8   

 428   2                      ptr[i] = Boot_Flash_Read( address++ );
 429   2              }
 430   1              record.status = SUPERSEDED;
 431   1              record.last_record_update = new_address;
 432   1              address = last_address;
 433   1              for ( i=0; i < sizeof(record); i++ )
 434   1              {
 435   2                      if ( Boot_Flash_Write( address++, ptr[i] ) ) return FLASH_WRITE_ERROR;
 436   2              }
 437   1      

⌨️ 快捷键说明

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