软件优化Flash擦除时间长的方法

2023-11-07

概述:
  通过地址的偏移,巧妙的避开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;//写一次地址偏移32Byte
		Write_Cnt++;//写一次加一	
		STMFLASH_OnlyWrite(Write_FlashAddress,(uint32_t*)Flash_WData,8);//不擦除写	
		/*-------------*/
	}

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

参考博客 Flash读写

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

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

软件优化Flash擦除时间长的方法 的相关文章

  • Adobe Flash 项目的版本控制

    我正在处理一个非常复杂的 Flash 项目 该项目是我们为客户使用而部署的全套服务的一部分 对于我们的大多数软件源 Java PHP Javascript HTML 和一些其他语言的支持脚本 我们使用 subversion 进行版本控制和管
  • Facebook 聊天在打开时隐藏 Flash 应用程序

    运行 Flash 应用程序时 如果我打开新的或现有的 Facebook 聊天窗口 我的 Flash 内容就会消失 我可以继续听到应用程序中播放的音乐 并且当我关闭 最小化 Facebook 聊天窗口时 我的 Flash 内容会重新出现 这是
  • 使用多个模块时优化 Flex

    我有一个 Flex 应用程序 加载时间非常重要 消费者网站 我希望能够在屏幕上显示一些内容 然后允许根据需要加载其他模块 我面临的问题是所有模块的总和比我将所有组件包含在单个 swf 文件中要大得多 原因很明显 例如 访问 Web 服务所需
  • 我应该等待 Flash Player 10.1 还是使用 Flash Lite 3 来为手机和设备开发 Flash 内容

    Adobe 将在 2010 年第一季度推出 Flash Player 10 1 这将在桌面和移动设备上提供一致的运行时 因此我假设如果它是为 Web 构建的 那么它也可以在移动设备上运行 我即将开始为手机开发基于 Flash 的应用程序 我
  • stm32l0: 执行MI命令失败。使用 vFlashErase 数据包擦除闪存时出错

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

    我需要在 Flash Player 10 中打开 PDF 该 swf 不会在浏览器中运行 并且系统上不会有 adobe reader 程序 我需要知道是否可以在 Flash 播放器中打开 PDF 而无需以任何方式进行转换 我在谷歌上搜索了无
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • 如何打开/关闭 iPhone 相机闪光灯 swift 2?

    我正在寻找如何打开 关闭 iPhone 的相机闪光灯 我发现了这个 IBAction func didTouchFlashButton sender AnyObject let avDevice AVCaptureDevice defaul
  • 如何将 BitmapData.draw 与 NetStream.appendBytes 一起使用?

    我正在使用 NetStream appendBytes 播放本地视频 不涉及服务器 Adobe AIR http en wikipedia org wiki Adobe Integrated Runtime 我想用BitmapData dr
  • 有没有其他方法可以在delphi上观看youtube视频?

    我看到http www delphiflash com demo youtube video http www delphiflash com demo youtube video关于如何在 delphi 上加载 flash 视频 但它不是
  • 使用 Javascript 检测 Pepper (PPAPI) Flash

    我们使用的是专有的文档查看器 它与某些 Chrome 版本中的 Pepper 版本的 Flash 配合得不太好 所以我希望能够检测到它并重定向到不同格式的相同内容 由于这个版本似乎落后于 NPAPI 版本 所以我一直在使用闪光检测 http
  • 如何从 Adob​​e AIR 中的文件流获取字节数组?

    我阅读的内容有限 小 15 500 mb 文件 我需要能够将所有文件字节放入一个字节数组中 所以我有一个功能 Bindable public var ba ByteArray new ByteArray code protected fun
  • iOS:适用于 iOS 的基于 Flash 的编程应用程序?

    我想知道 有没有办法支持 iOS 的基于 Flash 的编程应用程序 它可以是本机 混合或网络应用程序 我想知道 是否有可能为 iOS 设备开发基于 Flash 的应用程序 我看过论坛 到处都说这是不可能的 所以只想在开始任何开发之前确认一
  • 自定义上下文菜单未显示,因为显示对象位于“顶部”

    作为这里另一个问题的后续 我已经在 Flash 应用程序中构建了一个自定义上下文菜单项 但遇到了有时不显示的问题 我发现问题是另一个精灵位于带有自定义上下文菜单的项目的 顶部 然而 即使将 mouseEnabled 和 mouseChild
  • Adobe Air 与 Flash Player 10.1 运行时

    Adobe Flash Player 是一个浏览器 插件提供的优势 用户和内容创作者 浏览器 包括能够 在浏览器中交付 RIA Adobe AIR 融合了最初的技术 在 Flash Player 中开发并启用 丰富的互联网应用 桌面 Ado
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • 创建对象的弱引用

    Actionscript 3 中是否可以创建对对象的弱引用 以便可以对其进行垃圾收集 我正在创建一些类以使调试更容易 因此如果仅在此处引用这些对象 我不希望这些对象挂在内存中 当然我不想用回调填充代码以删除对象 格兰特 斯金纳 Grant
  • 通过Javascript捕获右键单击,无需节点

    当使用英语以外的任何其他语言时 Flash 播放器在 Firefox Chrome 中使用 wmode window 以外的任何内容时都会出现错误 此错误已报告但尚未修复 http bugs adobe com jira browse FP
  • Flash AS3 EventDispatcher - 有什么方法可以获取已注册侦听器的列表吗?

    有没有什么方法可以获取注册监听器的列表EventDispatcher 我知道EventDispatcher有hasEventListener方法告诉您是否注册了任何侦听器 但是有没有一种简单的方法来询问EventDispatcher找出听众
  • ActionScript Workers 可以用于在单独的线程中播放/生成声音吗?

    我很新ActionScript 工作者 但我想知道这是否可能 从我读到的来看 ActionScript 工作者 ASW 就像单独的线程 可以执行更多 CPU 密集型计算 而无需中断主线程 正在执行主 SWF 文件 我真正看到的唯一一个例子是

