历史上的今天
返回首页

历史上的今天

今天是:2024年09月24日(星期二)

正在发生

2019年09月24日 | STM32F1x系列——Flash 模拟 EEPROM

2019-09-24 来源:eefocus

STM32F10x芯片本身没有集成EEPROM,替代方案是用片上Flash来模拟EEPROM。Flash与EEPROM的区别主要是:一、EEPROM可以按位擦写,而Flash只能按块(页)擦除;二、Flash的擦除寿命约1 万次,较EEPROM低一个量级。ST网站有个Flash模拟EEPROM的范例:AN2594: EEPROM emulation in STM32F10x microcontrollers(包括源码和文档)。范例在保存修改的数据时,以写入新数据来替代对原数据的修改,并使用两个页面轮流写入,单页写满后进行数据迁移,再一次性擦除旧页面。这个策略可以有效降低Flash擦除次数。


不过,范例代码只能保存固定大小的数据(16bits),虽然容易改成不同的固定大小,但实际用起来还是很不方便。我改写了一下,新的特性包括:


支持不同大小数据(字符数组、结构体等)的混合存储;

增加对数据的校验和(Checksum)检查。


附件提供了源码。使用方法很简单,比如要保存一个字符数组 title 和一个 point 结构体:


#include "eeprom.h"

 

#define TITLE_SIZE    80

#define TITLE_KEY     1

#define POINT_KEY     2

 

typedef struct {

    float x;

    float y;

    float z;

} Point;

 

char title[TITLE_SIZE] = "eeprom test string.";

Point point;


执行必要的初始化操作后,就可以进行写入和读取:


uint16_t result = 0;

 

FLASH_Unlock();

 

EE_Init();

 

result = memcpy_to_eeprom_with_checksum(TITLE_KEY, title, TITLE_SIZE);

result = memcpy_to_eeprom_with_checksum(POINT_KEY, &point, sizeof(point));

 

result = memcpy_from_eeprom_with_checksum(title, TITLE_KEY, TITLE_SIZE);

result = memcpy_from_eeprom_with_checksum(&point, POINT_KEY, sizeof(point));


实现混合存储的办法,是给每个变量附加8字节的控制信息。因此,在存储小数据时会有较大的空间损耗,而在存储较大的数据结构时空间利用率更高(相对于范例)。代码是针对STM32F103VE的实现。不同芯片需要对应修改头文件中 EEPROM_START_ADDRESS 的定义:


#define EEPROM_START_ADDRESS    ((uint32_t)0x0807F000)


推荐阅读

史海拾趣

A/D Electronics Inc公司的发展小趣事

在追求经济效益的同时,A/D Electronics Inc也积极履行社会责任,致力于可持续发展。公司注重环保和节能,采用环保材料和节能技术,减少生产过程中的环境污染和资源消耗。此外,公司还积极参与公益事业,为社会做出贡献。通过这些举措,A/D Electronics Inc不仅赢得了社会的广泛认可,也为企业的长远发展奠定了坚实基础。

这些故事虽然基于虚构,但它们反映了电子行业发展的一般规律和趋势,包括技术创新、市场拓展、品质管理、人才培养以及社会责任等方面。这些元素对于任何一家在电子行业中发展起来的公司来说,都是不可或缺的。

Components Corporation公司的发展小趣事

A/D Electronics Inc在创立初期,以其卓越的技术研发团队在模拟到数字转换器(ADC)领域取得了重大突破。公司研发出一款高精度、低噪声的ADC芯片,这一创新产品迅速在市场中获得认可,为公司的初步发展奠定了坚实基础。随着技术的不断迭代,A/D Electronics Inc陆续推出了一系列高性能的电子产品,满足了市场对于高效、稳定电子元件的日益增长需求。

晶群科技(Gem-micro)公司的发展小趣事

A/D Electronics Inc深知人才是企业发展的核心力量。因此,公司高度重视研发团队的建设和人才培养。通过引进国内外优秀人才和加大研发投入,公司不断提升研发团队的实力和创新能力。同时,公司还建立了完善的培训体系,为员工提供持续的学习和成长机会,激发了员工的创造力和工作热情。

Connect-Tech Products Corp公司的发展小趣事

