eeprom.c
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #include "eeprom.h"
00026
00027
00028
00029
00030
00031
00032
00033 uint16_t DataVar = 0;
00034
00035
00036 extern uint16_t VirtAddVarTab[NumbOfVar];
00037
00038
00039
00040 static FLASH_Status EE_Format(void);
00041 static uint16_t EE_FindValidPage(uint8_t Operation);
00042 static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data);
00043 static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data);
00044
00045
00046
00047
00048
00049
00050
00051
00052 uint16_t EE_Init(void)
00053 {
00054 uint16_t PageStatus0 = 6, PageStatus1 = 6;
00055 uint16_t VarIdx = 0;
00056 uint16_t EepromStatus = 0, ReadStatus = 0;
00057 int16_t x = -1;
00058 uint16_t FlashStatus;
00059
00060
00061 PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
00062
00063 PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
00064
00065
00066 switch (PageStatus0)
00067 {
00068 case ERASED:
00069 if (PageStatus1 == VALID_PAGE)
00070 {
00071
00072 FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
00073
00074 if (FlashStatus != FLASH_COMPLETE)
00075 {
00076 return FlashStatus;
00077 }
00078 }
00079 else if (PageStatus1 == RECEIVE_DATA)
00080 {
00081
00082 FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
00083
00084 if (FlashStatus != FLASH_COMPLETE)
00085 {
00086 return FlashStatus;
00087 }
00088
00089 FlashStatus = FLASH_ProgramHalfWord(PAGE1_BASE_ADDRESS, VALID_PAGE);
00090
00091 if (FlashStatus != FLASH_COMPLETE)
00092 {
00093 return FlashStatus;
00094 }
00095 }
00096 else
00097 {
00098
00099 FlashStatus = EE_Format();
00100
00101 if (FlashStatus != FLASH_COMPLETE)
00102 {
00103 return FlashStatus;
00104 }
00105 }
00106 break;
00107
00108 case RECEIVE_DATA:
00109 if (PageStatus1 == VALID_PAGE)
00110 {
00111
00112 for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
00113 {
00114 if (( *(__IO uint16_t*)(PAGE0_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
00115 {
00116 x = VarIdx;
00117 }
00118 if (VarIdx != x)
00119 {
00120
00121 ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
00122
00123 if (ReadStatus != 0x1)
00124 {
00125
00126 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
00127
00128 if (EepromStatus != FLASH_COMPLETE)
00129 {
00130 return EepromStatus;
00131 }
00132 }
00133 }
00134 }
00135
00136 FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
00137
00138 if (FlashStatus != FLASH_COMPLETE)
00139 {
00140 return FlashStatus;
00141 }
00142
00143 FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
00144
00145 if (FlashStatus != FLASH_COMPLETE)
00146 {
00147 return FlashStatus;
00148 }
00149 }
00150 else if (PageStatus1 == ERASED)
00151 {
00152
00153 FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
00154
00155 if (FlashStatus != FLASH_COMPLETE)
00156 {
00157 return FlashStatus;
00158 }
00159
00160 FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
00161
00162 if (FlashStatus != FLASH_COMPLETE)
00163 {
00164 return FlashStatus;
00165 }
00166 }
00167 else
00168 {
00169
00170 FlashStatus = EE_Format();
00171
00172 if (FlashStatus != FLASH_COMPLETE)
00173 {
00174 return FlashStatus;
00175 }
00176 }
00177 break;
00178
00179 case VALID_PAGE:
00180 if (PageStatus1 == VALID_PAGE)
00181 {
00182
00183 FlashStatus = EE_Format();
00184
00185 if (FlashStatus != FLASH_COMPLETE)
00186 {
00187 return FlashStatus;
00188 }
00189 }
00190 else if (PageStatus1 == ERASED)
00191 {
00192
00193 FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
00194
00195 if (FlashStatus != FLASH_COMPLETE)
00196 {
00197 return FlashStatus;
00198 }
00199 }
00200 else
00201 {
00202
00203 for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
00204 {
00205 if ((*(__IO uint16_t*)(PAGE1_BASE_ADDRESS + 6)) == VirtAddVarTab[VarIdx])
00206 {
00207 x = VarIdx;
00208 }
00209 if (VarIdx != x)
00210 {
00211
00212 ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
00213
00214 if (ReadStatus != 0x1)
00215 {
00216
00217 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
00218
00219 if (EepromStatus != FLASH_COMPLETE)
00220 {
00221 return EepromStatus;
00222 }
00223 }
00224 }
00225 }
00226
00227 FlashStatus = FLASH_ProgramHalfWord(PAGE1_BASE_ADDRESS, VALID_PAGE);
00228
00229 if (FlashStatus != FLASH_COMPLETE)
00230 {
00231 return FlashStatus;
00232 }
00233
00234 FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
00235
00236 if (FlashStatus != FLASH_COMPLETE)
00237 {
00238 return FlashStatus;
00239 }
00240 }
00241 break;
00242
00243 default:
00244
00245 FlashStatus = EE_Format();
00246
00247 if (FlashStatus != FLASH_COMPLETE)
00248 {
00249 return FlashStatus;
00250 }
00251 break;
00252 }
00253
00254 return FLASH_COMPLETE;
00255 }
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267 uint16_t EE_ReadVariable(uint16_t VirtAddress, uint16_t* Data)
00268 {
00269 uint16_t ValidPage = PAGE0;
00270 uint16_t AddressValue = 0x5555, ReadStatus = 1;
00271 uint32_t Address = 0x08010000, PageStartAddress = 0x08010000;
00272
00273
00274 ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
00275
00276
00277 if (ValidPage == NO_VALID_PAGE)
00278 {
00279 return NO_VALID_PAGE;
00280 }
00281
00282
00283 PageStartAddress = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
00284
00285
00286 Address = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
00287
00288
00289 while (Address > (PageStartAddress + 2))
00290 {
00291
00292 AddressValue = (*(__IO uint16_t*)Address);
00293
00294
00295 if (AddressValue == VirtAddress)
00296 {
00297
00298 *Data = (*(__IO uint16_t*)(Address - 2));
00299
00300
00301 ReadStatus = 0;
00302
00303 break;
00304 }
00305 else
00306 {
00307
00308 Address = Address - 4;
00309 }
00310 }
00311
00312
00313 return ReadStatus;
00314 }
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326 uint16_t EE_WriteVariable(uint16_t VirtAddress, uint16_t Data)
00327 {
00328 uint16_t Status = 0;
00329
00330
00331 Status = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
00332
00333
00334 if (Status == PAGE_FULL)
00335 {
00336
00337 Status = EE_PageTransfer(VirtAddress, Data);
00338 }
00339
00340
00341 return Status;
00342 }
00343
00344
00345
00346
00347
00348
00349
00350 static FLASH_Status EE_Format(void)
00351 {
00352 FLASH_Status FlashStatus = FLASH_COMPLETE;
00353
00354
00355 FlashStatus = FLASH_ErasePage(PAGE0_BASE_ADDRESS);
00356
00357
00358 if (FlashStatus != FLASH_COMPLETE)
00359 {
00360 return FlashStatus;
00361 }
00362
00363
00364 FlashStatus = FLASH_ProgramHalfWord(PAGE0_BASE_ADDRESS, VALID_PAGE);
00365
00366
00367 if (FlashStatus != FLASH_COMPLETE)
00368 {
00369 return FlashStatus;
00370 }
00371
00372
00373 FlashStatus = FLASH_ErasePage(PAGE1_BASE_ADDRESS);
00374
00375
00376 return FlashStatus;
00377 }
00378
00379
00380
00381
00382
00383
00384
00385
00386
00387
00388 static uint16_t EE_FindValidPage(uint8_t Operation)
00389 {
00390 uint16_t PageStatus0 = 6, PageStatus1 = 6;
00391
00392
00393 PageStatus0 = (*(__IO uint16_t*)PAGE0_BASE_ADDRESS);
00394
00395
00396 PageStatus1 = (*(__IO uint16_t*)PAGE1_BASE_ADDRESS);
00397
00398
00399 switch (Operation)
00400 {
00401 case WRITE_IN_VALID_PAGE:
00402 if (PageStatus1 == VALID_PAGE)
00403 {
00404
00405 if (PageStatus0 == RECEIVE_DATA)
00406 {
00407 return PAGE0;
00408 }
00409 else
00410 {
00411 return PAGE1;
00412 }
00413 }
00414 else if (PageStatus0 == VALID_PAGE)
00415 {
00416
00417 if (PageStatus1 == RECEIVE_DATA)
00418 {
00419 return PAGE1;
00420 }
00421 else
00422 {
00423 return PAGE0;
00424 }
00425 }
00426 else
00427 {
00428 return NO_VALID_PAGE;
00429 }
00430
00431 case READ_FROM_VALID_PAGE:
00432 if (PageStatus0 == VALID_PAGE)
00433 {
00434 return PAGE0;
00435 }
00436 else if (PageStatus1 == VALID_PAGE)
00437 {
00438 return PAGE1;
00439 }
00440 else
00441 {
00442 return NO_VALID_PAGE ;
00443 }
00444
00445 default:
00446 return PAGE0;
00447 }
00448 }
00449
00450
00451
00452
00453
00454
00455
00456
00457
00458
00459
00460 static uint16_t EE_VerifyPageFullWriteVariable(uint16_t VirtAddress, uint16_t Data)
00461 {
00462 FLASH_Status FlashStatus = FLASH_COMPLETE;
00463 uint16_t ValidPage = PAGE0;
00464 uint32_t Address = 0x08010000, PageEndAddress = 0x080107FF;
00465
00466
00467 ValidPage = EE_FindValidPage(WRITE_IN_VALID_PAGE);
00468
00469
00470 if (ValidPage == NO_VALID_PAGE)
00471 {
00472 return NO_VALID_PAGE;
00473 }
00474
00475
00476 Address = (uint32_t)(EEPROM_START_ADDRESS + (uint32_t)(ValidPage * PAGE_SIZE));
00477
00478
00479 PageEndAddress = (uint32_t)((EEPROM_START_ADDRESS - 2) + (uint32_t)((1 + ValidPage) * PAGE_SIZE));
00480
00481
00482 while (Address < PageEndAddress)
00483 {
00484
00485 if ((*(__IO uint32_t*)Address) == 0xFFFFFFFF)
00486 {
00487
00488 FlashStatus = FLASH_ProgramHalfWord(Address, Data);
00489
00490 if (FlashStatus != FLASH_COMPLETE)
00491 {
00492 return FlashStatus;
00493 }
00494
00495 FlashStatus = FLASH_ProgramHalfWord(Address + 2, VirtAddress);
00496
00497 return FlashStatus;
00498 }
00499 else
00500 {
00501
00502 Address = Address + 4;
00503 }
00504 }
00505
00506
00507 return PAGE_FULL;
00508 }
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520
00521 static uint16_t EE_PageTransfer(uint16_t VirtAddress, uint16_t Data)
00522 {
00523 FLASH_Status FlashStatus = FLASH_COMPLETE;
00524 uint32_t NewPageAddress = 0x080103FF, OldPageAddress = 0x08010000;
00525 uint16_t ValidPage = PAGE0, VarIdx = 0;
00526 uint16_t EepromStatus = 0, ReadStatus = 0;
00527
00528
00529 ValidPage = EE_FindValidPage(READ_FROM_VALID_PAGE);
00530
00531 if (ValidPage == PAGE1)
00532 {
00533
00534 NewPageAddress = PAGE0_BASE_ADDRESS;
00535
00536
00537 OldPageAddress = PAGE1_BASE_ADDRESS;
00538 }
00539 else if (ValidPage == PAGE0)
00540 {
00541
00542 NewPageAddress = PAGE1_BASE_ADDRESS;
00543
00544
00545 OldPageAddress = PAGE0_BASE_ADDRESS;
00546 }
00547 else
00548 {
00549 return NO_VALID_PAGE;
00550 }
00551
00552
00553 FlashStatus = FLASH_ProgramHalfWord(NewPageAddress, RECEIVE_DATA);
00554
00555 if (FlashStatus != FLASH_COMPLETE)
00556 {
00557 return FlashStatus;
00558 }
00559
00560
00561 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddress, Data);
00562
00563 if (EepromStatus != FLASH_COMPLETE)
00564 {
00565 return EepromStatus;
00566 }
00567
00568
00569 for (VarIdx = 0; VarIdx < NumbOfVar; VarIdx++)
00570 {
00571 if (VirtAddVarTab[VarIdx] != VirtAddress)
00572 {
00573
00574 ReadStatus = EE_ReadVariable(VirtAddVarTab[VarIdx], &DataVar);
00575
00576 if (ReadStatus != 0x1)
00577 {
00578
00579 EepromStatus = EE_VerifyPageFullWriteVariable(VirtAddVarTab[VarIdx], DataVar);
00580
00581 if (EepromStatus != FLASH_COMPLETE)
00582 {
00583 return EepromStatus;
00584 }
00585 }
00586 }
00587 }
00588
00589
00590 FlashStatus = FLASH_ErasePage(OldPageAddress);
00591
00592 if (FlashStatus != FLASH_COMPLETE)
00593 {
00594 return FlashStatus;
00595 }
00596
00597
00598 FlashStatus = FLASH_ProgramHalfWord(NewPageAddress, VALID_PAGE);
00599
00600 if (FlashStatus != FLASH_COMPLETE)
00601 {
00602 return FlashStatus;
00603 }
00604
00605
00606 return FlashStatus;
00607 }
00608
00609
00610
00611
00612
00613
STM32F10x Standard Peripherals Library: Footer
|
|
For complete
documentation on STM32(CORTEX M3) 32-bit Microcontrollers platform visit www.st.com/STM32
|
|
|