对stm32偏上flash的管理是一个很费劲的工作,尤其是写入数据较多时,需要创建大量的偏移量、缓存量等辅助变量。使用轻型、微型数据库可以有效解决这个问题。
我使用ArmInk大佬的EasyFlash数据库来管理stm32 片上flash。
gitee链接:https://gitee.com/Armink
EasyFlash很轻型,基本不增加RAM占用,增加少量FLASH占用,移植难度较低。
EasyFlash的移植工作由以下几部分组成:
1,gitee(github也可以,但gitee访问速度更快)上拉取最新EasyFlash源码:
我们需要inc、port、src3个文件夹,放在keil工程目录内
2,keil工程内增加引用路径:inc文件夹,工程内添加下图所示4个文件,需要使用EasyFlash的文件增加引用头文件:easyflash.h
3,移植工作还需要修改如下两个文件:
其中ef_port文件中包括flash的读取与擦除函数,需要我们自己实现;ef_cfg文件中包含重要的宏定义,需要自己设置。
3.1,ef_port:
第一点,需要给default_env_set数组增加一个内容。如果它是空的,easyflash会卡死在初始化函数
第二点,需要完善easyflash的读、写、擦除函数:
easyflash还支持诸如调试信息打印、调试日志输出等功能,篇幅所限只讨论flash数据库功能
3.2 ef_cfg文件
如果easyflash文件添加、包含路径添加后进行编译,会出大量错误与警告,原因是ef_cfg中几个核心宏定义未被赋值
对于hal库工程,已经定义好了flash_page_size,并且与所用stm32型号吻合,不需要查找datasheet再填入1024/2048之类,直接写flash_page_size就好;对于片外flash,需要阅读datasheet,这里只讨论片上flash
ef_start_addr是片上flash开始使用的地址,在flash_Page_size = 1024的情况下图片中代表从80kb位置开始,到128kb截止(我使用的mcu flash为128kb。
4,最后,增加初始化函数就可以使用了,如下图:
easyflash核心是
和
一个负责读,一个负责写。
第一个参数是关键字,第二个是读写变量的地址,第三个为读写变量的大小,一定要与变量大小完全一致,不然可能会覆盖相邻变量,第四个为返回变量在flash中实际大小,我没有用到,null了。
写入函数的value值为null时表示删除,详情可以看easyflash的说明文档,还是很全面的。 |