OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 13248|回复: 15

在EEPROM里存储结构体的问题,?????????

[复制链接]

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2014-8-10 15:32:33 | 显示全部楼层 |阅读模式
5金钱
我调用STM32F4库函数里的EEPROM读写函数向EEPROM里写数据

当写入u8型数组的时候
 for(i=0;i<30;i++)ReadTmp=i+1;

  sEE_WriteBuffer(ReadTmp, FRMODVAILDFLGADDR, 30); //写信息区
 tmp=30;
 for(i=0;i<30;i++)ReadTmp=0;
sEE_ReadBuffer(ReadTmp, FRMODVAILDFLGADDR, &tmp);  
   
写入和读出的数据相同,

但是当我写入结构体的时候,发现读出的数据不是我写入的,全部是0,应该是没读正确,
根据u8型数组的测试,可以断定读写函数没错

下面是我结构体的定义
typedef struct
{
 union ASSEMBLY_TEST_CMD cmd; //输出 控制命令
 union ASSEMBLY_TEST_INPUT input; //输入 控制命令
  u8 StartTest:1;//开始测试标志
    struct   //需要掉电保存的数据
    {
u8 TestMethod:2;//1—方式一,2-方式二  
u8   res         :5; //保留
u16 OpenTime;//门开齐后延时的时间
u16 CloseTime;//门关齐后延时的时间
u16 TestCNT; //测试次数上限
u16 Stallcnt; //堵转次数上限
    }Method;
 u16 u16_OpenCnt; //开门次数
 u16 u16_OpenFullCnt;//开门到位次数
 u16 u16_CloseCnt;//关门次数
 u16 u16_CloseFullCnt;//关门到位次数
 u16 u16_Close23cnt;//关门2/3次数 
 u16 u16_uStallCnt;  //堵转次数
 u8  uTestResault;
 u16 Step;            //测试步骤

 u16 ControllerNum;   //控制器号
 u8 tmp_cdfull;       //关门到位标志
 u8 tmp_odfull;        //开门到位标志
 u16 TestTimeCnt;      //测试时间变量                                           // };
 u16 DelayCheckTime;
 u16 CmdSwTimeCnt;
 u16 uSeqTimeCnt;
 u8 cSeqStep;

}ASSEMBLY_TEST_STRUCT;
//===============================================================================


#define ASSEMBLY_TEST_STRUCT_DEFAULTS {\
        0,\
         0,\
         0,\
         0,\
         0,\
         5000,\
         5000,\
         1000,\
         20,\
         0,\
         0,\
         0,\
         0,\
         0,\
         0,\
         0,\
         0,\
         0,\
         0,\
         0,\
         5000,\
         5000,\
         5000,\
         5000,\
         0,\
        }

ASSEMBLY_TEST_STRUCT g_hAssemblyTestVar[2] = {ASSEMBLY_TEST_STRUCT_DEFAULTS,ASSEMBLY_TEST_STRUCT_DEFAULTS}; 
  
 
下面是我的读写操作

sEE_WriteBuffer((uint8_t*)&(g_hAssemblyTestVar[0].Method), FRMODADDR,sizeof(g_hAssemblyTestVar[0].Method));    
sEE_ReadBuffer((uint8_t*)&(g_hAssemblyTe.Method), FRMODADDR, &tmp); 

 g_hAssemblyTe.Method的值和g_hAssemblyTestVar[0].Method不一样, g_hAssemblyTe.Method全是0,

我使用的读写函数是库里的函数,路径是STM32F4xx_DSP_StdPeriph_Lib_V1.0.1\Utilities\STM32_EVAL\STM3240_41_G_EVAL里的stm324xg_eval_i2c_ee.c
请问这是哪里问题

记得以前使用51的时候直接读写结构体是可以的啊

 

最佳答案

