当前位置: 首页 > news >正文

STM32学习笔记:读写内部FLASH

ST提供的库函数基本能搞定

简介

由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行,亦可当做EEROM来使用保存所需要的数据,以便下次启用读取数据

注:操作环境为STM32F103ZET6 的 FLASH 容量为 512K 字节,属于大容量产品
在这里插入图片描述
STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。

☆主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)

☆系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、USB 以及 CAN 等 ISP 烧录功能

☆选项字节用于配置 FLASH 的读写保护、待机/停机复位、软件/硬件看门狗等功能,这部分共 16 字节。可以通过修改 FLASH 的选项控制寄存器修改对主存储器和信息块的写入由内嵌的闪存编程/擦除控制器(FPEC)管理;编程与擦除的高电压由内部产生。

在执行闪存写操作时,任何对闪存的读操作都会锁住总线,在写操作完成后读操作才能正确地进行;既在进行写或擦除操作时,不能进行代码或数据的读取操作。

STM32 闪存的编程每次必须写入 16 位(不能单纯的写入 8 位数据哦!),当 FLASH_CR 寄存器的 PG 位为’1’时,在一个闪存地址写入一个半字将启动一次编程;写入任何非半字的数据,FPEC 都会产生总线错误。在编程过程中(BSY 位为’1’),任何读写闪存的操作都会使 CPU
暂停,直到此次闪存编程结束

闪存的编程和擦除

STM32 的闪存编程是由 FPEC(闪存编程和擦除控制器)模块处理的,这个模块包含 7 个32 位寄存器,他们分别是:
⚫ FPEC 键寄存器(FLASH_KEYR)
⚫ 选择字节键寄存器(FLASH_OPTKEYR)
⚫ 闪存控制寄存器(FLASH_CR)
⚫ 闪存状态寄存器(FLASH_SR)
⚫ 闪存地址寄存器(FLASH_AR)
⚫ 选择字节寄存器(FLASH_OBR)
⚫ 写保护寄存器(FLASH_WRPR)

主要擦除操作步骤为:

⚫ 检查 FLASH_CR 的 LOCK 是否解锁,如果没有则先解锁
⚫ 检查 FLASH_SR 寄存器的“ 忙碌寄存器位BSY ”,以确认没有其他正在进行的闪存操作
⚫ 设置 FLASH_CR 寄存器的 “激活页擦除寄存器位PER ”为’1’
⚫ 用 FLASH_AR 寄存器选择要擦除的页
⚫ 设置 FLASH_CR 寄存器的 “开始擦除寄存器位 STRT ”为’1’ ,开始擦除
⚫ 等待 BSY 位变为’0’
⚫ 等待 BSY 位被清零时,表示擦除完成。

写入数据

擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
(2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1;
(3) 向指定的 FLASH 存储器地址执行数据写入操作,每次只能以 16 位的方式写入;
(4) 等待 BSY 位被清零时,表示写入完成。

擦除扇区

在写入新的数据前,需要先擦除存储区域, STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
扇区擦除的过程如下:
(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何
Flash 操作;
(2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇
区编号寄存器位 SNB”,选择要擦除的扇区;
(3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
(4) 等待 BSY 位被清零时,表示擦除完成。

查看工程内存的分布

由于内部 FLASH 本身存储有程序数据,若不是有意删除某段程序代码,一般不应修改程序空间的内容,所以在使用内部 FLASH 存储其它数据前需要了解哪一些空间已经写入了程序代码,存储了程序代码的扇区都不应作任何修改。通过查询应用程序编译时产生的“ *.map”后缀文件.
打开 map 文件后,查看文件最后部分的区域,可以看到一段以“ Memory Map of the image”开头的记录(若找不到可用查找功能定位)

RO-data表示程序定义的常量const temp;

RW-data表示已初始化的全局变量

ZI-data表示未初始化的全局变量
在这里插入图片描述这一段是某工程的 ROM 存储器分布映像,在 STM32 芯片中, ROM 区域的内容就是 指存储到内部 FLASH 的代码。
在上面 map 文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是 STM32 内部 FLASH 的首地址,即 STM32 的程序存储空间就直接是执行空间;它们的大小(Size)分别为 0x00000b50 及 0x00000b3c,执行空间的 ROM 比较小的原因就是因为部分 RW-data 类型的变量被拷贝到 RAM 空间了;它们的最大空间(Max)均为 0x00100000,即 1M 字节,它指的是内部 FLASH 的最大空间。

计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用
的内部 FLASH 是从 0x08000000 至(0x08000000+0x00000b50)地址的空间区域。
所以从扇区 1(地址 0x08004000)后的存储空间都可以作其它用途,使用这些存储空间时不会篡改应用程序空间的数据。

通过测试F1系列硬石科技的标准库函数,可成功读取以及写数据在里面

相关文章:

  • Git 实战(三) | Github 必会高频基础命令与 IDE 的 Git 集成
  • Docker 镜像构建可以分享的快乐
  • ADC_内部电路Rsh和Csh和转换速率Tconv以及频率fs
  • Hive的基本操作
  • vue、vscode格式规范prettier、eslint、git commit
  • Revit中门窗如何使用遮罩区域?及CAD生成门窗?
  • windows下使用docker
  • c# iot .net 6 树莓派 读取光敏传感器四针+模拟转数字模块 代码实例
  • Hexagon_V65_Programmers_Reference_Manual(37)
  • JSD-2204-(业务逻辑开发)-续开发购物车功能-新增订单功能-Leaf-Day10
  • 计算机中常见英文术语对照表
  • Django--request 对象
  • 清华推出“脑机绘梦”,把脑电信号变成绘画元素!雨果奖得主用了也说好
  • 嫦娥奔月html+css
  • 金仓数据库 KingbaseES 插件参考手册 S(5)
  • 时间复杂度分析经典问题——最大子序列和
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • css系列之关于字体的事
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • Flex布局到底解决了什么问题
  • If…else
  • Java面向对象及其三大特征
  • Promise初体验
  • SAP云平台里Global Account和Sub Account的关系
  • TCP拥塞控制
  • web标准化(下)
  • 机器学习 vs. 深度学习
  • 基于webpack 的 vue 多页架构
  • ------- 计算机网络基础
  • 前端之React实战:创建跨平台的项目架构
  • 思考 CSS 架构
  • 优化 Vue 项目编译文件大小
  • 阿里云重庆大学大数据训练营落地分享
  • #宝哥教你#查看jquery绑定的事件函数
  • (9)目标检测_SSD的原理
  • (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (七)Java对象在Hibernate持久化层的状态
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .Net 代码性能 - (1)
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • @test注解_Spring 自定义注解你了解过吗?
  • []常用AT命令解释()
  • [Android] Implementation vs API dependency
  • [android] 切换界面的通用处理
  • [Angularjs]asp.net mvc+angularjs+web api单页应用
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • [C++] 统计程序耗时