本帖最后由 rindy 于 2017-9-2 11:53 编辑
假如有这样一个结构体数组,怎么存入flash呢,并且原样读写出来,之前只写过一些简单变量的存储与读写操作,不知道结构体怎么操作
struct User
{
char user_physical[20];
char user_custom[20];
char user_pa[20];
char user_flag;
};
struct User user1[60];//添加60条数据,现在要把这60条结构体数据存放到flash需要怎么操作?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
感觉你对指针的理解不是很够哦。你怎么说也是一个太阳了。
如另外一个老铁和你说的。flash操作都是页操作或者块操作。不过底层也是一个个字节写入的,(可以参考以下原子哥的EEPROM来理解一下)。这种函数的接口往往给的是buff,但是如果是结构体呢?其实用强制转换就可以了。
可以这么理解,结构体里面有u8、u16、u32的和数组的各种类型的。但是最基本的还是u8
如果你flash里面存的数据刚好每一个字节都是和我的结构体对齐,那么数据就不会乱的。
也就是你按什么类型存的,到时候按什么类型来取就可以了。(地址对齐)
举例说明。flash地址0到6 你存的是 0x11 0x22 0x33 0x44 0x55 0x66 0x77
(特别记住:这7个字节可以是任意类型拆分存进来的)
不同的取法,会得到不同的值。
如果你按照u8来去 那么打印的就是7个字节
如果你按照 u16来取 那么打印的就是0x1122 0x3344 0x5566 0x77??(注意大小端)
u32你自己想咯
这个又怎么理解呢? u8 buff[7]={0x11,0x22,0x33,0x44,0x55,0x66,0x77};
u16 *p; p=(u16 *)buff; printf("0x%04x ",*p++); 这个循环3次就越界了。
用共用体来解决存储的问题。很简单
[mw_shl_code=c,true]typedef union User {
struct{
char user_physical[20];
char user_custom[20];
char user_pa[20];
char user_flag;
}Source;
char all[20+20+20+1];
}USAER;
USAER user[10];
user.all[0][0] =1;
printf("%d ",user.Source.user_physical[0]);[/mw_shl_code]
输出结果是1所以只需要写入共用体的user.all,这样就能把结构体写入了。
共用体的内存空间是共享的,反正就当一个数组读取存储就可以了。
大虾,这块内容确实自己不怎么扎实(主要之前用得少),这次遇到实际问题了(这次一定要把这块内容啃精了),自己现在也在看这方面的内容,我自己现在是这样一个思路,您看行不行,现在不是struct User user1[60]; 我定义一个指向结构体数组的指针p,开始地址就是user1[60]的首地址,然后通过这个函数来存入flash,您觉得可以吗
void flashWriteSysData(User *p)//传进来的p已经指向了user1[60]的首地址
{
u8 i = 0;
u8 temp = 0;
for(i=0;i<60;i++)//总共循环60次,因为有60个元素
{
for(j=0;j<61;j++)//一个结构体数组元素占61(20+20+20+1)个字节
{
//这里就是将每个元素的61个字节依次写入到flash中
memcpy(&temp, *((uint8_t *)p+j), 1); //从当前指针指向的结构体元素所在内存中拷贝一个byte
FLASH_ProgramByte(SYS_DATA_ADDR,temp); //写入这个byte
SYS_DATA_ADDR=SYS_DATA_ADDR+2; //stm32的flash地址必须是2的倍数
}
p++;
}
}
貌似不错的样子
我在确认一下给你答复,不然,误人子弟了。
一周热门 更多>