STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题

2023-11-01

1.问题描述

产品在运行过程中需要保存一些断电不丢失的数据,为此将数据保存在STM32内部的flash中。但是测试人员在测试的过程中,修改了数据参数,直接断电重启机器,并没有等待flash的操作时间,导致原有的数据丢失。

2. 原理分析

本产品硬件平台是基于STM32F429,采用HAL库开发。在操作内部flash这部分中,查看数据手册得知:
这里写图片描述
这里写图片描述
对于操作128KB的扇区擦写32位数据需要的时间,典型值是1S。最大值是2S。才能保证操作完成。
而在参考手册中提到:在Flash操作期间发生器件复位,则无法保证flash中的内容,
这里写图片描述
为此,我特地在擦写过程中,断电,然后看flash中的数据是什么,经过多次擦写,断电,然后用ST-Link查看扇区的数据发现,其数据如图所示:
这里写图片描述
这里写图片描述
数据为0xFFFFFFFF 或者0x00000000 不定。但是经过多次发现,基本上都是在这两个数据当中变化,无规则。
为此在判断的时候,可以采用这两个数据进行判断。

3. 解决方案:

采用一块Backup sector(备份扇区)用来存储修改参数前的数据,当第一块扇区数据丢失的时候,就读取备份扇区的内容。
具体看代码:

void flash_set_date(void)
{
    static u8 update_flag=0;
    uint8_t i=0;
    //读取扇区内容,2块扇区内容同时为0xFFFFFFFF 表示没有参数,使用默认值
    if((FLASH_ReadWord(MDATA_BASE+0)==0xffffffff)&&(FLASH_ReadWord(BACK_FLASH_BASE+0)==0xffffffff))
    {
        GD_BUF[INDEX_ID] = 0xff;//子控制板的ID默认设置为0xff
        GD_BUF[INDEX_RED_CURRENT]=110;       //红光电流默认值100mA
        GD_BUF[INDEX_FORWORD_V]=38;      //前向光默认值500
        GD_BUF[INDEX_PD_BACK]=193;       //回光默认值2500
        GD_BUF[INDEX_5620_A2]=27;
        GD_BUF[INDEX_5620_B2]=27;
        GD_BUF[INDEX_BIAS_V]=154;     //偏置电压默认值2000

        GD_BUF[INDEX_OV_DTEMP]=40;     //电水冷板温度报警默认值40
        GD_BUF[INDEX_ADJ_POWER]=187;   //满功率微调值默认186

        GD_BUF[INDEX_OV_TEMP]=45;      //泵源温度报警默认值45
        GD_BUF[INDEX_OV_GTEMP]=35;     //光水冷板温度报警默认值35
        GD_BUF[INDEX_5620_A1]=27;   

        GD_BUF[INDEX_OVER_V]=131;//过压报警点
        GD_BUF[INDEX_LOW_V]=100;//低压报警点
        GD_BUF[INDEX_OVER_I]=181;//过流报警点
    }
    else//有参数,先读取扇区1
    {
        for(i=0;i<GD_LEN_FLASH;i++)
        {
            GD_BUF_FLASH[i] = FLASH_ReadWord(MDATA_BASE+i*4);
        }
        //意外擦除了
        if((GD_BUF_FLASH[FLASH_RED_CURRENT]==0xffffffff)&&(GD_BUF_FLASH[FLASH_FORWORD_V]==0xffffffff)&&(GD_BUF_FLASH[FLASH_PD_BACK]==0xffffffff)\
        &&(GD_BUF_FLASH[FLASH_BIAS_V]==0xffffffff))update_flag=1;
        //被意外清零了。
        if((GD_BUF_FLASH[FLASH_RED_CURRENT]==0)&&(GD_BUF_FLASH[FLASH_FORWORD_V]==0)&&(GD_BUF_FLASH[FLASH_PD_BACK]==0)\
        &&(GD_BUF_FLASH[FLASH_BIAS_V]==0))update_flag=1;
    }

    //不正确,读取扇区2的内容  
    if(update_flag>0)
    {
        for(i=0;i<GD_LEN_FLASH;i++)
        {
            GD_BUF[i] = FLASH_ReadWord(BACK_FLASH_BASE+i*4);
        }
//      flash_update();//写入扇区1
//      pcset_5620_pro();//第一次上电设置5620输出。
        TLC5620_Set1((u8)GD_BUF[INDEX_5620_A1],0);
        TLC5620_Set1((u8)GD_BUF[INDEX_RED_CURRENT],1);
        TLC5620_Set1((u8)GD_BUF[INDEX_FORWORD_V],2);
        TLC5620_Set1((u8)GD_BUF[INDEX_PD_BACK],3);
        TLC5620_Set2((u8)GD_BUF[INDEX_5620_A2],0);
        TLC5620_Set2((u8)GD_BUF[INDEX_5620_B2],1);
        TLC5620_Set2((u8)GD_BUF[INDEX_BIAS_V],2);
    }
    else//参数正确,比较扇区1 
    {
        if(Compare_Sector_Date(MDATA_BASE,BACK_FLASH_BASE,GD_LEN_FLASH))
        {
            Update_Back_Flash(BACK_FLASH_BASE,GD_LEN_FLASH);
        }
        for(i=0;i<GD_LEN_FLASH;i++)
        {
            GD_BUF[i]=GD_BUF_FLASH[i];
        }
        TLC5620_Set1((u8)GD_BUF[INDEX_5620_A1],0);
        TLC5620_Set1((u8)GD_BUF[INDEX_RED_CURRENT],1);
        TLC5620_Set1((u8)GD_BUF[INDEX_FORWORD_V],2);
        TLC5620_Set1((u8)GD_BUF[INDEX_PD_BACK],3);
        TLC5620_Set2((u8)GD_BUF[INDEX_5620_A2],0);
        TLC5620_Set2((u8)GD_BUF[INDEX_5620_B2],1);
        TLC5620_Set2((u8)GD_BUF[INDEX_BIAS_V],2);
    }   
}

