概述:
  通过地址的偏移,巧妙的避开Flash擦除长时间占用CPU的使用。
  MCU-STM32H743,编译环境-Keil
说明:
基础知识可以看:Flash读写 其中包含了本代码涉及到的所有函数。
原理: 以空间换取时间。
正文:
  首先要明白Flash擦除需要很长的时间,写用不了多少时间,所以我们可以在写之前执行擦除指令,使Flash在待写状态,这样再写的时候就不会占用大量的CPU时间。下图为H7写Flash时间和擦除Flash的时间,可以看出写都是us级的,而擦除则是s级的。

思路:
利用Flash的两个扇区进行擦写

//使用Flash的扇区1和扇区2
#define FLASH_SAVE_ADDR  0x08020000//扇区1
#define FLASH_USER_ADDR  0x08040000//扇区2

●FLASH_USER_ADDR 地址处的Flash在程序每次初始化的时候将内容擦除。
●FLASH_SAVE_ADDR 地址处保存FLASH_USER_ADDR 地址擦除前的内容。
  我们每次可以在FLASH_SAVE_ADDR 地址提取数据,在FLASH_USER_ADDR 地址处写数据,这样擦除都在初始化的时候完成,这样写Flash就不会长时间占用CPU的正常运行。

★上电只能写一次Flash代码

