最近在做一个电源项目软件,客户要求能够在掉电后保存一些数据,重新上电后能加载这些数据。数据内容只有一个字节,但每次写入时是4个字节。
具体的内容如下:
电源带有4路输出,上位机通过RS485能够控制这4路的通断,1:导通,0:断开,当上位机执行一次导通或关断操作时都要保存输出状态到Flash,如果相同的操作执行多次则只保存一次,例如:多次发送导通操作被视为是导通一次操作。
具体思路如下:
1、由于N32G031系列没有EEPROM,也没有其他外部存储器,只能使用ROM的一部分。N32G031总共有64K字节ROM,运行的程序只有十多K,空间还有很多;
2、使用片内Flash的一页来动态存储数据。Flash每页有512个字节,每4个字节写一次,则一页可以写入128次,整页写完,继续再写时才擦除页,重新从页的起始位置写入数据,如此反复,这样可以大大减小Flash页的擦除次数;
3、初始时从Flash页的指定位置读取数据(位置根据计算得到,就是找到第一个连续4个0xFF的位置),并存储在两个变量中A和B中,此时A和B中保存的数据是相同的,运行时如果上位机执行了导通和断开操作会改变B变量相关成员值,当while大循环检测到A和B的值不同时,则用B的值设置A变量,并根据计算的地址写入Flash页中。
程序主要代码如下:
结构体和联合体定义
struct STRUCT_OUTPUT_STATE{
unsigned P1 :1;
unsigned P2 :1;
unsigned P3 :1;
unsigned P4 :1;
unsigned AUX :1;
unsigned :1;
unsigned :1;
unsigned :1;
};
//u

本文讨论了一个电源项目中的软件设计,涉及如何在掉电后保存4路输出的状态数据,通过高效利用Flash存储,减少擦除次数,以实现1280万次以上的状态更改。作者分享了具体实现方法和优化策略,欢迎进一步讨论改进方案。

2611

被折叠的 条评论
为什么被折叠?