具体流程:
1. 读取到两块扇区都为0xFFFFFFFF时,表示第一次烧写程序,采用默认值。
2. 有参数,则读取第一块扇区内容,
3. 判断第一块扇区内容是否正确,(可以采用校验的方式,或者采用在一个固定的位置写入固定的数据:写入0x55AA55AA)如果说扇区数据丢失,则写入的固定数据也将丢失,则说明第一块扇区内容不正确。
4. 不正确,读取第二块扇区内容,写入第一块扇区中。正确,比较两个扇区内容的差异,不同,则写入备份扇区。
对此,操作完成。flash扇区数据备份。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题 的相关文章

  • 使用 STM32F0 ADC 单独读取不同的输入

    STM32F072CBU 微控制器 我有多个 ADC 输入 并且希望单独读取它们 STMcubeMX 生成样板代码 假设我希望按顺序读取所有输入 但我无法弄清楚如何纠正这个问题 这篇博文 http blog koepi info 2015
  • 使用 Swift 以编程方式闪烁屏幕(在“屏幕截图”上)

    为了从这里转换 Objective C 示例 如何以编程方式闪烁屏幕 https stackoverflow com questions 5254508 how to flash screen programmatically我写了以下代码
  • 哪些变量类型/大小在 STM32 微控制器上是原子的?

    以下是 STM32 微控制器上的数据类型 http www keil com support man docs armcc armcc chr1359125009502 htm http www keil com support man d
  • Actionscript 内存管理、垃圾收集

    这个博客 http blogagic com 163 flex memory management and memory leaks varref 和其他人 指出 在清理对象时 您应该在 dispose 方法中将对象引用设置为 null 但
  • Flex/AS3很奇怪的简单数字运算问题

    我的问题在 Flex 中描述起来非常简单 0 8 0 2 0 6000000000000001 以前有人得到过这个 我确定前两个成员是 0 8 和 0 2 并且是 Number 类 为什么会发生这种情况 另一件事 我从 像这样输入 var
  • 如何在多个 HTML 页面上播放背景音频?

    是否有解决方案可以让背景音频 音乐在网站上的多个页面上播放 而无需在每个页面加载时重新启动 该网站当前使用框架集 但我正在寻找替代方案 如果不让整个网站都 AJAX 我认为框架是唯一的方法 如果您需要的话 这里有一个关于制作 ajax 站点
  • 如何调整外部 SWF 的大小以适合容器?

    我想要完成的是调整外部 SWF 的大小 使其适合在舞台上作为容器呈现的显示对象 现在它显示在容器外部 重要提示 我不希望外部 SWF 占据整个舞台 我在舞台上为它准备了一个特殊的地方 那个容器 public function loaderC
  • 我应该将 FLV 文件放在哪里才能在本地 Red5 服务器上进行流式传输?

    我安装了最新的 Red5 服务器 但我不确定将 flv 文件放在哪里来进行流式传输 没有像我在网上找到的一些教程那样的 streams 或 ofla 目录 我应该将 flv 文件放在哪里来进行流式传输 Red5 附带了一些演示 但默认情况下
  • HTTPS 上的 SWFUpload 无法正常工作

    当目标 servlet 侦听 HTTPS 时 我在使用 SWFUpload 上传文件时遇到问题 在 HTTP 上它工作得很好 仅当使用 FireFox 或 Opera 时才会出现此问题 在 IE 上它工作正常 没有尝试过其他浏览器 EDIT
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • 保护客户端 API 的安全

    我正在为基于 JavaScript 的游戏构建服务器端 API 和客户端库 其中必须确保两个非常重要的功能的安全 用户每次游玩都必须扣款 我们必须确保提交的分数是玩家实际获得的分数 解决第一个问题看起来很简单 在每次游戏开始时 我们都会调用
  • as3 事件 - 类型强制失败?

    我正在将事件从孩子发送到父母 swf 它工作正常 直到我使用预加载器 swf 加载父级 然后父级停止从子级获取事件 我现在收到此错误 TypeError Error 1034 Type Coercion failed cannot conv
  • 是否可以使用 S3 进行 Flash 伪流?

    我一直在使用 S3 来存储和提供 FLV 和 MP4 视频 它效果很好 但内容是渐进下载的 我想知道是否有可能让所谓的 伪流 与 S3 一起使用 伪流允许观看者在下载完整视频之前在视频中向前搜索 并仅将必要的位发送到 Flash 播放器 我
  • Adobe Flash 项目的版本控制

    我正在处理一个非常复杂的 Flash 项目 该项目是我们为客户使用而部署的全套服务的一部分 对于我们的大多数软件源 Java PHP Javascript HTML 和一些其他语言的支持脚本 我们使用 subversion 进行版本控制和管
  • 更改由 AS3 添加到舞台的影片剪辑中的动态文本字段不起作用?

    当我更改动态文本字段的文本值时 文本字段只是变为空白 而不显示新值 我有一个名为 game board 的 MovieClip 由 AS3 动态添加到舞台上 舞台一开始是空白的 我有另一个名为 stage 2 的 MovieClip 它作为
  • Flash 图表和图形的最佳解决方案是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道融合图表 http www fusioncharts com 还有其他好的解决方案或 API 用
  • Microsoft Surface 支持 Flash 网站吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我搜索过谷歌但没有找到明确的答案 我或我工作的 Flash 网站 应用程序可以在 Microsoft Surface 平板电脑上运行吗 看来微软 Su
  • 使用jquery调用AS3外部接口

    我正在使用ExternalInterface 调用嵌入在html 页面中的Flash 应用程序 以下代码工作正常 我正在使用按钮进行测试 document ready function button click function var a
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

    我正在使用 Nucleo STM32L031 和 AC6 STM32 工作台 eclipse 我编写应用程序并进入调试模式 一切正常 直到我在应用程序中添加另一个功能 我注意到当我删除 评论 新函数 软件可以再次进入调试模式 但是当我添加
  • Flash ActionScript 2 的压缩和解压缩工具

    您是否知道 flash actionscript 2 的任何 zip unzip 组件或脚本 我知道这个图书馆 http ntt cc 2008 01 19 actionscript class library fzip html对于 Fl