查看完整内容[请看2#楼]

[mw_shl_code=c,true]#define SAVE_ADDR_BASE 40 //保存校准参数 void TP_Save_Adjdata(void) { //保存校正结果! AT24CXX_WriteLenByte(SAVE_ADDR_BASE,*((u32*)&tp_dev.xfac),4); //保存x校正因素(将tp_dev.xfac的地址强制转换为u32类型,再取值) AT24CXX_WriteLenByte(SAVE_ADDR_BASE+4,*((u32*)&tp_dev.yfac),4); //保存y校正因素(将tp_dev.yfac的地址强制转换为u32类型 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-10 15:32:34 | 显示全部楼层
[mw_shl_code=c,true]#define SAVE_ADDR_BASE 40 //保存校准参数 void TP_Save_Adjdata(void) { //保存校正结果! AT24CXX_WriteLenByte(SAVE_ADDR_BASE,*((u32*)&tp_dev.xfac),4); //保存x校正因素(将tp_dev.xfac的地址强制转换为u32类型,再取值) AT24CXX_WriteLenByte(SAVE_ADDR_BASE+4,*((u32*)&tp_dev.yfac),4); //保存y校正因素(将tp_dev.yfac的地址强制转换为u32类型,再取值) AT24CXX_WriteLenByte(SAVE_ADDR_BASE+8,(u16)tp_dev.xoff,2); //保存x偏移量 AT24CXX_WriteLenByte(SAVE_ADDR_BASE+10,(u16)tp_dev.yoff,2); //保存y偏移量 AT24CXX_WriteOneByte(SAVE_ADDR_BASE+12,tp_dev.touchtype); //保存触屏类型 AT24CXX_WriteOneByte(SAVE_ADDR_BASE+13,0X0A); //标记校准过了 } //得到保存在EEPROM里面的校准值 //返回值:1,成功获取数据 // 0,获取失败,要重新校准 u8 TP_Get_Adjdata(void) { u8 temp; temp=AT24CXX_ReadOneByte(SAVE_ADDR_BASE+13);//读取标记字,看是否校准过! if(temp==0X0A)//触摸屏已经校准过了 { *((u32*)&tp_dev.xfac)=AT24CXX_ReadLenByte(SAVE_ADDR_BASE,4); //得到x校准参数(将tp_dev.xfac的地址强制转换为u32类型,再赋值) *((u32*)&tp_dev.yfac)=AT24CXX_ReadLenByte(SAVE_ADDR_BASE+4,4); //得到y校准参数(将tp_dev.xfac的地址强制转换为u32类型,再赋值) tp_dev.xoff=(short)AT24CXX_ReadLenByte(SAVE_ADDR_BASE+8,2); //得到x偏移量 tp_dev.yoff=(short)AT24CXX_ReadLenByte(SAVE_ADDR_BASE+10,2); //得到y偏移量 tp_dev.touchtype=AT24CXX_ReadOneByte(SAVE_ADDR_BASE+12); //读取触屏类型标记 if(tp_dev.touchtype)//X,Y方向与屏幕相反 { CMD_RDX=0X90; CMD_RDY=0XD0; }else //X,Y方向与屏幕相同 { CMD_RDX=0XD0; CMD_RDY=0X90; } return 1; } return 0; } [/mw_shl_code]
参考下我们的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-10 22:48:44 | 显示全部楼层
在结构体前面,加上
__packed关键字修饰下,再试试.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-11 09:04:36 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥,
你看看这里是不是有问题
sEE_WriteBuffer((uint8_t*)&(g_hAssemblyTestVar[0].Method), FRMODADDR,sizeof(g_hAssemblyTestVar[0].Method));    
sEE_ReadBuffer((uint8_t*)&(g_hAssemblyTe.Method), FRMODADDR, &tmp);

函数的第一个参数传递的是不是地址的地址?????
问题应该在这,但是我改成
(uint8_t*)(g_hAssemblyTestVar[0].Method)
(uint8_t)&(g_hAssemblyTestVar[0].Method)
都编译报错,  改咋办
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-11 18:55:02 | 显示全部楼层
回复【3楼】wang12zhe:
---------------------------------
传送的是:g_hAssemblyTestVar[0].Method的地址
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-11 21:20:50 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
(uint8_t*)&(g_hAssemblyTestVar[0].Method)传送的是:g_hAssemblyTestVar[0].Method的地址??
&(g_hAssemblyTestVar[0].Method)我知道是g_hAssemblyTestVar[0].Method的地址,
但是再强制转换一下就不懂了,

有没有在EEPROM里存储结构体的好文章 推荐一下  真的很迷茫啊
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-12 00:02:22 | 显示全部楼层
回复【5楼】wang12zhe:
---------------------------------
默认是u32类型的
强制转换为u8*类型,否则MDK会报警告。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-12 07:46:29 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
原子哥,
你就直接说这俩函数的参数怎么写好了,
sEE_WriteBuffer((uint8_t*)&(g_hAssemblyTestVar[0].Method), FRMODADDR,sizeof(g_hAssemblyTestVar[0].Method));    
sEE_ReadBuffer((uint8_t*)&(g_hAssemblyTe.Method), FRMODADDR, &tmp);

现在是读到的全部是0,估计是没写进去
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-13 14:09:17 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
谢谢;我试试
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-13 21:13:40 | 显示全部楼层
回复【8楼】正点原子:
---------------------------------
void TP_Save_Adjdata(void)
{
s32 temp;  
//保存校正结果!       
temp=tp_dev.xfac*100000000;//保存x校正因素      
    AT24CXX_WriteLenByte(SAVE_ADDR_BASE,temp,4);   
temp=tp_dev.yfac*100000000;//保存y校正因素    
    AT24CXX_WriteLenByte(SAVE_ADDR_BASE+4,temp,4);
//保存x偏移量
    AT24CXX_WriteLenByte(SAVE_ADDR_BASE+8,tp_dev.xoff,2);     
//保存y偏移量
AT24CXX_WriteLenByte(SAVE_ADDR_BASE+10,tp_dev.yoff,2);
//保存触屏类型
AT24CXX_WriteOneByte(SAVE_ADDR_BASE+12,tp_dev.touchtype);
temp=0X0A;//标记校准过了
AT24CXX_WriteOneByte(SAVE_ADDR_BASE+13,temp); 
}

你们也是把结构体各个成员存到临时变量,然后第一个个存储的,

难道不能一次性存储整个结构体?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-13 23:03:12 | 显示全部楼层
[mw_shl_code=c,true]//WM8978数据保存在:SYSTEM_PARA_SAVE_BASE+sizeof(_system_setings)之后 //读取WM8978数据 //wm8978dev:wm8978数据 void wm8978_read_para(_wm8978_obj * wm8978dev) { AT24CXX_Read(SYSTEM_PARA_SAVE_BASE+sizeof(_system_setings),(u8*)wm8978dev,sizeof(_wm8978_obj)); } //写入WM8978数据 //wm8978dev:wm8978数据 void wm8978_save_para(_wm8978_obj * wm8978dev) { OS_CPU_SR cpu_sr=0; OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断) AT24CXX_Write(SYSTEM_PARA_SAVE_BASE+sizeof(_system_setings),(u8*)wm8978dev,sizeof(_wm8978_obj)); OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断) }[/mw_shl_code]
结构体的.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-14 20:19:20 | 显示全部楼层
回复【11楼】正点原子:
---------------------------------
这是开发板光盘例程吗? 哪个例程
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-14 23:41:17 | 显示全部楼层
回复【12楼】wang12zhe:
---------------------------------
这是F4板子的代码,没有发布还,你就参考下就是了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-14 23:41:34 | 显示全部楼层
战舰板有类似代码,比如VS1053设置的保存.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
 楼主| 发表于 2014-8-18 19:33:31 | 显示全部楼层
回复【14楼】正点原子:
---------------------------------
实在是……  没找到
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2014-8-19 00:29:47 | 显示全部楼层
回复【15楼】wang12zhe:
---------------------------------
综合实验。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 22:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表