使用STD库–en.stm32f0_stdperiph_lib_v1.6.0。
用Flash存储数据的传统方式是为每个数据分配固定的存储地址,由于Flash在进行写操作时需要先擦除数据所在的整个扇区,对一个数据进行写操作便会造成对扇区内其他数据的擦除,由于擦除操作耗时较长,不仅效率低,影响嵌入式系统的实时性,而且为了避免丢失其他数据需要相当复杂的处理,对MCU的RAM空间也有一定的要求
如果写入数据失败,会造成所写入数据的丢失,如果在擦除扇区后发生掉电,便会造成扇区内所有数据的丢失
不仅如此,由于每次写入操作都需要先擦除扇区,以擦除次数表征的Flash使用寿命也无法满足产品生命周期的要求.
1.需求背景
很多时候我们需要将程序中的一些参数、数据等存储在EEPROM或者Flash中,达到掉电保存的目的。但有些情况下,程序需要频繁的修改这些参数,如果每次修改参数都进行一次保存,那将大大降低存储器的寿命。尤其是单片机内部Flash,以STM32F030C8T6为例,擦写寿命只有1000次。当然,这是最小值,实际可能比这个多,但也是有风险。
a.掉电保存快/异常可恢复,数据库不被破坏
b.flash读写均衡效果好,寿命长
c.读写速度快
d. ROM RAM占用资源少
2.数据库设计思路
在当前的实际开发实践活动中,数据往往是存储在FLASH固定地址空间的,当数据被频繁更新时,由于FLASH需要先擦除后编程,所以数据每更新一次都会导致FLASH的P/E寿命损耗一次。
为了解决该问题,可以在每次写入数据时都对数据存储地址进行一次动态调整,使每次写入位置都分布于FLASH的空闲区域中,这样可以明显减少擦写操作的执行次数,从而延长FLASH使用寿命。
使用FLASH上的一个或多个sector进行组合,得到一个可用的存储空间,再将该存储空间划分为若干个block,就得到了由若干个 block连在一起组成的队列,每次写入数据时就从队列中抽取一个空闲block用于保存数据,每次读出数据时就从队列中找到最近一次抽取的block并将其中数据读出。
2.1 主要步骤可以如下:
1.将sector组合成存储区
2.每个sector划分为若干个block
3.经过第1、2两步可得到一个以block为最小存储单元的存储区
4.需要在block队列中找可用位置时,基本算法是通过序号进行检索,从第一个sector的第一个block开始向后依次查找block的序号,使用过的block其序号会是一个累加值,未使用过的block其序号是 0xFFFFFFFF,这样通过判断序号是否为0xFFFFFFFF就可以找到最新 block的位置。
5.写入数据时,从头遍历block的序号,找到第一个序号是0xFFFFFFFF的 block,该block就是可以写入的存储单元,将block的序号加一后连同数据一起写入。
6.读取数据时,从头遍历block的序号,找到第一个序号是0xFFFFFFFF的 block,该block的前一个block就是可以读取的存储单元。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新