STM32系统保存参数到eeprom的实现方法

来源:互联网 发布:java xssfcellstyle 编辑:程序博客网 时间:2024/05/22 00:22

1 ini.c

#include <stdio.h>#include "stm32f10x.h"#include "string.h"#include "EEPROMDrv.h"#include "ini.h"//define the memory map in EEPROM#define IniStartAddress 0#define IniMaxSize 200/*EEPROM0________200________________________________________________________________64K|         |     ||INI  | OTHERS    ||_________|_________________________________________________________________|*///---------------Declare variable---------------//Eeprom is initializedconst uint8_t Var1_Len = 2;uint8_t Var1_EepromIsInitialized[Var1_Len]= {0};const uint8_t Var1_Default[Var1_Len] = {0x55, 0x11};//startconst uint8_t Var2_Len = 1;uint8_t Var2_Contrast[Var2_Len] = {0};const uint8_t Var2_Default[Var2_Len] = {50};const uint8_t Var3_Len = 1;uint8_t Var3_KeyTone[Var3_Len] = {0};const uint8_t Var3_Default[Var3_Len] = {0};const uint8_t Var4_Len = 1;uint8_t Var4_Language[Var4_Len] = {0};const uint8_t Var4_Default[Var4_Len] = {0};const uint8_t Var5_Len = 9;uint8_t Var5_TerminalPassword[Var5_Len] = {0};const uint8_t Var5_Default[Var5_Len] = {"123456"};const uint8_t Var6_Len = 28;uint8_t Var6_ServerAddress[Var6_Len] = {0};const uint8_t Var6_Default[Var6_Len] = {"255.255.255.255,10245"};const uint8_t Var7_Len = 15;uint8_t Var7_ApnName[Var7_Len] = {0};const uint8_t Var7_Default[Var7_Len] = {"cmnet"};const uint8_t Var8_Len = 15;uint8_t Var8_ApnId[Var8_Len] = {0};const uint8_t Var8_Default[Var8_Len] = {0};const uint8_t Var9_Len = 15;uint8_t Var9_ApnPassword[Var9_Len] = {0};const uint8_t Var9_Default[Var9_Len] = {0};const uint8_t Var10_Len = 15;uint8_t Var10_AdvancedMenuPassword[Var10_Len] = {0};const uint8_t Var10_Default[Var10_Len] = {"000000"};//...add your ini variable here, total length of Vars, do not more than MAXINIBUFFSIZE(200)INI machine_ini[machine_ini_max] ={//variable buff,,The initial value of the buff//VarEepromIsInitialized;{Var1_EepromIsInitialized,Var1_Default,Var1_Len},//start//VarContrast;{Var2_Contrast,Var2_Default,Var2_Len},//VarKeyTone;{Var3_KeyTone,Var3_Default,Var3_Len},//VarLanguage;{Var4_Language,Var4_Default,Var4_Len},//VarTerminalPassword;{Var5_TerminalPassword,Var5_Default,Var5_Len},//VarServerAddress;{Var6_ServerAddress,Var6_Default,Var6_Len},//VarApnName;{Var7_ApnName,Var7_Default,Var7_Len},//VarApnId;{Var8_ApnId,Var8_Default,Var8_Len},//VarApnPassword;{Var9_ApnPassword,Var9_Default,Var9_Len},//VarAdvancedMenuPassword;{Var10_AdvancedMenuPassword,Var10_Default,Var10_Len},//...add yours as follow};uint8_t IniTempBuf[IniMaxSize] = {0};void PrintBuf(const char *title, uint8_t buf[], uint16_t size){uint16_t i=0;printf("%s : ", title);for(i=0; i<size; i++){printf("%02x ", buf[i]);}printf("\r\n");}void PrintBuf2(const char *title, const char *content, uint16_t i, uint8_t buf[], uint16_t size){printf("%s : ", title);printf(" %s %d, ", content, i);for(i=0; i<size; i++){printf("%02x ", buf[i]);}printf("\r\n");}void Ini_ReadFromEeprom (void){uint16_t i=0, j=0, k=0, m=0;memset(IniTempBuf, 0, sizeof(IniTempBuf));EepromReadBytes(IniStartAddress, IniTempBuf, IniMaxSize);//PrintBuf(__func__, IniTempBuf, 200);for(i=0; i<machine_ini_max; i++){m = machine_ini[i].VarLen;//printf("%s : i = %d, machine_ini[i].VarLen = %d\r\n", __func__, i, m);for(j=0; j<m; j++){machine_ini[i].Var[j] = IniTempBuf[k++];}//PrintBuf2(__func__, "machine_ini[i]=", i, machine_ini[i].Var, machine_ini[i].VarLen);}}void Ini_WriteToEerpom (void){uint16_t i=0, j=0, k=0, m=0;uint8_t ret = 0;memset(IniTempBuf, 0, sizeof(IniTempBuf));for(i=0; i<machine_ini_max; i++){m = machine_ini[i].VarLen;//printf("%s : i = %d, machine_ini[i].VarLen = %d\r\n", __func__, i, m);for(j=0; j<m; j++){IniTempBuf[k++] = machine_ini[i].Var[j];}//PrintBuf2(__func__, "machine_ini[i]=", i, machine_ini[i].Var, machine_ini[i].VarLen);}//PrintBuf(__func__, IniTempBuf, 200);ret = EepromWriteBytes(IniStartAddress, IniTempBuf, IniMaxSize);if(ret != 0)printf("%s : EepromWriteBytes return is %d\r\n", __func__, ret);}void Ini_RestoreToFactoryDefault (void){uint16_t i=0, j=0;for(i=0; i<machine_ini_max; i++){memset(machine_ini[i].Var, 0, machine_ini[i].VarLen);for(j=0; j<machine_ini[i].VarLen; j++){machine_ini[i].Var[j] = machine_ini[i].VarDefault[j];}PrintBuf2(__func__, "machine_ini[i]=", i, machine_ini[i].Var, machine_ini[i].VarLen);}Ini_WriteToEerpom();}void Ini_Initialize (void){Ini_ReadFromEeprom();//may be ini in eeprom have been change,//or it is a new chipif(strncmp((const char *)machine_ini[0].Var, (const char *)machine_ini[0].VarDefault, 2) != 0){Ini_RestoreToFactoryDefault();Ini_ReadFromEeprom();}}int8_t Ini_CmpWithDefault(void){uint16_t i=0, j=0;uint8_t ret = 0;for(i=0; i<machine_ini_max; i++){for(j=0; j<machine_ini[i].VarLen; j++){if(machine_ini[i].Var[j] != machine_ini[i].VarDefault[j]){printf("%s i=%d, j=%d\r\n", __func__, i, j);PrintBuf2(__func__, "machine_ini[i]=", i, machine_ini[i].Var, machine_ini[i].VarLen);ret = 1;//failed}}}return ret;}