随机推荐

  • MATLAB实现基本的PSO粒子群算法优化目标函数(求函数最小值的解),写成函数的形式,并举例演示如何使用

    粒子群优化算法 Particle Swarm Optimization 是一种进化计算机技术 evolutionary computation 源于对鸟类捕食行为的研究 是一种基于迭代的优化工具 事实上 像PSO这种同属于元启发式优化算法有
  • java中静态代码块详解

    今天在项目中看到这行代码 静态代码块 很久没用静态代码块了 今天来复习一下 依旧按照为什么 是什么 怎么用 的思想 去学习 为什么 先说说代码中为什么要使用这种写法吧 还记得静态代码块的特点吗 随着类的加载而执行 而且只执行一次 对 没错
  • 求求你们了,MyBatis 批量插入别再乱用 foreach 了,5000 条数据花了 14 分钟。。...

    近日 项目中有一个耗时较长的Job存在CPU占用过高的问题 经排查发现 主要时间消耗在往MyBatis中批量插入数据 mapper configuration是用foreach循环做的 差不多是这样 由于项目保密 以下代码均为自己手写的de
  • Windows获取CPU、内存和磁盘使用率脚本

    获取CPU使用率脚本 vbs 另存为cpu vbs On Error Resume Next Set objProc GetObject winmgmts root cimv2 win32 processor cpu0 Wscript Ec
  • C语言:输出1000~3000年中所有的闰年,每5年换一行

    C语言 输出1000 3000年中所有的闰年 每5年换一行 题目 分析 代码 题目 编写程序 输出1000 3000年中所有的闰年 每5年换一行 分析 判断闰年的条件为 能被4整除但不能被100整除 或者能被400整除 代码 include
  • 《Vision Transformers: State of the Art and Research Challenges》论文翻译阅读

    作者 Bo Kai Ruan Hong Han Shuai Wen Huang Cheng 概要 Transforme在自然语言处理中取得了巨大的成功 由于Transformer的自注意机制具有强大的能力 研究人员开发vision tran
  • C++ 聚合类(Aggregate Class)

    C 聚合类 Aggregate Class 文章目录 C 聚合类 Aggregate Class 概述 聚合类定义 聚合类的特性 value initialized 聚合类的初始化方法 union 聚合 总结 概述 该篇文章是用于梳理在学习
  • 安装mysql中遇到的错误:

    1 安装报错 Install Remove of the Service Denied 解决方案如下 2 安装报错 The service already exists 解决方案如下 3 安装报错 Can t create test fil
  • 真机上,微信小程序弹出层中使用textarea组件无法显示文本的问题

    真机上 微信小程序弹出层中使用textarea组件无法显示文本的问题 解决思路 文章链接 最近开发微信小程序发现了一个BUG 最后莫名奇妙地解决了 隐隐约约地感觉和微信小程序地textarea组件的z index层级有关 没有去深究其中原理
  • 【前端知识之Vue】diff算法流程

    前言 本系列主要整理前端面试中需要掌握的知识点 本节介绍diff算法流程以及相关例子 如果想看源码推荐YK菌的 Vue源码 图解 diff算法 与 虚拟DOM snabbdom 最小量更新原理解析 手写源码 updateChildren哦
  • IntelliJ IDEA-配置文件位置

    关于配置文件的位置 一旦开始使用IDEA之后 就需要做很多的配置相关工作 使得IDEA越来越符合你的个人习惯 让你使用起来得心应手 而这些配置信息 都保存在C盘 比如我的就会默认保存在如图所示的位置 C Documents and Sett
  • flutter loading前一个界面关闭后一个界面的loading

    import package flutter cupertino dart import package flutter material dart import package flutter easyloading flutter ea
  • H5 架构和原生架构的区别

    1 App 的 3 种开发方式 表面上看 手机 App 都是同样的东西 就是手机上的应用程序 点击图标就能运行 但是它们的底层技术不一样 按照开发技术 App 可以分成三大类 原生应用 简称 nativeApp Web 应用 简称 WebA
  • 阿里云轻量应用服务器mysql远程连接教程

    阿里云轻量应用服务器mysql远程连接教程 打开轻量应用服务器控制台 打开防火墙 点击添加规则 打开服务器命令行 可以使用Xshell等软件 在阿里云控制台开放3306端口后后在linux系统中也要开放3306端口 在服务器中开放防火墙33
  • esp32搭建lvgl

    platformio 下载两个库 TFT eSPI lv arduino 3 0 1对应lvgl 7 2 7 5对应lvgl6 pio libdeps tft espi user Setup h 驱动芯片选择 颜色顺序 分辨率选择 不同芯片
  • Nginx反向代理配置流式响应

    Nginx 是通过缓存响应内容来处理请求的 也就是说 当 Nginx 接收到完整的响应后 才会将其发送给客户端 所以默认不支持流式响应 这里讲讲 Nginx 反向代理中怎么配置流式响应 一 使用背景 最近使用 Egg js 搭建自动化部署服
  • MyEclipse提示过期,MyEclipse Subscription Expired解决方案

    一 错误描述 某一天打开MyEclipse 突然发现出现如下提示框 1 错误日志 Thank you for choosing MyEclipse Your license expired 1091 days ago To continue
  • @Valid和@Validated在service层的应用及问题汇总

    1 背景 实际开发中 很多时候要对参数校验 比如为空等 除了要在接口的入口处使用 很多普通方法也需要检查 比如service方法 那么如何在service上使用这个参数校验呢 2 使用方式 步骤一 在service接口上加上 Validat
  • [CF1149C](Tree Generator)

    题意 给出一颗树的括号序 有m个操作 每次交换两个括号 保证交换后括号序仍然合法 输出每次操作后 包括未操作时 树的直径 solution 首先转化题目 对于一棵树的括号序 我们找到一段子串 满足将其中匹配的括号消去后剩下的括号最多 那么剩
  • STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题

    1 问题描述 产品在运行过程中需要保存一些断电不丢失的数据 为此将数据保存在STM32内部的flash中 但是测试人员在测试的过程中 修改了数据参数 直接断电重启机器 并没有等待flash的操作时间 导致原有的数据丢失 2 原理分析 本产品