STM32单片机Flash模拟EEPROM

2023-11-07

摘要

STM32单片机都带有ROM和RAM,其中STM32根据自身的ROM(Flash)可以分为小容量产品、中容量产品、大容量产品

根据FLASH容量可以分为:

  • 小容量:0-32K
  • 中容量:64-128K
  • 大容量:256K以上(包含256K)

按照不同容量,存储器组织成32个1K字节/页(小容量)、128个1K字节/页(中容量)、256个2K字 节/页(大容量)的主存储器块和一个信息块,各容量的页大小如下图所示
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地
进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。
信息块分为两个部分:

  • 系统存储器是用于存放在系统存储器自举模式下的启动程序,这个区域只保留给ST使用,启动程序使用USART1串行接口实现对闪存存储器的编程;ST在生产线上对这个区域编程并锁定以防止用户擦写。关于使用这个启动程序的详细信息,请参阅AN2606。
  • 选择字节

对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。
闪存存储器有两种保护方式防止非法的访问(读、写、擦除):

  • 页写入保护
  • 读出保护

正文

说了这么多的官方语言,无非就是将STM32单片机是用不到的ROM部分当做存储盘来用而已,保存一些读写频率比较低的数据而已
说道保存数据,无非就是 读 写 擦除 保护等等

前言

现在 STM32 的 FLASH 寿命是 10000 次,如果不是频繁的擦除和写入,使用FLAHS模拟EEPROM是没有毛病的,但是要注意的是,存取数据的位置尽量靠后,要给代码留下足够的空间,不然就尴尬了
stm32是32bit处理器,所以它的字是32bit的(一次处理4字节长度的数据)。半字自然就是16bit(2字节);字节是8bit
FLASH的读写都是以半字为单位的

读的话就相对更简单了,有了对应的地址,直接去地址中的内容就可以了

  • 举例
    要读取 地址0x08030000出的内容*((vu16*)0x08030000); 就可以将该位置的内容读取出来了
    要想读取多个字节
void STMFLASH_Read(u32 ReadAddr,u16 *pBuffer,u16 NumToRead)   	
{
	u16 i;
	for(i=0;i<NumToRead;i++)
	{
		pBuffer[i]=*((u16*)(ReadAddr));//读取两个字节.
		ReadAddr+=2;//地址向后偏移2个字节.	
	}
}

对于大容量产品,从第0页至第61页,写保护是以每2页为单位实现的,剩下的存储器块(第62页至第255页)则是同时提供保护。对于小容量和中容量的产品,写保护是以每4页为单位实现的。
如果试图在一个受保护的页面进行编程或擦除操作,在闪存状态寄存器(FLASH_SR)中会返回一个保护错误标志。
在写入之前需要解除闪存锁

  • RDPRT键 = 0x000000A5
  • KEY1 = 0x45670123
  • KEY2 = 0xCDEF89AB
    复位后,FPEC模块是被保护的,不能写入FLASH_CR寄存器;通过写入特定的序列到FLASH_KEYR寄存器可以打开FPEC模块,这个特定的序列是在FLASH_KEYR写入两个键值(KEY1和KEY2,见2.3.1节);错误的操作序列都会在下次复位前锁死FPEC模块和FLASH_CR寄存器。
    写入错误的键序列还会产生总线错误;总线错误发生在第一次写入的不是KEY1,或第一次写入的是KEY1但第二次写入的不是KEY2时;FPEC模块和FLASH_CR寄存器可以由程序设置FLASH_CR寄存器中的LOCK位锁住,这时可以通过在FLASH_KEYR中写入正确的键值对FPEC解锁。
解锁
void FLASH_Unlock(void)
{
  /* Authorize the FPEC of Bank1 Access */
  FLASH->KEYR = FLASH_KEY1;
  FLASH->KEYR = FLASH_KEY2;
}

有解锁就有上锁

上锁
void FLASH_Lock(void)
{
  /* Set the Lock Bit to lock the FPEC and the CR of  Bank1 */
  FLASH->CR |= CR_LOCK_Set;//CR_LOCK_Set是((uint32_t)0x00000080)
}

为什么是CR_LOCK_Set是((uint32_t)0x00000080)
请看FLASH—CR寄存器的第七位
在这里插入图片描述

擦除

闪存可以按页擦除,也可以整片擦除。

页擦除

闪存的任何一页都可以通过FPEC的页擦除功能擦除;擦除一页应遵守下述过程:

  • 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作
  • 设置FLASH_CR寄存器的PER位为’1’
  • 用FLASH_AR寄存器选择要擦除的页
  • 设置FLASH_CR寄存器的STRT位为’1’
  • 等待BSY位变为’0’
  • 读出被擦除的页并做验证
