设备运行参数,需要保存到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条评论)
登录后参与讨论