随机推荐

  • 浅谈数学与信息学关系

    众所周知 数学是所有理科科目的基础 在信息学竞赛中 无论是NOIP NOI乃至IOI对竞赛选手的数学水平 数学思维以及对数学模型的构造都提出了更高的要求 当然 在信息学中 在程序中并不是生搬硬套数学公式 需要有灵活的对数据的处理 高效的算法
  • 处理器对原子操作的实现

    文章目录 引入 单核 多核 引入 原子操作对于我们来说 是非常熟悉的概念 从用户角度 可以用原子操作来替换重量级的锁同步 从而提高程序性能 底层实现角度 原子操作可以用于构建各种更重量级的同步操作 比如锁或屏障之类的 对于原子操作的实现来说
  • 微信小程序开发:实现地图导航功能

    地图导航功能是近年来移动应用中极为常见的功能之一 它能够为用户提供准确的地理位置信息以及最佳的路线规划 帮助用户快速准确地找到目的地 微信小程序开发中的地图导航功能 需要通过多种技术手段综合实现 包括地图API 定位 路线规划 搜索服务等
  • STM32讲解

    目录 一 STM32简介 二 STM32命名规则 三 STM32硬件系统简介 四 STM32常用模块以及外设 4 1 STM32引脚介绍 4 1 1通用输入工作模式简介 4 1 2通用输出工作模式简介 4 2 STM32 中断简介 4 3
  • Opencv 模块计算机类型“x64”与目标计算机类型“X86”冲突

    Visual Studio 2012 模块计算机类型 x64 与目标计算机类型 X86 冲突 在使用Visual Studio 2012编译运行OpenCV的时候 出现错误 fatal error LNK1112 模块计算机类型 X86 与
  • Jmeter在windows10命令行启动显示此时不应有

    Jmeter在windows10命令行启动显示此时不应有 Jmeter配置路径正常 直接运行目录下的Jmeter bat也能运行 但是在命令行输入Jmeter便一直显示此时不应有 查了网上这种问题的解决方法 都是说环境变量路径问题 1 路径
  • python 正则表达式 compile_使用compile()函数编译正则表达式【Python技术文章】

    如果需要对一个正则表达式重复使用 那么可以使用compile 函数对其进行预编译 以避免每次编译正则表达式的开销 complie 函数语法格式如下 compile pattern flags 0 上述格式中的参数pattern表示一个正则表
  • input 输入框 focus更改样式

    input标签的border和outline 想要实现input在触发焦点时更改样式 通常会想到使用 focus选择器 但当使用border去更改样式时 会发现失效了 input type text focus border 1px sol
  • 内部振荡器、无源晶振、有源晶振有什么区别?

    单片机要运行起来 必须有一个时钟信号 就好像人的心跳 这个时钟信号可以由无源晶振提供 可以由有源晶振提供 目前大部分的单片机也集成了内部振荡器 今天就来聊聊这三者的区别 1 内部振荡器 单片机内部集成的振荡器 一般为RC振荡器 好多人叫 内
  • AlexNet-深度卷积神经网络(CNN卷积神经网络)

    文章目录 深度卷积神经网络 AlexNet AlexNet 模型说明 激活函数选定 模型定义 读取数据集 训练AlexNet 小结 深度卷积神经网络 AlexNet 2012年 AlexNet横空出世 它首次证明了学习到的特征可以超越出手工
  • cJSON.c 和cJSON.h (进行了额外的封装)

    1 cJSON h cJSON h Copyright c 2009 2017 Dave Gamble and cJSON contributors Permission is hereby granted free of charge t
  • EMI原理、测量、解决

  • 进制和编码

    目标 了解计算机中一些必备的尝试知识 了解常见名词背后的意义 1 python的运行方式 交互式运行 脚本式运行 2 进制 2 1 进制的转换 计算机中底层的所有数据都是0101010101的形式存在的 八进制无法直接转为2进制 十进制转其
  • 鸡兔同笼问题南阳理工学院acm64题

    问题如下 鸡兔同笼 时间限制 3000 ms 内存限制 65535 KB 难度 1 描述 已知鸡和兔的总数量为n 总腿数为m 输入n和m 依次输出鸡和兔的数目 如果无解 则输出 No answer 不要引号 输入 第一行输入一个数据a 代表
  • centos哪个版本稳定_CentOS VS Ubuntu,谁才是更好的 Linux 版本?

    几乎所有新手刚接触 Linux 时 都会被它众多的发行版本搞得一头雾水 截至目前 Linux 已经有几百个发行版本 从技术上来说 Linux 只是一个内核 内核指的是一个提供设备驱动 文件系统 进程管理 网络通信等功能的系统软件 并不是一套
  • 混合式步进电机的细分驱动(电流方式、电压方式)及Simulink仿真对比

    两相混合式步进电机的最简单模型和驱动方式 两相混合式步进电机有四个连接点 分别为a a b b a 和a 连接绕组A的两端 b 和b 连接绕组B的两端 电机的结构可以简化为如下的图示结构 电机转子可以看成一个磁铁 电机的定子上标有a b a
  • OJ刷题 第十三篇

    22102 将字符串反序 时间限制 1 秒 内存限制 128 MB 请将一个给定的字符串反序 字符长度为1到10000 且有可能包含空格 输入 反序前的字符串 输出 反序后的字符串 样例 输入 abcd 输出 dcba 答案 C 版本1 掌
  • 2021年第十二届蓝桥杯省赛A组题解(C/C++)

    2021年蓝桥杯省赛A组题解 C C 来自微信公众号 算法梦工厂 二维码见文末 欢迎加入蓝桥杯备赛群 768245918 获取往届试题 测试数据 算法课程等相关资源 A 卡片 问题描述 答案 3181 解析 涉及知识点 枚举 十进制拆分 做
  • 远程链接redis时出现错误: 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。

    Could not connect to Redis at 192 168 204 100 6379 由于连接方在一段时间后没有正确答复或连接的主机没有反应 连接尝试失败 原因 1 防火墙没有关闭 导致访问不了 解答方法一直接关闭防火墙 不
  • 软件优化Flash擦除时间长的方法

    概述 通过地址的偏移 巧妙的避开Flash擦除长时间占用CPU的使用 MCU STM32H743 编译环境 Keil 说明 基础知识可以看 Flash读写 其中包含了本代码涉及到的所有函数 原理 以空间换取时间 正文 首先要明白Flash擦