历史上的今天
今天是:2025年04月04日(星期五)
2020年04月04日 | STM32系统保存参数到eeprom的实现方法
2020-04-04 来源:eefocus
1 ini.c
#include #include "stm32f10x.h" #include "string.h" #include "EEPROMDrv.h" #include "ini.h" //define the memory map in EEPROM #define IniStartAddress 0 #define IniMaxSize 200 /* EEPROM 0________200________________________________________________________________64K | | | |INI | OTHERS | |_________|_________________________________________________________________| */ //---------------Declare variable--------------- //Eeprom is initialized const uint8_t Var1_Len = 2; uint8_t Var1_EepromIsInitialized[Var1_Len] = {0}; const uint8_t Var1_Default[Var1_Len] = {0x55, 0x11}; //start const 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 printf("%02x ", buf[i]); } printf("rn"); } 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 printf("%02x ", buf[i]); } printf("rn"); } 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 m = machine_ini[i].VarLen; //printf("%s : i = %d, machine_ini[i].VarLen = %drn", __func__, i, m); for(j=0; 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 m = machine_ini[i].VarLen; //printf("%s : i = %d, machine_ini[i].VarLen = %drn", __func__, i, m); for(j=0; 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 %drn", __func__, ret); } void Ini_RestoreToFactoryDefault (void) { uint16_t i=0, j=0; for(i=0; i memset(machine_ini[i].Var, 0, machine_ini[i].VarLen); for(j=0; 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 chip if(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 for(j=0; j if(machine_ini[i].Var[j] != machine_ini[i].VarDefault[j]) { printf("%s i=%d, j=%drn", __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 { //pointer uint8_t *Var; //if you are use the function "Restroe factory set", VarDefault -> Var const uint8_t *VarDefault; uint8_t VarLen; }INI; #define machine_ini_max 10 extern INI machine_ini[machine_ini_max]; //Item list #define IniItem_EepromIsInitialized 0 #define IniItem_Contrast 1 #define IniItem_KeyTone 2 #define IniItem_Language 3 #define IniItem_TerminalPassword 4 #define IniItem_ServerAddress 5 #define IniItem_ApnName 6 #define IniItem_ApnId 7 #define IniItem_ApnPassword 8 #define IniItem_AdvancedMenuPassword 9 //IniItem_Language #define lang_English 0 #define lang_Chinese 1 //user use as follow #define gEepromIsInitialized machine_ini[IniItem_EepromIsInitialized] #define gContrast machine_ini[IniItem_Contrast] #define gKeyTone machine_ini[IniItem_KeyTone] #define gLanguage machine_ini[IniItem_Language] #define gTerminalPassword machine_ini[IniItem_TerminalPassword] #define gServerAddress machine_ini[IniItem_ServerAddress] #define gApnName machine_ini[IniItem_ApnName] #define gApnId machine_ini[IniItem_ApnId] #define gApnPassword machine_ini[IniItem_ApnPassword] #define gAdvancedMenuPassword machine_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 }
史海拾趣
|
急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...… 查看全部问答> |
|
目 录 第一篇 低压开关柜二次线路的设计安装、 运行维护总论 ( ) ………………… 第一章 配电网络和配电设备概述 ( ) ………………………………………………… 第二章 配电变压器的设计安装、 运行维护 ( ) …………………………………… ...… 查看全部问答> |
|
我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊… 查看全部问答> |
|
就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS, 但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...… 查看全部问答> |
|
所在公司的一个项目,比较类似于手持gps。 大致上硬件环境就是FPGA的开发板,Altera的2c系列,采用nios的软核cpu。 开发环境就是NIOSII 6.1,c语言。 具体要实现的具体功能已经部分有一些代码,测试功能用。 现在想加操作系统,需要高手帮忙。 ...… 查看全部问答> |
|
内容摘要: 结合红外防盗报警和ZigBee技术这两大热点课题,利用TI公司的单芯片CC2430和RE200B红外传感器,完成了基于ZigBee技术无线红外防盗报警系统的硬件设计和软件开发,解决了现有无线报警系统存在的误报警,成本高等问题。经过对系统的硬件软件电 ...… 查看全部问答> |




