atm32怎么方便的将一个结构体存入flash并且原样读写出来

2019-08-14 03:42发布

本帖最后由 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需要怎么操作?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
14条回答
aiyeba
1楼-- · 2019-08-14 23:16
rindy 发表于 2017-9-2 12:06
嗯嗯,就是再想问一下用你这种方式读出来的时候都存放到一个buf中,那怎么一次给结构体赋值呢,因为结构 ...

感觉你对指针的理解不是很够哦。你怎么说也是一个太阳了。

如另外一个老铁和你说的。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次就越界了。








aiyeba
2楼-- · 2019-08-15 04:55
 精彩回答 2  元偷偷看……
hstar
3楼-- · 2019-08-15 07:37
本帖最后由 hstar 于 2017-9-2 15:50 编辑

用共用体来解决存储的问题。很简单
[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,这样就能把结构体写入了。

共用体的内存空间是共享的,反正就当一个数组读取存储就可以了。
rindy
4楼-- · 2019-08-15 09:12
本帖最后由 rindy 于 2017-9-2 16:54 编辑
aiyeba 发表于 2017-9-2 14:31
感觉你对指针的理解不是很够哦。你怎么说也是一个太阳了。

如另外一个老铁和你说的。flash操作都是页 ...

大虾,这块内容确实自己不怎么扎实(主要之前用得少),这次遇到实际问题了(这次一定要把这块内容啃精了),自己现在也在看这方面的内容,我自己现在是这样一个思路,您看行不行,现在不是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++;
  }
}




rindy
5楼-- · 2019-08-15 11:14
hstar 发表于 2017-9-2 15:46
用共用体来解决存储的问题。很简单
[mw_shl_code=c,true]typedef union User {
    struct{

貌似不错的样子
aiyeba
6楼-- · 2019-08-15 13:25
rindy 发表于 2017-9-2 16:06
大虾,这块内容确实自己不怎么扎实(主要之前用得少),这次遇到实际问题了(这次一定要把这块内容啃精了 ...

我在确认一下给你答复,不然,误人子弟了。

一周热门 更多>