内容提要
介绍了使用CH32V003的代码存储区域来模拟EEPROM保存数据的方法,包括Flash的擦写时间和擦写寿命等特性。通过Flash模拟EEPROM的相关库方法,完成EEPROM的加载、读取和写入操作。设计外壳使DIY USB电流表更像一个正式产品。
延伸解读
Flash模拟EEPROM的寿命权衡
CH32V003的Flash擦写寿命有限,按最低1万次计算,每分钟保存一次数据,理论持续运行约166小时就会耗尽擦写次数。因此作者设定了每分钟保存一次的策略,并增加“电量无变化时不写入”的条件,以延长Flash寿命。读者在类似项目中需根据数据重要性和更新频率,在数据完整性与存储器寿命之间找到平衡。
数据丢失率与保存频率的取舍
文章以20W充电为例,每分钟保存一次数据,若丢失一分钟数据,约损失0.33Wh,对于10000mAh充电宝占比不到1%,在可接受范围内。这说明保存频率不必过高,否则会加速Flash损耗。实际应用中,可根据对数据精度的要求调整保存周期,但需注意频繁擦写对Flash寿命的影响。
模拟EEPROM的实现要点
作者使用CH32V003用户代码区最后一页(起始地址0x08003FC0)的64字节模拟EEPROM,通过定义缓存、实现加载、读取和写入方法完成数据存储。写入时需先擦除再编程,并注意解锁和加锁操作。这种方案适合保存少量关键数据,但需注意地址不能与固件冲突,且擦写时间较长(2~3毫秒),应避免在中断等实时性要求高的场景中操作。
Q&A
如何使用CH32V003模拟EEPROM保存数据?
可以利用CH32V003的16KB用户代码区域,通过编写相关库方法来实现Flash模拟EEPROM的加载、读取和写入操作。
CH32V003的Flash擦写时间和寿命是怎样的?
CH32V003的Flash擦写64字节需要2~3毫秒,擦写寿命有限,需控制数据保存频率以避免损坏。
在USB电流表中,如何减少Flash的擦写次数?
可以在总消耗电量无变化时不写入Flash,或者设置每分钟保存一次数据,以减少擦写次数。
DIY USB电流表的固件开发完成了哪些功能?
固件开发完成了电压电流数据显示、功率计算、多页面切换、历史功率曲线绘制及数据保存等功能。
如何在系统启动时加载之前保存的数据?
在系统启动时调用adc_setup方法,可以加载之前保存的累计电量数据。
USB电流表的所有资料在哪里可以找到?
所有资料已开源,可以在GitHub仓库中获取,包括固件代码、PCB生产文件和外壳STL文件。