uint32_t Flash_UserBuff[8]={0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000};
uint32_t Flash_SaveBuff[8]={0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000};//保存的数据
int main(void)
{/*初始化*/STMFLASH_Read(FLASH_USER_ADDR,(uint32_t*)Flash_UserBuff,8);//将FLASH_USER_ADDR地址中的数据读出至Flash_UserBuff[]数组中if(Flash_UserBuff[0] != 0xFFFFFFFF)//判断该值是否全F,如果不等于全F,则该地址为上次写入的数据,将数据读出放入FLASH_SAVE_ADDR地址中,如果全F则已经被擦除过,不保存擦出过的数据{STMFLASH_Write(FLASH_SAVE_ADDR,(uint32_t*)Flash_UserBuff,8);//数据读出放入FLASH_SAVE_ADDR地址}STMFLASH_Read(FLASH_SAVE_ADDR,(uint32_t*)Flash_SaveBuff,8);//将上次保存的数据读出,用于这次程序的使用STMFLASH_OnlyErase(FLASH_USER_ADDR,8);//擦除FLASH_USER_ADDR地址的内容,用于这次数据的存储。
/*主循环*/while(1){//用户任务,在任务中只能写入一次数据,因为初始化只擦了一次}

★上电多次写Flash代码
因为Flash擦除是一整个扇区擦除,详情看上一个博客Flash读写。

●FLASH_USER_ADDR 地址处的Flash在程序每次初始化的时候将内容擦除。
●FLASH_SAVE_ADDR 地址处保存FLASH_USER_ADDR 地址擦除前的内容。
   在FLASH_USER_ADDR中写入一次数据后我们地址偏移32字节作为下一次数据写入的首地址,因为STM32H7每次写入数据必须为8个字(32字节),因此我们存放的数据如下图所示,每次都占用Flash的32个字节。

   在写的时候比如我们写了4次,则第四次尾地址后的数据全为FFFFFFFF,我们遍历FLASH_USER_ADDR 地址的数据,直到找到FFFFFFFF的数据,然后向前偏移32字节则为我们在扇区2 中上次写入数据的首地址(FLASH_USER_ADDR +偏移量),因此就找到了上次写入的数据,按下述代码思想就可提取数据。

  我们每次可以在初始化时在上述找到的首地址(FLASH_USER_ADDR +偏移量) 中提取数据保存在FLASH_SAVE_ADDR地址中,然后擦除FLASH_USER_ADDR 地址处写数据,这样擦除在初始化的时候完成,这样写Flash就不会长时间占用CPU的正常运行。用数据是将数据从FLASH_SAVE_ADDR处读出即可。
代码如下:

uint32_t Flash_UserBuff[8]={0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000};
uint32_t Flash_SaveBuff[8]={0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000,0x00000000};//保存的数据
int main(void)
{/*初始化*/STMFLASH_Read(FLASH_USER_ADDR,(uint32_t*)Flash_UserBuff,8);//提前读一次if(Flash_UserBuff[0] != 0xFFFFFFFF)//如果上次被写入{while(Flash_UserBuff[0] != 0xFFFFFFFF)//遍历找到没被写的区域,就找到上次写入的地址(循环退出的地址减32字节就是保存ID的地址){STMFLASH_Read(FLASH_USER_ADDR+32*Flash_Cnt,(uint32_t*)Flash_UserBuff,8);//遍历找到没被写的区域后退出Flash_Cnt++;}STMFLASH_Read(FLASH_USER_ADDR+32*(Flash_Cnt-2),(uint32_t*)Flash_UserBuff,8);//找到的没被写的区域往前偏移32字节,从该地址就可以读出上次写入的数据STMFLASH_Write(FLASH_SAVE_ADDR,(uint32_t*)Flash_UserBuff,8);//写入读取的数据放置在0x08020060(扇区2)flash地址中(转存上一次写入的数据)  STMFLASH_OnlyErase(FLASH_USER_ADDR,8);//将FLASH_USER_ADDR位置的数据擦除,准备这次的数据写入            }STMFLASH_Read(FLASH_SAVE_ADDR,(uint32_t*)Flash_SaveBuff,8);//在FLASH_SAVE_ADDR(扇区1)地址,读取一次数据放置内存中(这次程序使用)
/*主循环*/while(1){//用户任务,在任务中可多次写入,因为每次写入Flash会地址偏移/*----多次写----*/Write_FlashAddress = FLASH_USER_ADDR + Write_Cnt*32;//写一次地址偏移32ByteWrite_Cnt++;//写一次加一    STMFLASH_OnlyWrite(Write_FlashAddress,(uint32_t*)Flash_WData,8);//不擦除写  /*-------------*/}

通过以上方法可以避免在程序运行中Flash擦除占用CPU的时间,因为擦除都是在初始化的时候完成的。

参考博客 Flash读写

★★★如有错误欢迎指导!!!

软件优化Flash擦除时间长的方法相关推荐

  1. mysql按时间查询的优化_mysql按时间查询优化的方法

    mysql按时间查询优化的方法 发布时间:2020-12-16 09:41:14 来源:亿速云 阅读:73 作者:小新 小编给大家分享一下mysql按时间查询优化的方法,希望大家阅读完这篇文章后大所收 ...

  2. JavaCV1.5.3版本FFmpegFrameGrabber初始化的时候加载时间长的解决方法

    JavaCV1.5.3版本FFmpegFrameGrabber初始化的时候加载时间长的解决方法 问题描述 问题分析 解决方法 项目码云(Gitee)地址:https://gitee.com/banma ...

  3. xilinx fpga从flash加载时间长

    xilinx fpga从flash加载时间长一般是flash时钟频率低, 解决方法: 1.打开实现设计 2.打开bit文件设置 3.点击设置 4.将频率设置加大,保存,重新编译

  4. 软件申请专利花费多长时间

    一.软件申请专利花费多长时间 依据专利法,发明专利申请的审批程序分为受理.初审.公布.实质审查和授权五个阶段,一共大概需要1年半至2年;实用新型专利和外观设计专利申请只需要受理.初审和公布三个阶段,只 ...

  5. C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快

    C#基于Emgucv编写的图像识别软件,内包含自己编辑控件库,优化识别效率比传统匹配方法要快. 可随意设置ROI区域,适配各种像素大小图片识别. ID:22200653550517927甜萝卜125

  6. Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net

    Atitit.提升软件Web应用程序 app性能的方法原理 h5 js java c# php python android .net 1. 提升单例有能力的1 2. 减少工作数量2 2.1. 减少距 ...

  7. Nginx软件优化【转】

    转自 Nginx软件优化 - 惨绿少年 - 博客园 Nginx软件优化 - 惨绿少年 - 博客园 https://www.cnblogs.com/clsn/p/8484559.html 1.1 Ngi ...

  8. 优化Oracle数据库查询10个方法

    优化Oracle数据库查询10个方法: 网页制作中数据的查询是最主要的功能之一,其性能的好坏直接关系到网页的的运行效率.下面对Oracle数据库中大家不太注意的查询方法做一些总结. 第一个方法:利用连 ...

  9. [转]优化Flash性能

    原文:http://www.adobe.com/devnet/flash/articles/optimizing-flash-performance.html 翻译:http://bbs.9ria.c ...

最新文章

  1. 语音识别Kaldi开源
  2. iOS UIWebView 访问https 绕过证书验证的方法
  3. 五花八门的bug跟踪工具
  4. Libra教程之:数据结构和存储
  5. 微信公众号天气与聊天机器人小功能
  6. qml学习文档-转载
  7. 【HDU5091】Beam Cannon,扫描线+线段树
  8. 杂志订阅管理系统c语言实训报告,C语言程序设计报告—杂志订阅管理软件、、.doc...
  9. Scrapy框架:Request和Response对象,使用Request发送get请求、FormRequest发送post请求
  10. 不要奇怪 XP震网病毒缺陷或为2014最大软件漏洞
  11. IT创业光技术好,谋略定位不好,你很可能会死得很惨,丢钱、丢客户、丢成果、丢商机、丢思路
  12. Log4J按照不同包名输出日志
  13. RFC2833 - 用于DTMF数字信号、电话音和电话信号的RTP负载格式
  14. 鸡兔同笼python程序怎么写_关于鸡的歇后语
  15. Chicken first or egg?
  16. 生产力、商业价值和敏捷
  17. 【视频】结构方程模型SEM分析心理学营销数据路径图可视化|数据分享
  18. android 多闹钟实现代码,Android重复闹钟(每天)的实现
  19. tp6/thinkphp6如何接入微信授权openid
  20. 指纹浏览器是什么?有什么用?指纹浏览器有哪些?最具性价比的是哪个呢?

热门文章

  1. 雅马哈机器人以太网通信_紧凑型机器人控制器 - RCX320 - Yamaha Motor Co.,Ltd./雅马哈 - 以太网通信接口...
  2. Java校招面试,项目怎么聊
  3. Java去除PDF文件中的图片
  4. 《梦回水浒》玩家交流QQ群
  5. Java合并m3u8_m3u8Download java 下载 m3u8 视频,解密并合并 ts java download m3u8 vide @codeKK Android开源站...
  6. ArcGIS安装2753错误解决办法
  7. PLC入门知识与行业应用普及
  8. python 谷歌浏览器 安装驱动
  9. 【一建、一造经验分享】一建挺难的,要坚持才能得到
  10. 海关数据到底在哪里查?