- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
STM32学习技术资料
半壶水STM32 开发板-III +JLINK V7,支持网络, 含2.8 寸TFT320*240 淘宝:
STM32 FLASH 模拟EEPROM 使用和优化
原始文件ST 官方有例子和文档:AN2594
/mcu/familiesdocs-110.html
看到不少网上使用官方例子程序不成功的问题,我估计大概是没详细阅读官方文档的原因吧,也许很多人没理
解官方例子的原理。那么下面就详细说明一下原理再说如何优化。
原理如下:
首先使用2 页FLASH 空间,如果0 页空间写满数据,那么把0 页空间里面的 【有效数据】复制到1 页,如果1
页数据满那么把1 页空间里面的 【有效数据】复制到0 页,这样循环使用,当然如果你想增加使用寿命可以增
加多页循环,官方例子只是按2 页实现的例子。每页前面4 字节保留,其中前2 字节是该页状态标志
下面的图显示数据在FLASH 中的保存格式:
半壶水QQ: 958664258 交流平台:/user1/5817/index.htm
半壶水STM32 开发板-III +JLINK V7,支持网络, 含2.8 寸TFT320*240 淘宝:
保存数据是16 位的,后面16 位是该数据的虚拟地址,注意:1 个数据有唯1 个虚拟地址,地址必须为:0~0xfffe
范围内 (每页将按4 字节分块,1 块保存1 个16 位数据)。下面继续说明16 位虚拟地址的作用。
Figure 3 显示了数据更新的过程:
1. 写数据
假设保存的数据虚拟地址是0X7777,那么程序写数据是从当前有效页页首地址开始查询虚
拟地址位置为 0XFFFF 的空间,如果是 0XFFFF 那么该位置可以保存数据;如果不是,那
么继续找下 1 个位置,如果本页无 0XFFFF 的空间那么表示本页已满,那么将本页 【有效
数据】复制到另外1 页继续保存数据。
当两次保存同一虚拟地址的数据时如右图所示:从上到下,第2 个虚拟地址是0X7777 对应
的数据1245 才是有效的。清楚了这点,那么读数据要怎么处理基本就明白了。
2. 读数据
读数据时是从有效页的末尾地址开始检测是否是有效数据,如果是那么立即返回,程序是通过虚拟地址判断有
效数据的,第1 个匹配的虚拟地址的数据才是有效的
3. 页满时处理数据
说到这里,看到不少使用例子程序不成功的问题,那么就请注意下面了,他们的错误估计是下面的原因造成的。
当1 页写满时其实里面有很多无效数据,你只需要将【有效数据】复制到另外1 页就成。如何复制有效数据呢?
我想很多人估计忽略了 【#define NumbOfVar ((uint8_t)0x03) /* Variables number */ 】,NumbOfVar 就是你程
序中实际要保存的数据量,这个必须与实际保持一致,不能多也不能少,这个如果不一致,那么在换页时将出
错,没换页之前倒是没问题的,原因在于:程序在换页时将根据NumbOfVar 的值复制有效数据的个数,如果比
实际少,那么换页时将丢失数据,如果比实际多那么将出现旧数据覆盖最新数据
半壶水QQ: 958664258 交流平台:/user1/5817/index.htm
半壶水STM32 开发板-III +JLINK V7,支持网络, 含2.8 寸TFT320*240 淘宝:
错误的例子:
/* Variables number */
#define NumbOfVar ((uint8_t)0x05)
uint16_t VirtAddVarTab[NumbOfVar] = {0, 1, 2};
//NumbOfVar 定义的比用的多实际是{0, 1, 2, 0, 0},虚拟地址0 的数据换页后将出现旧数据覆盖最新数据
int main(void)
{
uint16_t temp;
for (VarValue = 0; VarValue 100; VarValue++)
{
EE_WriteVariable(VirtAddVarTab[0], VarValue+10);
}
for (VarValue = 0; VarValue 500; VarValue++)
{
EE_WriteVariable(VirtAddVarTab[ 1], VarValue);
temp=0;
EE_Read
您可能关注的文档
- [2010六级] 12月六级作文预测第10篇:大学毕业生去向.docx
- sensortag原理图.pdf
- 制作手抓饼机和铁板鱿鱼机价格.docx
- Simulink画图专题.ppt
- 专利实施许可备案有什么作用?.docx
- SITIME晶振SiT5022压控振荡器规格书.pdf
- SITIME晶振SiT9002扩频振荡器规格书.pdf
- SITIME硅晶振SiT9105单端差分输出振荡器规格书.pdf
- LC5500液相色谱仪启动前的准备事项.doc
- SITIME硅晶振SiT9156差分振荡器规格书.pdf
- 家具厂粉尘防爆安全管理制度.docx
- 建筑工程项目实施方案.docx
- 学校防汛防台抢险救灾应急救援队伍工作制度.docx
- 【市政实务】郭炜 教材精讲班教案 43-第3章-城市隧道工程与城市轨道交通工程(十三).docx
- 【市政实务】潘旭 案例专项班课件 12-第6章-城市综合管理工程(略)-第20章-绿色建造及施工现场环境管理.pptx
- 【市政实务】郭炜 真题解析班 01-2023年真题解析(一).pdf
- 【市政实务】潘旭 案例专项班课件 05-第2章-城市桥梁工程(三).pptx
- 【市政实务】郭炜 教材精讲班课件 24-第2章-2.4-城市桥梁上部结构施工(一).pptx
- 【市政实务】郭炜 教材精讲班课件 38-第3章-城市隧道工程与城市轨道交通工程(八).pptx
- 【市政实务】郭炜 教材精讲班课件 43-第3章-城市隧道工程与城市轨道交通工程(十三).pptx
文档评论(0)