simple test EEPROM emulation (STM algorithm described in the application notes: AN4061, AN3969, AN2594, AN3390, AN4056) for STM32F091
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.
Diff: main.cpp
- Revision:
- 0:bbe849f641a8
- Child:
- 2:3d16b28380a9
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun May 29 01:22:48 2016 +0000
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * @file main.cpp
+ * @author ANG Group (Nelson Santos; Irina Baptista; Pierluigi Urru)
+ * @version V0.0.3
+ * @brief Simple Example application for using the X_NUCLEO_IKS01A1
+ * MEMS Inertial & Environmental Sensor Nucleo expansion board.
+ ******************************************************************************
+*/
+
+#include "mbed.h"
+#include "eeprom.h"
+#include <ctype.h>
+
+uint16_t n = 0;
+/* Virtual address defined by the user: 0xFFFF value is prohibited */
+uint16_t VirtAddVarTab[] = {0x5555, 0x6666, 0x7777};
+uint16_t VarDataTab[] = {0, 0, 0};
+
+
+int main()
+{
+
+ /* Unlock the Flash Program Erase controller */
+ HAL_FLASH_Unlock();
+
+ EE_Init();
+
+ printf("EEPROM emulation test\n");
+
+ printf("\n\rType one of the following commands and press space or enter");
+ 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");
+ printf("\n\rwhere <n> is uint16_t value (0-65535)");
+ printf("\n\r");
+
+
+ char command[20];
+ char arg[10];
+ int i;
+
+ while(1) {
+ scanf("%s", command);
+ i=0;
+ while(command[i])
+ {
+ command[i]=toupper(command[i]);
+ i++;
+ }
+
+
+ if (strcmp("READ", command)==0) {
+ for (i=0; i<3; i++) {
+ EE_ReadVariable(VirtAddVarTab[i], &VarDataTab[i]);
+ };
+ printf("\nvar1=%6u, var2=%6u, var3=%6u",VarDataTab[0],VarDataTab[1],VarDataTab[2]);
+ }
+///////////////////////////////////////////////////////////////////////////////////////////////////////
+ else if (strcmp("WRITE1", command)==0) {
+ scanf("%s", arg);
+ printf("\nok");
+ n=atoi(arg);
+ EE_WriteVariable(VirtAddVarTab[0], n);
+ }
+////////////////////////////////////////////////////////////////////////////////////
+ else if (strcmp("WRITE2", command)==0) {
+ scanf("%s", arg);
+ printf("\nok");
+ n=atoi(arg);
+ EE_WriteVariable(VirtAddVarTab[1], n);
+ }
+////////////////////////////////////////////////////////////////////////////////////
+ else if (strcmp("WRITE3", command)==0) {
+ scanf("%s", arg);
+ printf("\nok");
+ n=atoi(arg);
+ EE_WriteVariable(VirtAddVarTab[2], n);
+ }
+////////////////////////////////////////////////////////////////////////////////////
+ else if (strcmp("T1", command)==0) {
+ // multiple write test. After test var1 = 1000
+ printf("\nok");
+ for (n=0;n<1001;n++)
+ {
+ EE_WriteVariable(VirtAddVarTab[0], n);
+ };
+ }
+////////////////////////////////////////////////////////////////////////////////////
+ else if (strcmp("T2", command)==0) {
+ // multiple write test. After test var1 = 1001
+ printf("\nok");
+ for (n=0;n<1002;n++)
+ {
+ EE_WriteVariable(VirtAddVarTab[1], n);
+ };
+ }
+////////////////////////////////////////////////////////////////////////////////////
+ else if (strcmp("T3", command)==0) {
+ // multiple write test. After test var1 = 1002
+ printf("\nok");
+ for (n=0;n<1003;n++)
+ {
+ EE_WriteVariable(VirtAddVarTab[2], n);
+ };
+ }
+////////////////////////////////////////////////////////////////////////////////////
+
+ else perror("\nThere is no command matching. Try again");
+
+ command[0] = arg[0] = 0;
+ printf("\n\r");
+ }
+
+
+}