FLASH_Status FLASH_ErasePage(uint32_t Page_Address)
{
  FLASH_Status status = FLASH_COMPLETE;
  /* Check the parameters */
  assert_param(IS_FLASH_ADDRESS(Page_Address));
  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(EraseTimeout);
  
  if(status == FLASH_COMPLETE)
  { 
    /* if the previous operation is completed, proceed to erase the page */
    FLASH->CR|= CR_PER_Set;
    FLASH->AR = Page_Address; 
    FLASH->CR|= CR_STRT_Set;
    
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(EraseTimeout);
    
    /* Disable the PER Bit */
    FLASH->CR &= CR_PER_Reset;
  }
  /* Return the Erase Status */
  return status;
}
整片擦除

可以用整片擦除功能擦除所有用户区的闪存,信息块不受此操作影响。建议使用下述过程:

  • 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作
  • 设置FLASH_CR寄存器的MER位为’1’
  • 设置FLASH_CR寄存器的STRT位为’1’
  • 等待BSY位变为’0’
  • 读出所有页并做验证
FLASH_Status FLASH_EraseAllPages(void)
{
  FLASH_Status status = FLASH_COMPLETE;
  /* Wait for last operation to be completed */
  status = FLASH_WaitForLastOperation(EraseTimeout);
  if(status == FLASH_COMPLETE)
  {
    /* if the previous operation is completed, proceed to erase all pages */
     FLASH->CR |= CR_MER_Set;
     FLASH->CR |= CR_STRT_Set;
    
    /* Wait for last operation to be completed */
    status = FLASH_WaitForLastOperation(EraseTimeout);

    /* Disable the MER Bit */
    FLASH->CR &= CR_MER_Reset;
  }
  /* Return the Erase Status */
  return status;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32单片机Flash模拟EEPROM 的相关文章

  • AS3 是否可以复制 Shape 对象?

    我正在尝试制作一个可用于复制的形状 这是我所做的 我正在尝试做的以及我陷入困境的解释 在 Flash IDE 画笔 中手动绘制形状 创建了一个包含形状的新影片剪辑 作为一个类导出 实例化该类 var mc MovieClip new sha
  • Flex 与 ActionScript

    我正在尝试构建 实现一个 Flash 视频播放器来播放视频 我研究了 Flex 并仅使用 VideoElement 构建了一个基本应用程序 它在没有静态链接库的情况下编译为 41k 在链接库时编译为 300k 我生成了报告 但仍然不确定为什
  • 我应该等待 Flash Player 10.1 还是使用 Flash Lite 3 来为手机和设备开发 Flash 内容

    Adobe 将在 2010 年第一季度推出 Flash Player 10 1 这将在桌面和移动设备上提供一致的运行时 因此我假设如果它是为 Web 构建的 那么它也可以在移动设备上运行 我即将开始为手机开发基于 Flash 的应用程序 我
  • Flash 照片上传 - 从网络摄像头拍摄照片 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 JW Player 5.1 中提取 .flv 流?

    问题是我的互联网连接速度很慢 并且视频不像 YouTube 那样缓冲 因此我想知道是否可以提取 JW Player 中正在流式传输的 flv 文件的 url 并直接下载它 做了一些初步研究 我发现了以下信息 主要视频网址 http ijf1
  • Flash 图表和图形的最佳解决方案是什么? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道融合图表 http www fusioncharts com 还有其他好的解决方案或 API 用
  • 使用 flash 或 java servlet 将麦克风数据从浏览器上传到服务器的教程? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 There was a question on how to get data from a microphone on a client
  • Youtube as3 API 似乎不再起作用

    我正在使用 as3 Youtube 官方 API 我需要在 swf 文件中加载 API 播放器 我已经在几个项目上完成了 一切都很好 但几个小时后 我的所有项目现在都坏了 这是崩溃的代码片段 Security allowDomain www
  • FloorPlanner 应用程序的 SVG/Canvas 与 Flash

    我计划创建一个平面图应用程序 允许用户使用鼠标绘制 调整大小 移动和旋转对象 我只是想知道使用 Flash 或 Javascript 是否会更好 如果使用 Javascript 我应该使用 canvas 还是 SVG 该应用程序将允许拖动选
  • 使用 flash/flex 在客户端硬盘上下载/保存/写入文件

    我想知道如何下载 保存 写入文件我的服务器 to a 客户的计算机使用闪光灯或柔性 我正在寻找的示例可以在http www flexdownloads com http www flexdownloads com Sign up Sign
  • 有没有其他方法可以在delphi上观看youtube视频?

    我看到http www delphiflash com demo youtube video http www delphiflash com demo youtube video关于如何在 delphi 上加载 flash 视频 但它不是
  • 用于商业 Web 应用程序的 Flash - 为什么不呢?

    我从事开发商业网络应用程序的行业 它们大多供内部使用 有时有合作伙伴区域 但很少可供公共互联网使用 它们是帮助公司运营业务的应用程序 一段时间以来 我有一个想法困扰着我 为什么不使用 Flash 到现在为止都是ASP NET AJAX 这还
  • 我可以将 Pepper Flash 捆绑在 Electron.js 应用程序中以在 2021 年以后运行 Flash 吗?

    所以 我已经关注了https www electronjs org docs tutorial using pepper flash plugin https www electronjs org docs tutorial using p
  • 是否值得为 EEPROM 实现小型文件系统

    我买了一个I2C EEPROM 我想存储传感器和电压数据 我假设该值可以大于一个字节 并且可以有很多数据 在这种情况下是否值得实现具有小文件分配表的文件系统 例如 这会让我更容易查看 EEPROM 我发现 EEPROM 上出现 FAT 有两
  • ExternalInterface 是否适用于 file: 协议?

    任何人都可以确认ExternalInterface可以在file 协议 或者指向一些说不会的文档 开始看起来这行不通了 says 在两者之间的任一方向编写脚本 本地 HTML 文件和本地 SWF 文件 例如 使用 外部接口类 要求 HTML
  • ActionScript 2 移动对象

    我对 ActionScript 知之甚少 我有一个电影剪辑 我希望当我按下按钮 按钮或影片剪辑 时它沿 x 轴移动我不知道要使用什么代码 因为它需要是 Action Script 2 是否有教程或其他东西可以完成此任务 我找到了一个教程 当
  • Javascript 桥接到 Flash 以在 Flash 中存储 SO“cookie”

    读完这个问题后如何唯一地识别访问我网站的计算机 https stackoverflow com questions 216542 how do i uniquely identify computers visiting my web si
  • 移动影片剪辑时的视觉错误

    在我尝试创建一个简单的类似乒乓球的游戏时 我遇到了一个非常奇怪的 有时甚至是严重的视觉错误 当我设置球 Flash CS 5 5 库 MovieClip 以相当快的速度在屏幕上移动时 我注意到有时球的边缘会在其移动方向上被短暂切断 当它发生
  • 最好的 Flash 音频/视频 + 交互服务器?

    我正在寻找有关 Flash 实时服务器的建议 目前 我们使用 Moock 的组合Unity http www moock org unity and Red5 http osflash org red5 但有几个问题 首先 我们正在转向 A
  • flash 10 正交投影

    我一直在尝试新的 flash 10 3d 可能性 发现在 3d 中旋转精灵相当容易 var card Sprite new MyCard card x 100 card y 100 card z 200 card rotationX 60

随机推荐

  • ChatGPT的接口在哪

    ChatGPT本身不是一个独立的接口 而是一个预训练的自然语言处理模型 如果您需要使用ChatGPT来实现某个自然语言处理任务 例如文本生成 问答等 您可以使用Python中的深度学习框架 如TensorFlow PyTorch 加载预训练
  • 谈我对于ajax的理解

    Ajax的全称是Asynchronous JavaScript and XML 中文名称定义为异步的JavaScript和XML Ajax是Web2 0技术的核心由多种技术集合而成 使用Ajax技术不必刷新整个页面 只需对页面的局部进行更新
  • qt 信号槽默认参数 toggled 和 trigger的区别

    toggled和trigger区别 1 toggle 类似开关 具有2个状态 打开 关闭 使用这个信号 是在这2个状态之间切换 2 trigger是一次性的 点击后 无法改变状态 要么是打开 要么是关闭 参考 http blog csdn
  • c# 对txt文件的读取与写入

    C txt文件分析 读取与写入 c 中对txt文件的读取写入在工作中用到的很多 今天写一个之前工作中用到的小demo 案例场景要求 txt文件中为很多条标记时间戳的报文 需要计算出每条报文从开始接收到结束用了多长时间 案例执行 如txt文件
  • Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法 为什么要学习数据结构和算法 这里我举个简单的例子 编程好比是一辆汽车 而数据结构和算法是汽车内部的变速箱 一个开车的人不懂变速箱的原理也是能开车的 同理一个不懂数据结构和算法的人也能编程 但是如果一个开车
  • apk文件 -- 反编译

    源博客 https www cnblogs com mfrbuaa p 4588057 html 编译工具 apktool 资源文件获取 能够提取出图片文件和布局文件进行使用查看 dex2jar 将apk反编译成java源代码 classe
  • Python中多线程和线程池的使用方法

    Python是一种高级编程语言 它在众多编程语言中 拥有极高的人气和使用率 Python中的多线程和线程池是其强大的功能之一 可以让我们更加高效地利用CPU资源 提高程序的运行速度 本篇博客将介绍Python中多线程和线程池的使用方法 并提
  • ad9361收发异常问题分析

    最近在调试ad9361 发送都调试好了 但是接收一直没调试好 折腾了一个多月才搞定接收 根据官方提供的api代码 需要修改的有 1 修改reference clk rate参考时钟 2 修改xo disable use ext refclk
  • CTF——被改错的密码

    http ctf idf cn index php g game m article a index id 29 cca9cc444e64c8116a30la00559c042b4看着像一串MD5加密 但是实际不是 去掉中间的l 进行md5
  • 新手小白一看就懂的Excel技能之入门基础

    很多同学开开心心拿到新买的电脑 开机一看 桌面干干净净的 想打开Excel 半天找不到 这些痛 只有新手小白才能懂 今天 我给大家好好讲讲怎么使用Excel 鼠标左键点击电脑桌面左下角的 搜索 输入 Excel 看到 Microsoft O
  • 过拟合现象,原因,以及降低过拟合的方法

    一 什么是过拟合 为什么要避免过拟合 图1 1 Overfit Normal 上图是一张使用线性回归拟合二维样本数据的matlab输出图片 其中Normal曲线是使用使用了带参数空间限制的最小二乘法进行求解的模型 Overfit曲线是使用最
  • 微服务中常用的注解

    注解的定义 Annotation 注解 用于为Java代码提供元数据 简单理解注解可以看做是一个个标签 用来标记代码 是一种应用于类 方法 参数 变量 构造器及包的一种特殊修饰符 1 Target 表示该注解类型所使用的程序元素类型 结合E
  • 机器学习实践(一)—sklearn之概述

    1956年 人工智能元年 人类能够创造出人类还未知的东西 这未知的东西人类能够保证它不误入歧途吗 一 机器学习和人工智能 深度学习的关系 机器学习是人工智能的一个实现途径 深度学习是机器学习的一个方法发展而来 二 机器学习 深度学习的应用场
  • Office 2019 for Mac 安装

    1 下载微软官方Office 2019 for Mac 64位 大小 1 7G 2 按照提示安装Office 2019 for Mac 3 下载14743217 Microsoft Office 2019 VL Serializer安装器
  • 发qq邮件被对方服务器拒绝,QQ被对方拉黑了。我发QQ邮件对对方能收到吗?

    QQ被对方拉黑了 我发QQ邮件对对方能收到吗 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 QQ被对方拉黑了 我发QQ邮件对对方能收到吗 拉黑删除能收到的 邮件
  • Scrapy实战案例--抓取股票数据并存入SQL数据库(JS逆向)

    目标网址 http webapi cninfo com cn marketDataZhishu 之前在这篇文章里面对该网站的JS进行了一个逆向的解析 JS逆向解析案例 接下来我们来创建一个Scrapy项目来爬取某潮的数据并保存在数据库中 过
  • 基于LayUI+Servlet的权限管理系统的设计

    权限管理是所有后台系统的都会涉及的一个重要组成部分 主要目的是对不同的人访问资源进行权限的控制 避免因权限控制缺失或操作不当引发的风险问题 如操作错误 隐私数据泄露等问题 本系统基于JSP Servlet JDBC LayUI的技术 在系统
  • WebRTC打开本地摄像头

    本文使用WebRTC的功能 打开电脑上的摄像头 并且把摄像头预览到的图像显示出来 纯网页实现 能支持除IE外的多数浏览器 手机浏览器也可用 本文链接 引入依赖 我们需要引入adapter latest js 这个WebRTC adapter
  • 计算机中模板与母版的区别,ppt中母版模板主题版式之间的区别和联系?

    ppt中母版模板主题版式之间的区别和联系 由会员分享 可在线阅读 更多相关 ppt中母版模板主题版式之间的区别和联系 1页珍藏版 请在人人文库网上搜索 1 模板是现成的样式 包括图片动画等 直接输入内容就可以使用了 母版是自己设计模板的菜单
  • STM32单片机Flash模拟EEPROM

    摘要 STM32单片机都带有ROM和RAM 其中STM32根据自身的ROM Flash 可以分为小容量产品 中容量产品 大容量产品 根据FLASH容量可以分为 小容量 0 32K 中容量 64 128K 大容量 256K以上 包含256K