我调用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的时候直接读写结构体是可以的啊
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
__packed关键字修饰下,再试试.
---------------------------------
原子哥,
你看看这里是不是有问题
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)
都编译报错, 改咋办
---------------------------------
传送的是:g_hAssemblyTestVar[0].Method的地址
---------------------------------
默认是u32类型的
强制转换为u8*类型,否则MDK会报警告。
一周热门 更多>