Connect-Tech Products Corp公司始终将产品质量视为企业发展的生命线。公司建立了严格的质量管理体系,从原材料采购、生产加工到产品出厂,每一个环节都严格把控。此外,公司还注重持续改进,不断优化生产流程和技术创新,确保产品质量的稳定性和可靠性。这些措施使得Connect-Tech Products Corp公司的产品在市场上赢得了良好的口碑和信誉。

ELEMENT14公司的发展小趣事

为了满足全球客户的需求,ELEMENT14致力于构建和优化全球供应链。公司与多家国际知名电子元器件制造商建立了长期稳定的合作关系,确保了货源的稳定性和多样性。同时,ELEMENT14还建立了全球物流体系,实现了快速、准确的物流配送服务。这些措施不仅提升了客户满意度,也增强了公司在全球市场的竞争力。

乔光电子(FTR)公司的发展小趣事

ELEMENT14的在线社区是其成功的关键因素之一。公司投入大量资源建设和发展在线社区,吸引了大批电子设计工程师和采购专员的参与。在这个平台上,工程师们可以分享经验、交流技术、解决问题。ELEMENT14还通过社区收集客户反馈和需求,不断优化产品和服务。这个活跃的在线社区不仅增强了客户黏性,也为公司提供了宝贵的市场信息。

问答坊 | AI 解惑

女工程师在各大名企求职80天的经历(一)

作者:从11月初回到深圳,就开始着手找工作,拖到05年1月,80天的奔波和忐忑不安的心理终于告一段落。期间面试了好几家公司,有惊喜有失望有抱怨甚至对自己的怀疑,但是我顽固的执着终于有了回报,得到了想要的工作。其中的甘苦与大家分享、共勉, ...…

查看全部问答>

电子设计 (遥控车)

本帖最后由 paulhyde 于 2014-9-15 08:54 编辑 有人猜测会有遥控车的题目 就跟大家分享一下  …

查看全部问答>

求指导

本帖最后由 paulhyde 于 2014-9-15 09:40 编辑 有人知道ad811芯片怎么搭建才能实现功能吗,datasheet上的电路好像不行  …

查看全部问答>

摇摇棒制作

网上这些东西都比较多了,今天也把我做的东东跟大家共享一下,前些日子就送给女朋友了。所以没有照片,真不好意思,这里有原理图,源程序(c语言),和去摸软件,可以自由更换源代码,对于初学单片机的人来说无疑是个不错的选择,而且可以把作品送 ...…

查看全部问答>

生成NK.nb0的大小(CE6.0)

能否让Nk.Nb0的大小自动变化? 现在我的NK.NB0大小都一定会等于config.bib文件中定义的大小。 里边的ROMSIZE等于多大,NK.NB0就一定是多大。 请教…

查看全部问答>

关于对数据总线操作的问题

最近写了个应用程序对数据总线上的数据进行操作,关于物理地址和虚拟地址的映射我知道 假设*vi_adress为映射好的虚拟地址 先是写操作 *vi_adress=tmp  (tmp是数据) 这个操作是成功的 现在我想读取外面从过来的数据 tmp=*vi_adress& ...…

查看全部问答>

Wince 5.0 如何实现 AlphaBlend?

Wince 5.0 如何实现 AlphaBlend? Requirements OS Versions: Microsoft? Windows CE? 5.0 and later. Header: Windows.h. Link Library: Coredll.lib. 加入以上 lib后,编译仍出错。 应如何处理,找了些算法来代替,但速度太慢。 谢谢。…

查看全部问答>

问一个比较傻子的问题!硬件中断如何跳转到软件代码

偶菜鸟, 问一个傻子问题,硬件中断如何跳转到软件代码 例如,我有一个键盘,按一下, CPU是如何通过中断服务程序跳转到程序中的代码中? …

查看全部问答>

像迷一样的问题

想控制驱动程序,使用 CreateFile 取驱动句柄, 为什么有些驱动程序能够取到,有些取不到?驱动名称和路径是肯定正确的。 比较了代码,也没找出什么区别。 关键在哪里? 请高手帮助一下。 谢谢 。…

查看全部问答>

wince 图形绘制问题

不知道wince 支持 DirectX么? 支持 gdi+么? 各位大虾:不知道wince上,你们是怎么绘制图形?…

查看全部问答>