基于嵌入式MCU数据Flash的数据存储及管理方法研究与实现
具体应用
本文引用地址:https://www.eepw.com.cn/article/170167.htm在笔者开发的电动汽车仪表盘中,需要存储总里程、小计里程、电机故障等信息,按照前文所述的方法,首先建立数据分区,为每个数据条目建立ID,该ID同时可表征数据状态字:
ID=1,对应电机故障,大小为1个字节;
ID=2,对应总里程,大小为4个字节;
ID=3,对应小计里程,大小为2个字节;
各数据条目在分区内的格式如下:
分区状态字Status_word(1个字节)+电机故障ID(1个字节)+电机故障(1个字节)+总里程ID(一个字节)+总里程(4个字节)+小计里程ID(1个字节)+小计里程(2个字节);
经计算,实际存储需求为11个字节,为了计算的方便,设定分区大小为2的幂,选为16;MC9S12HY32内置数据Flash的扇区大小为256个字节,为了保证掉电不丢失数据,必须占用至少两个扇区,根据公式(1),分区个数选定为32。数据Flash可擦写次数为10万次,在每次数据写操作都会引起数据分区轮转的最坏情况下,数据可擦写次数为10万*32=320万次,大于EEPROM的可擦写100万次的使用寿命,可以满足产品生命周期要求。
如前文所述,在进行数据读/写操作时,首先通过数据条目ID进行偏移地址查表,计算数据在分区内的相对地址,其实现函数如下:
uint16_t GetDataAddrFromItsId(uint16_t data_id)
{
uint16_t addr;
if(EE_MOTOR_ERR == data_id){
addr = EEPROM_START + 1;
}else if(EE_MILES_TOTAL == data_id){
addr = EEPROM_START + 3;
}else if(EE_MILES_RELATIVE == data_id){
addr = EEPROM_START + 8;
}else{
addr = EEPROM_START; /* not valid data id,so give unvalid addr */
}
return addr;
}
EE_MOTOR_ERR、EE_MILES_TOTAL、EE_MILES_RELATIVE即表示数据条目ID的宏。
在行车过程中,当小计里程改变时,不仅在液晶屏上实时更新小计里程数据,同时需要把更新后的小计里程写在数据Flash中,其具体函数如下:
void MilesRelativeStore(void)
{
if(Miles_relative != Miles_relative_stored){
(void)WriteEeprom(EE_MILES_RELATIVE,&Miles_relative,sizeof(Miles_relative));
Miles_relative_stored = Miles_relative;
}
}
由上述函数可见,应用本专利所设计方法,可以屏蔽底层实现细节,提供给应用层简单、清晰、和EEPROM一样简便的接口。
结语
本文从Flash特性出发研究并实现一种高效的数据存储及管理方法,其实现层面实现与EEPROM同样的应用接口,具有很高的使用价值,同时有效利用了MCU的内部资源,提高了MCU Data Flash的使用寿命,使之可以满足产品生命周期要求,并节约了产品的BOM成本,所设计方法在笔者设计的汽车仪表盘中得到实际应用和长时间验证,运行效果良好,具有很好的实用价值。
参考文献:
[1] 刘会忠,景瑞霞.损耗均衡算法在Flash管理中的应用研究[J].河北省科学院学报,2009,(2):4-6
[2] 山东省科学院自动化研究所.一种利用MCU内部数据Flash存储非易失性数据的方法:中国,201210074452.5[P].2012-09-12
[3] 易军,曹龙汉,周熙.FLASH存储管理子系统的设计与实现[J].微计算机信息,2008,(8):86-87
[4] 叶树梅,季爱明,俞一彪.嵌入式系统中Flash存储管理策略[J].科学技术与工程,2011,(17):77-79
[5] 梁海浪,蔡李隆.dsPIC30F6014内部EEPROM读写C程序设计及其应用[J] .电子产品世界,2005,(11):96-98
[6] 杜伟庆,苏凯雄.嵌入式系统中NOR Flash 的分块管理与实现[J] .计算机与数字工程,2009,(12):80-82
[7] 王标,周新志,罗志平.嵌入式系统中Nand Flash写平衡的研究[J].微计算机信息,2008,(14):8-10
[8] 陆林燕,王鲁静,郑正奇.NAND FLASH编程实现研究分析[J].计算机技术与发展,2008,(3):118-120
评论