原创 EEPROM 中存入不同格式数据

2020-12-21 14:59 5400 25 4 分类: MCU/ 嵌入式 文集: STM32 软件

    设备运行参数,需要保存到EEPROM中。运行参数数据类型不确定,有可能正负,也有可能不同长度。而EEPROM只能字节寻址。

不同编译器,数据类型的表示方法各异,且字节位置也会有区别。做字节转换会不通用。可以使用定义联合体的办法解决。

将需要存储的数据定义一个结构体,如下。参数可以任意数据类型,最后增加一个校验合字节,用于检查数据正确性。

typedef struct{

  int16_t Kx;   //参数 1

  int16_t Ky;   //参数 2

  int16_t X0;   //参数 3

  int16_t Y0;   //参数 4

  uint8_t cs;   //校验合

}stTPParaTypeDef;

#define PARALEN 9  // 上述结构体包含的字节数,可以用 sizeof(stTPParaTypeDef) 但有可能会出错。

定义一个联合体,联合体成员为参数结构及一个与参数结构等长的字节数组。

typedef union{

  stTPParaTypeDef tp;

  uint8_t tpbyte[PARALEN];

}unTPParaTypeDef;

联合体中的结构和字节数组共用存储空间。

参数0

参数1

参数2

参数3

校验和

字节0

字节1

字节2

字节3

字节4

字节5

字节6

字节7

字节8

 

unTPParaTypeDef unTPPara;  // 定义一个全局参数联合体

 

需要保存参数时,先计算联合体内的字节数组校验合,然后把整个字节数组写到EEPROM

uint8_t SaveTPSetting(void){

  uint8_t i,cs=0;

  cs = 0;

  for(i = 0;i<(PARALEN-1);i++){

    cs += unTPPara.tpbyte;

  } 

  unTPPara.tp.cs = 0xFA - cs; 

  AT24C64_WriteBytes(TPPARAADDR,unTPPara.tpbyte,PARALEN);

  return 1; 

}

 

需要获取数据时,按字节从EEPROM中读出相应长度的字节,放入联合体的字节数组中。并计算校验合,判别数据是否有效。

uint8_t GetTPSetting(void){

  uint8_t i,cs = 0;

  AT24C64_ReadBytes(TPPARAADDR,unTPPara.tpbyte,PARALEN);

  for(i = 0;i

    cs += unTPPara.tpbyte;

  }

  if(cs != 0xFA)

    return 0;

  else 

    return 1;

}

这种方法,让编译器做字节对齐。简单方便不会出错。

作者: southcreek, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-408807.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
25
关闭 站长推荐上一条 /2 下一条