硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5540|回复: 5
收起左侧

[客户分享] STM32内部Flash实现EEPROM功能

[复制链接]

4

主题

64

回帖

76

积分

初级会员

积分
76
发表于 2019-11-16 14:09:33 | 显示全部楼层 |阅读模式
在需要存储不多的参数的时候,内部flash会很方便。但是,如果没有比较好的方法,会导致对flash的频繁擦写,不利于内部flash的寿命。
出于这种目的,使用一种能够循环存储的方法是很有必要的。
通常我的工程会出现两种参数需要保存,一种是设备参数等这种和应用相关的,另一种是和IAP相关的。
F4及以上MCU的扇区都很大,所以通常一块扇区就可以循环存储很多次数据了,如果把这两种数据分两个扇区则会很浪费。所以我参考堆栈的方式,让比较频繁读写的应用参数正向增长,比较少读写的IAP参数逆向增长,让它们共用一块扇区。
然后,参数是不支持动态调整大小的,一旦参数定下来了,就必须一直按照这种格式来操作。如果要更换参数大小,当前做法是下载器编程的时候选择全片擦除,没有去试直接改。
通过几个读写指针来记录读写的位置,利于提高性能,这在我之前的版本里是没有加入的(每次操作都要全扇区查找,但实际感觉还不算慢)。
工程用的测试板是ST官方的stm32f4-discovery板,使用keil 5.28a下的RTE环境建的工程。
欢迎大家试用,反馈意见

F4flash.zip

3.18 MB, 下载次数: 157

评分

参与人数 1金币 +50 收起 理由
eric2013 + 50 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107462
QQ
发表于 2019-11-16 14:58:41 | 显示全部楼层
感谢楼主分享
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-11-16 17:45:23 | 显示全部楼层
这种方式适合没有什么更新频率的场合,像触摸校准参数,IP地址。

如果是频繁更新的,用铁电比较合适
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

64

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2019-11-16 18:07:50 | 显示全部楼层
byccc 发表于 2019-11-16 17:45
这种方式适合没有什么更新频率的场合,像触摸校准参数,IP地址。

如果是频繁更新的,用铁电比较合适

内部flash擦除操作是比较耗时的,会给保存时间带来不确定性。但正是因为这种限制(自身特点),加上内部flash操作的便捷性,对于普通参数的保存还是非常友好的。
回复

使用道具 举报

36

主题

2040

回帖

2148

积分

至尊会员

积分
2148
发表于 2019-11-16 18:41:43 | 显示全部楼层
这种方式最大的安全隐患就是掉电问题,如果你在擦除或者更新参数时,发生了掉电,就比较悲催。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

4

主题

64

回帖

76

积分

初级会员

积分
76
 楼主| 发表于 2020-7-21 21:24:51 | 显示全部楼层
发现程序中有错误,更新一下关键的两个文件

bsp_flash_eeprom.c

17.42 KB, 下载次数: 50

bsp_flash_eeprom.h

4.06 KB, 下载次数: 36

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-2 06:15 , Processed in 0.180683 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表