simple test EEPROM emulation (STM algorithm described in the application notes: AN4061, AN3969, AN2594, AN3390, AN4056) for STM32F091

Dependencies:   mbed

Description in AN4061 from STM.

Changed (compared with the original code AN4061):

  • possibility of a larger size of emulated EEPROM (using multiple Flash pages)
  • dummy variables prevent overwrite code in Flash by algorithm of EEPROM emulation




Macro PAGE_NB_PVP (in eeprom.h) defines the size of the virtual page.
Eg. For F091 where Flash page are 2kB value 4 gives 8kB.

Size 8kB virtual page gives you the ability to use max. approx. 2k of 16-bit variables.

Committer:
mega64
Date:
Fri Sep 23 23:58:25 2016 +0000
Revision:
6:669ff12928f9
Parent:
2:3d16b28380a9
Added possibility to increase size of virtual pages of emulation

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mega64 0:bbe849f641a8 1
mega64 0:bbe849f641a8 2 #include "mbed.h"
mega64 0:bbe849f641a8 3 #include "eeprom.h"
mega64 0:bbe849f641a8 4 #include <ctype.h>
mega64 0:bbe849f641a8 5
mega64 2:3d16b28380a9 6
mega64 2:3d16b28380a9 7
mega64 0:bbe849f641a8 8 uint16_t n = 0;
mega64 0:bbe849f641a8 9 /* Virtual address defined by the user: 0xFFFF value is prohibited */
mega64 2:3d16b28380a9 10 uint16_t VirtAddVarTab[NB_OF_VAR] = {0x5555, 0x6666, 0x7777};
mega64 0:bbe849f641a8 11 uint16_t VarDataTab[] = {0, 0, 0};
mega64 0:bbe849f641a8 12
mega64 0:bbe849f641a8 13
mega64 2:3d16b28380a9 14
mega64 0:bbe849f641a8 15 int main()
mega64 0:bbe849f641a8 16 {
mega64 0:bbe849f641a8 17
mega64 0:bbe849f641a8 18 /* Unlock the Flash Program Erase controller */
mega64 0:bbe849f641a8 19 HAL_FLASH_Unlock();
mega64 0:bbe849f641a8 20
mega64 0:bbe849f641a8 21 EE_Init();
mega64 0:bbe849f641a8 22
mega64 0:bbe849f641a8 23 printf("EEPROM emulation test\n");
mega64 0:bbe849f641a8 24
mega64 0:bbe849f641a8 25 printf("\n\rType one of the following commands and press space or enter");
mega64 0:bbe849f641a8 26 printf("\n\r READ - read all variables\n\r WRITE1 <n> - write first variable\n\r WRITE2 <n> - write second variable\n\r WRITE3 <n> - write third variable");
mega64 0:bbe849f641a8 27 printf("\n\rwhere <n> is uint16_t value (0-65535)");
mega64 0:bbe849f641a8 28 printf("\n\r");
mega64 0:bbe849f641a8 29
mega64 0:bbe849f641a8 30
mega64 0:bbe849f641a8 31 char command[20];
mega64 0:bbe849f641a8 32 char arg[10];
mega64 0:bbe849f641a8 33 int i;
mega64 0:bbe849f641a8 34
mega64 0:bbe849f641a8 35 while(1) {
mega64 0:bbe849f641a8 36 scanf("%s", command);
mega64 0:bbe849f641a8 37 i=0;
mega64 0:bbe849f641a8 38 while(command[i])
mega64 0:bbe849f641a8 39 {
mega64 0:bbe849f641a8 40 command[i]=toupper(command[i]);
mega64 0:bbe849f641a8 41 i++;
mega64 0:bbe849f641a8 42 }
mega64 0:bbe849f641a8 43
mega64 0:bbe849f641a8 44
mega64 0:bbe849f641a8 45 if (strcmp("READ", command)==0) {
mega64 0:bbe849f641a8 46 for (i=0; i<3; i++) {
mega64 0:bbe849f641a8 47 EE_ReadVariable(VirtAddVarTab[i], &VarDataTab[i]);
mega64 0:bbe849f641a8 48 };
mega64 0:bbe849f641a8 49 printf("\nvar1=%6u, var2=%6u, var3=%6u",VarDataTab[0],VarDataTab[1],VarDataTab[2]);
mega64 0:bbe849f641a8 50 }
mega64 0:bbe849f641a8 51 ///////////////////////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 52 else if (strcmp("WRITE1", command)==0) {
mega64 0:bbe849f641a8 53 scanf("%s", arg);
mega64 0:bbe849f641a8 54 printf("\nok");
mega64 0:bbe849f641a8 55 n=atoi(arg);
mega64 0:bbe849f641a8 56 EE_WriteVariable(VirtAddVarTab[0], n);
mega64 0:bbe849f641a8 57 }
mega64 0:bbe849f641a8 58 ////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 59 else if (strcmp("WRITE2", command)==0) {
mega64 0:bbe849f641a8 60 scanf("%s", arg);
mega64 0:bbe849f641a8 61 printf("\nok");
mega64 0:bbe849f641a8 62 n=atoi(arg);
mega64 0:bbe849f641a8 63 EE_WriteVariable(VirtAddVarTab[1], n);
mega64 0:bbe849f641a8 64 }
mega64 0:bbe849f641a8 65 ////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 66 else if (strcmp("WRITE3", command)==0) {
mega64 0:bbe849f641a8 67 scanf("%s", arg);
mega64 0:bbe849f641a8 68 printf("\nok");
mega64 0:bbe849f641a8 69 n=atoi(arg);
mega64 0:bbe849f641a8 70 EE_WriteVariable(VirtAddVarTab[2], n);
mega64 0:bbe849f641a8 71 }
mega64 0:bbe849f641a8 72 ////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 73 else if (strcmp("T1", command)==0) {
mega64 0:bbe849f641a8 74 // multiple write test. After test var1 = 1000
mega64 0:bbe849f641a8 75 printf("\nok");
mega64 0:bbe849f641a8 76 for (n=0;n<1001;n++)
mega64 0:bbe849f641a8 77 {
mega64 0:bbe849f641a8 78 EE_WriteVariable(VirtAddVarTab[0], n);
mega64 0:bbe849f641a8 79 };
mega64 0:bbe849f641a8 80 }
mega64 0:bbe849f641a8 81 ////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 82 else if (strcmp("T2", command)==0) {
mega64 2:3d16b28380a9 83 // multiple write test. After test var2 = 1001
mega64 0:bbe849f641a8 84 printf("\nok");
mega64 0:bbe849f641a8 85 for (n=0;n<1002;n++)
mega64 0:bbe849f641a8 86 {
mega64 0:bbe849f641a8 87 EE_WriteVariable(VirtAddVarTab[1], n);
mega64 0:bbe849f641a8 88 };
mega64 0:bbe849f641a8 89 }
mega64 0:bbe849f641a8 90 ////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 91 else if (strcmp("T3", command)==0) {
mega64 2:3d16b28380a9 92 // multiple write test. After test var3 = 1002
mega64 0:bbe849f641a8 93 printf("\nok");
mega64 0:bbe849f641a8 94 for (n=0;n<1003;n++)
mega64 0:bbe849f641a8 95 {
mega64 0:bbe849f641a8 96 EE_WriteVariable(VirtAddVarTab[2], n);
mega64 0:bbe849f641a8 97 };
mega64 0:bbe849f641a8 98 }
mega64 0:bbe849f641a8 99 ////////////////////////////////////////////////////////////////////////////////////
mega64 0:bbe849f641a8 100
mega64 0:bbe849f641a8 101 else perror("\nThere is no command matching. Try again");
mega64 0:bbe849f641a8 102
mega64 0:bbe849f641a8 103 command[0] = arg[0] = 0;
mega64 0:bbe849f641a8 104 printf("\n\r");
mega64 0:bbe849f641a8 105 }
mega64 0:bbe849f641a8 106
mega64 0:bbe849f641a8 107
mega64 0:bbe849f641a8 108 }