历史上的今天
返回首页

历史上的今天

今天是:2025年03月06日(星期四)

正在发生

2019年03月06日 | STM32 Flash操作(擦写)过程中器件复位导致数据丢失问题

2019-03-06 来源:eefocus

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_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_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_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扇区数据备份。


推荐阅读

史海拾趣

芯联(CHIPLINK)公司的发展小趣事

芯联集成非常重视企业文化建设,致力于打造一个高效、协作、创新的团队。公司倡导“以人为本”的管理理念,关注员工成长和发展,为员工提供良好的工作环境和福利待遇。同时,公司还建立了完善的激励机制和培训体系,激发员工的工作热情和创造力。这些努力使芯联集成在行业内树立了良好的口碑和形象,吸引了众多优秀人才加入公司。

ETC1公司的发展小趣事

万集科技是ETC行业中另一家知名的企业。公司专注于ETC设备的研发、生产和销售,以及ETC系统的集成与服务。在市场拓展方面,万集科技采取了多元化的策略,不仅与国内众多高速公路管理机构建立了合作关系,还积极开拓海外市场。通过不断的市场拓展和品牌建设,万集科技逐渐成为了ETC行业中的佼佼者。

驰兴电感(Coilank)公司的发展小趣事

为了进一步提升产品的竞争力,驰兴电感积极开展国际合作。公司与国际知名电子元器件厂商建立了长期稳定的合作关系,共同研发新产品、新技术。这些国际合作不仅使驰兴电感能够借鉴国际先进经验和技术,还为公司带来了更多的市场机会和资源。

Defense Logistics Agency公司的发展小趣事

在成功整合供应链之后,DLA开始拓展其业务领域。除了为美军提供后勤保障服务外,DLA还开始向各州、当地政府组织、外国政府和国际组织提供后勤保障服务。这一拓展不仅拓宽了DLA的业务范围,也增强了其国际影响力。

Clulite公司的发展小趣事
  1. 创业初期
    • 描述Clulite公司的创始人或核心团队如何识别电子行业中的某个市场机遇。
    • 讲述他们是如何筹集初始资金,设立公司,并开发出第一款产品或解决方案的。
    • 可以提及公司在初创阶段面临的挑战,如技术难题、市场竞争等。
  2. 技术创新
    • 讲述Clulite如何通过研发创新,推出了一款颠覆性的产品或技术,从而获得了市场认可。
    • 详细描述这一创新过程,包括研发团队的努力、关键技术的突破等。
    • 提及这一创新如何帮助公司在市场上取得了竞争优势。
  3. 市场拓展
    • 描述Clulite如何逐步扩大市场份额,从地区市场走向全国乃至国际市场。
    • 可以讲述公司如何建立销售网络、与合作伙伴建立合作关系,以及参与行业展会等活动来推广品牌和产品。
    • 提及公司在市场拓展过程中遇到的挑战和应对策略。
  4. 品质管理
    • 讲述Clulite如何注重产品质量和客户体验,通过严格的质量控制流程来提升产品可靠性。
    • 描述公司如何建立完善的售后服务体系,为客户提供及时、专业的支持。
    • 提及这些举措如何帮助公司赢得了客户的信任和口碑。
  5. 可持续发展
    • 讲述Clulite如何关注环境保护和社会责任,推动公司的可持续发展。
    • 描述公司如何采取环保措施,减少生产过程中的污染排放。
    • 提及公司如何参与社会公益事业,回馈社会。

请注意,这些故事需要根据Clulite公司的实际情况进行调整和补充。如果你需要更具体的内容,建议查阅Clulite公司的官方网站、新闻报道或行业分析报告,以获取更详细的信息和数据。

Amaze Electronics Pte Ltd公司的发展小趣事

在电子行业的快速发展中,Amaze Electronics Pte Ltd以其前瞻性的技术创新赢得了市场的认可。公司投入大量研发资源,成功开发出了一款高效能、低能耗的智能手机芯片。这款芯片不仅大幅提升了手机的运行速度,还显著降低了能耗,为用户带来了更流畅的使用体验。凭借这一技术创新,Amaze Electronics迅速在市场上脱颖而出,赢得了众多手机制造商的合作意向。

问答坊 | AI 解惑

新世纪汽车主动与被动安全技术应用2

被动安全系统方面     被动安全系统是指在交通事故发生后尽量减小损伤的安全系统,包括对乘客和行人的保护。     福特公司通过不断创新,推出先进的乘客约束系统和安全气囊技术,在乘员保护方面 ...…

查看全部问答>

智能型充电器的电源和显示的设计

智能型充电器的电源和显示的设计--AVR单片机做的好东西…

查看全部问答>

怎么一进中断I/O的状态就改变了,我在中断里面读取I/O的状态,怎么跟示波器显示的不一样?

怎么一进中断I/O的状态就改变了,我在中断里面读取I/O的状态,怎么跟示波器显示的不一样?…

查看全部问答>

[转载] 簡易開核 輕鬆暢玩 ASUS M4A89GTD PRO/USB3 (存開箱)

AMD 現今最夯的口號 我想還是  核心動力全開 小弟也藉由這次開核風氣 入手了M4A89GTD PRO/USB3 入手也一陣子了 就來發個開箱吧 本次的主角出現了 X2 555 與M4A89GTD PRO/USB3 這次華碩用的主機板的彩盒還滿亮眼的 在一張,把閃 ...…

查看全部问答>

WinCE系统的驱动问题

各位大哥大姐:     小弟求教!     WinCE操作系统镜像生成以后,希望可以将其下载到Flash中,在以后系统复位或者重新上电以后,WinCE操作系统可以自动运行。可是,当我把镜像文件下载到Flash中后,却启动不起来,请问: &n ...…

查看全部问答>

不知不觉已经wince驱动快一周年,写点学习经验,顺便散分,嘿嘿

   刚洗完澡,头发未干,精神抖擞。想起自己快毕业一年了,特别来劲,情不自禁的在键盘上敲打起来。    我清楚的记得,我是2008.07.01被“轰出”校门的,然后申请了延迟离校,才可以在学校住宿,但是手里有几千块钱,于是就跑 ...…

查看全部问答>

用什么cpld来替代xc9572?

9572要停产,现在产品要用新的cpld来替代9572 哪位高手能说一下用什么来替代比较合适…

查看全部问答>

STM32没有MPU

                                 如题,是不是没有MPU(Memory protect unit)?…

查看全部问答>

09.29【每周讨论】12岁的编程天才,英雄出少年

12岁的编程天才 田众和,1999年生,今年12岁,任时代网络软件工作室CEO兼CTO(技术总监)。小学4年级自学编程,创作第一个比较成熟的编程作品Othink系统,获得第一笔创业资金300元,招聘并领导11人团队,集资2000余元创建工作室,4个月盈利三万余 ...…

查看全部问答>

Ubuntu 手机即将问世

本帖最后由 jameswangsynnex 于 2015-3-3 19:56 编辑 Canonical公司在职位的描述文字中写道“寻找业务拓展的精英来发展与行业伙伴的深度合作关系,来促进Ubuntu作为智能手机系统最终登陆手机”,以及“目标是创立一种围绕Ubuntu智能手机系统的良好 ...…

查看全部问答>