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

2019-07-21 04:55发布

我调用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.1UtilitiesSTM32_EVALSTM3240_41_G_EVAL里的stm324xg_eval_i2c_ee.c
请问这是哪里问题

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

 
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
wang12zhe
1楼-- · 2019-07-22 05:56
回复【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,估计是没写进去
wang12zhe
2楼-- · 2019-07-22 07:16
回复【8楼】正点原子:
---------------------------------
谢谢;我试试
wang12zhe
3楼-- · 2019-07-22 11:07
回复【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); 
}

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

难道不能一次性存储整个结构体?
正点原子
4楼-- · 2019-07-22 16:58
 精彩回答 2  元偷偷看……
wang12zhe
5楼-- · 2019-07-22 22:43
回复【11楼】正点原子:
---------------------------------
这是开发板光盘例程吗? 哪个例程
正点原子
6楼-- · 2019-07-23 02:48
回复【12楼】wang12zhe:
---------------------------------
这是F4板子的代码,没有发布还,你就参考下就是了.

一周热门 更多>