历史上的今天
返回首页

历史上的今天

今天是: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


}

推荐阅读

史海拾趣

Eris Technology Corp公司的发展小趣事

面对日益激烈的国际竞争,Eris Tech开始实施全球化战略。公司通过在海外设立研发中心、生产基地和销售网络,加强与国际市场的联系和合作。同时,Eris Tech还积极参与国际标准的制定和技术交流活动,提高了公司的国际影响力和竞争力。随着全球化战略的深入实施,Eris Tech的产品已经远销全球多个国家和地区。

DB Unlimited公司的发展小趣事

随着公司业务的不断发展壮大,DB Unlimited开始将目光投向全球市场。公司积极开拓海外市场,通过参加国际展会、与海外客户建立合作关系等方式,成功将产品推向了全球各地。同时,公司还根据不同国家和地区的市场需求和文化差异,对产品进行本地化改造和优化,进一步提高了产品的市场适应性和竞争力。

DETCO公司的发展小趣事

为了进一步拓展全球市场,ElectronicsCorp制定了国际化战略。公司先后在北美、欧洲和南美等地设立了研发中心和生产基地。这些海外机构不仅为ElectronicsCorp提供了更广阔的市场空间,还使其能够更深入地了解不同地区的消费者需求和文化背景。通过本土化战略的实施,ElectronicsCorp逐渐在海外市场取得了成功。

FCI [First Components International]公司的发展小趣事

当5G技术开始在全球范围内推广时,ElectronicsCorp看到了巨大的商机。公司迅速调整战略,将重点转向5G相关产品的研发。通过与全球领先的通信公司合作,ElectronicsCorp推出了一系列5G手机和通信设备。这些产品不仅性能卓越,而且价格合理,赢得了消费者的青睐。随着5G技术的普及,ElectronicsCorp的市场份额不断扩大。

Enovation Controls LLC公司的发展小趣事

当5G技术开始在全球范围内推广时,ElectronicsCorp看到了巨大的商机。公司迅速调整战略,将重点转向5G相关产品的研发。通过与全球领先的通信公司合作,ElectronicsCorp推出了一系列5G手机和通信设备。这些产品不仅性能卓越,而且价格合理,赢得了消费者的青睐。随着5G技术的普及,ElectronicsCorp的市场份额不断扩大。

FERYSTER公司的发展小趣事

在快速发展的过程中,FERYSTER公司非常注重企业文化的塑造。公司倡导“创新、协作、责任、卓越”的价值观,鼓励员工勇于创新、敢于担当。同时,公司还注重员工的成长和发展,为员工提供各种培训和学习机会。这些措施使得FERYSTER公司成为了一个充满活力、积极向上的团队,为公司的发展提供了源源不断的动力。

问答坊 | AI 解惑

急需!!! 汽车电子方案!!!

急需!!! 电子技术研发设计开发方案!!! 急需!!! 方案!!! 公司拓展,急需方案,请拥有方案或部分技术的公司和个人迅速与我联系, 邮箱 rdeasy@yahoo.cn 请注明公司全名或个人的姓,详细准确的联系方式和方案,否则不予考。 ...…

查看全部问答>

【藏书阁】最新低压开关柜二次线路设计安装准实务全书

目 录 第一篇 低压开关柜二次线路的设计安装、 运行维护总论 ( ) ………………… 第一章 配电网络和配电设备概述 ( ) ………………………………………………… 第二章 配电变压器的设计安装、 运行维护 ( ) …………………………………… ...…

查看全部问答>

TI关于DC-DC电源芯片有哪些呀

TI关于DC-DC电源芯片有哪些呀 还能提供一些完整的资料吗    集思广益 谢谢大家…

查看全部问答>

问大家关于串口通讯的问题

我做一个232的通讯,希望传一个16进制数比如0XFE到PC,然后PC端通过DELPHI写的程序能读出这个16进制数.哪位有这个例子,PC端怎么读(是通过自己写程序,还是有现成的调试工具)我到现在还不知道呢,哪位讲下啊…

查看全部问答>

急,coredll.dll 这个文件无法找到。。。

请问各位 coredll.dll 这个文件是发在哪个里面,搜遍了整个硬盘也无法找到。。。 急啊。…

查看全部问答>

就我个人经历,大家在无线选型上常会有的一些误区:

就我个人经历,大家在无线选型上常会有的一些误区: 1,通信速率,比如很多公司是这样宣传的NRF2401速率是1MBPS,    但,实际上这只是发射速率,而实际真正完成一次发送速率需要涉及到具体的功能,因为功能越复杂,完成一次数据采集的 ...…

查看全部问答>

急需熟悉uCOS的高手,有报酬

所在公司的一个项目,比较类似于手持gps。 大致上硬件环境就是FPGA的开发板,Altera的2c系列,采用nios的软核cpu。 开发环境就是NIOSII 6.1,c语言。 具体要实现的具体功能已经部分有一些代码,测试功能用。 现在想加操作系统,需要高手帮忙。 ...…

查看全部问答>

请教电子锁问题

想用51做一个电子锁,但是不知道怎么做。希望各位大虾给些思路,最好附上电路图什么的。。…

查看全部问答>

请教144脚FSMC的问题

我现在要接2片8位的SRAM,没有其他用外总线的器件,请问我现在的接法对不对 CPU                  SRAM1 D0-D7              ...…

查看全部问答>

【论文】基于zigbee的无线红外防盗报警系统设计

内容摘要: 结合红外防盗报警和ZigBee技术这两大热点课题,利用TI公司的单芯片CC2430和RE200B红外传感器,完成了基于ZigBee技术无线红外防盗报警系统的硬件设计和软件开发,解决了现有无线报警系统存在的误报警,成本高等问题。经过对系统的硬件软件电 ...…

查看全部问答>