ini.h

#ifndef __INI_H__#define __INI_H__void Ini_Initialize (void);void Ini_WriteToEerpom (void);void Ini_ReadFromEeprom (void);void Ini_RestoreToFactoryDefault (void);int8_t Ini_CmpWithDefault(void);typedef struct {//pointeruint8_t *Var;//if you are use the function "Restroe factory set", VarDefault -> Varconst uint8_t *VarDefault;uint8_t VarLen;}INI;#define machine_ini_max 10extern INI machine_ini[machine_ini_max];//Item list#define IniItem_EepromIsInitialized0#define IniItem_Contrast1#define IniItem_KeyTone2#define IniItem_Language3#define IniItem_TerminalPassword4#define IniItem_ServerAddress5#define IniItem_ApnName6#define IniItem_ApnId7#define IniItem_ApnPassword8#define IniItem_AdvancedMenuPassword9//IniItem_Language#define lang_English 0#define lang_Chinese 1//user use as follow#define gEepromIsInitializedmachine_ini[IniItem_EepromIsInitialized]#define gContrastmachine_ini[IniItem_Contrast]#define gKeyTonemachine_ini[IniItem_KeyTone]#define gLanguagemachine_ini[IniItem_Language]#define gTerminalPasswordmachine_ini[IniItem_TerminalPassword]#define gServerAddressmachine_ini[IniItem_ServerAddress]#define gApnNamemachine_ini[IniItem_ApnName]#define gApnIdmachine_ini[IniItem_ApnId]#define gApnPasswordmachine_ini[IniItem_ApnPassword]#define gAdvancedMenuPasswordmachine_ini[IniItem_AdvancedMenuPassword]#endif


//底层需要提供对eeprom的操作函数
//EepromReadBytes(Addr, Buff, Size)
//EepromWriteBytes(Addr, Buff, Size)
int main(void)
{
//初始化ini
//实际操作是将参数从eeprom读到全局数组里面
//判断开始2个字节是否和default值相同,
//如果不相同,则可能是一片新的EEPROM芯片,
//调用 Ini_RestoreToFactoryDefault();
// Ini_ReadFromEeprom();
//恢复default值并写到eeprom,然后重新读出到全局数组


Ini_Initialize();


//修改参数的方法类似如下操作


//set to the new contrast
gContrast.Var[0] = 30;
//save to eeprom
Ini_WriteToEerpom();//实际操作是将全局数组里面的内容写到eeprom


}



原创粉丝点击