打印
[STM32F1]

读写Flash里面的数据问题

[复制链接]
239|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zhanghqi|  楼主 | 2022-5-13 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
芯片型号: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个字节开始还原测试配置参数,直接从起始地址还原不行吗?

使用特权

评论回复
沙发
stly| | 2022-5-13 23:05 | 只看该作者
这样不是浪费20个字节存储空间吗?

使用特权

评论回复
板凳
zhanghqi|  楼主 | 2022-5-13 23:07 | 只看该作者
还是他这样做另有什么考虑?   

使用特权

评论回复
地板
zwll| | 2022-5-13 23:09 | 只看该作者
会不会跟你自己写入数据的数据结构有关?

使用特权

评论回复
5
stly| | 2022-5-13 23:11 | 只看该作者
你可以稍微简化下,随便写几个半字数据到指定的地址自行验证下。

使用特权

评论回复
6
pengf| | 2022-5-13 23:14 | 只看该作者
你看一下para_buf的定义,看看前20个字节是干嘛用的就知道了。

使用特权

评论回复
7
zhanghqi|  楼主 | 2022-5-13 23:16 | 只看该作者
我简化了数据结构(就2个char 变量了)
程序运行稳定后,我修改para_buf[0]到para_buf[19]值都为1,写入flash,再读出来都是1,

使用特权

评论回复
8
jlyuan| | 2022-5-13 23:19 | 只看该作者
但是,当我断电重启的时候,para_buf[0]到para_buf[3]都是255,para_buf[4]到para_buf[19]
都是1,怎么会这个样子?

使用特权

评论回复
9
zhanghqi|  楼主 | 2022-5-13 23:22 | 只看该作者
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

使用特权

评论回复
10
wyjie| | 2022-5-13 23:24 | 只看该作者
强烈建议你结合FLASH编程手册 和 相关例程,减少盲目性。

使用特权

评论回复
11
wuhany| | 2022-5-13 23:26 | 只看该作者
比方开锁 写数据 结束检查等基本流程。

使用特权

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

使用特权

评论回复
13
zhanghqi|  楼主 | 2022-5-14 19:22 | 只看该作者

搞定了,呵呵,犯了低级错误……

使用特权

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

本版积分规则

852

主题

11757

帖子

5

粉丝