打印
[STM32F1]

读写Flash里面的数据问题

[复制链接]
662|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
maxwellfairy|  楼主 | 2020-5-11 09:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 maxwellfairy 于 2020-5-11 09:40 编辑

芯片型号:STM32F103RCT

把程序的一些初始化配置参数保存到Flash里面,起始地址是0x0801 F000,读Flash代码如下:
ReadFlashNBtye(0, para_buf, sizeof(para_buf));
//从起始地址读取N个字节数据,保存到para_buf里面(u8 para_buf[260])
memcpy(&test_config, para_buf+20, sizeof(t_test_config));
//开始还原测试配置参数

写Flash代码如下:
memcpy(para_buf+20, &test_config, sizeof(t_test_config));        
EEPROM_write_n(STARTADDR, para_buf, sizeof(para_buf));

问题:为什么要往后移动20个字节开始还原测试配置参数,直接从起始地址还原不行吗?
        这样不是浪费20个字节存储空间吗?还是他这样做另有什么考虑?        
求大神解惑。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

使用特权

评论回复
沙发
香水城| | 2020-5-11 15:08 | 只看该作者
会不会跟你自己写入数据的数据结构有关?

你可以稍微简化下,随便写几个半字数据到指定的地址自行验证下。

使用特权

评论回复
板凳
diweo| | 2020-5-11 15:27 | 只看该作者
你看一下para_buf的定义,看看前20个字节是干嘛用的就知道了。

使用特权

评论回复
地板
maxwellfairy|  楼主 | 2020-5-11 15:54 | 只看该作者
本帖最后由 maxwellfairy 于 2020-5-11 15:56 编辑
香水城 发表于 2020-5-11 15:08
会不会跟你自己写入数据的数据结构有关?

你可以稍微简化下,随便写几个半字数据到指定的地址自行验证下。 ...
我简化了数据结构(就2个char 变量了)
程序运行稳定后,我修改para_buf[0]到para_buf[19]值都为1,写入flash,再读出来都是1,
但是,当我断电重启的时候,para_buf[0]到para_buf[3]都是255,para_buf[4]到para_buf[19]
都是1,怎么会这个样子?

使用特权

评论回复
5
maxwellfairy|  楼主 | 2020-5-11 16:06 | 只看该作者
diweo 发表于 2020-5-11 15:27
你看一下para_buf的定义,看看前20个字节是干嘛用的就知道了。

u8 para_buf[260];就是一个字符数组,
前面20个字节没有写入任何东西,也没有从中读取任何数据。
可以看下面搜索结果:
Searching for 'para_buf'...
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(30) :         ReadFlashNBtye(0, para_buf, sizeof(para_buf));
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(31) :         memcpy(&test_config, para_buf+20, sizeof(t_test_config));
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(32) :         memcpy(&B_mark_ring, para_buf+20+sizeof(t_test_config), sizeof(B_mark_ring));       
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(33) :         memcpy(&B_mark_burst,para_buf+20+sizeof(t_test_config)+sizeof(B_mark_ring), sizeof(Benchmark));
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(34) :         memcpy(&test_iap,           para_buf+para_length-2, 1);
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(46) :         memcpy(para_buf+20, &test_config, sizeof(t_test_config));       
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(47) :         memcpy(para_buf+20+sizeof(t_test_config), &B_mark_ring, sizeof(B_mark_ring));
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(48) :         memcpy(para_buf+20+sizeof(t_test_config)+sizeof(B_mark_ring), &B_mark_burst, sizeof(B_mark_burst));
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(49) :         memcpy(para_buf+para_length-2,&test_iap, 1);
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\function.c(50) :         EEPROM_write_n(STARTADDR, para_buf, sizeof(para_buf));
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\flash_user.h(20) : extern u8 para_buf[para_length];
C:\Users\Administrator\Desktop\polieji_v4.0_0509\user\flash_user.c(8) : u8 para_buf[para_length];
Lines matched: 12      Files matched: 3      Total files searched: 69

使用特权

评论回复
6
香水城| | 2020-5-12 19:50 | 只看该作者
本帖最后由 香水城 于 2020-5-12 19:53 编辑
maxwellfairy 发表于 2020-5-11 15:54
我简化了数据结构(就2个char 变量了)
程序运行稳定后,我修改para_buf[0]到para_buf[19]值都为1,写入fla ...

强烈建议你结合FLASH编程手册 和 相关例程,减少盲目性。比方开锁 写数据 结束检查等基本流程。

使用特权

评论回复
7
wanduzi| | 2020-5-12 23:28 | 只看该作者
如果没有数据,那就可以不设置这个

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

8

帖子

0

粉丝