目录

  • 一、关于FLASH
    • 1.内存映射
    • 2.内部FLASH
    • 3.对内部Flash的写入过程
  • 二、工程尝试向STM32的内部FLASH写入数据
  • 三、参考资料

一、关于FLASH

1.内存映射

首先我们需要了解一个内存映射:

stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片flash大小不同。

RAM起始地址是0x2000 0000,结束地址是0x2000 0000加上芯片的RAM大小。不同的芯片RAM也不同。

Flash中的内容一般用来存储代码和一些定义为const的数据,断电不丢失,
RAM可以理解为内存,用来存储代码运行时的数据,变量等等。掉电数据丢失。

STM32将外设等都映射为地址的形式,对地址的操作就是对外设的操作。
stm32的外设地址从0x4000 0000开始,可以看到在库文件中,是通过基于0x4000 0000地址的偏移量来操作寄存器以及外设的。

一般情况下,程序文件是从 0x0800 0000 地址写入,这个是STM32开始执行的地方,0x0800 0004是STM32的中断向量表的起始地址。
在使用keil进行编写程序时,其编程地址的设置一般是这样的:

2.内部FLASH

STM32 的内部 FLASH 包含主存储器、系统存储器、 OTP 区域以及选项字节区域,它们的地址分布及大小如下:

  1. 主存储器:一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、 2M FLASH 都是指这个区域的大小。与其它 FLASH 一样,在写入数据前,要先按扇区擦除,
  2. 系统存储区:系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、 USB 以及 CAN 等 ISP 烧录功能。
  3. OTP 区域:OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改, OTP 常用于存储应用程序的加密密钥。
  4. 选项字节:选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。

3.对内部Flash的写入过程

  1. 解锁
    (1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
    (2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB
  2. 数据操作位数
    最大操作位数会影响擦除和写入的速度,其中 64 位宽度的操作除了配置寄存器位外,还需要在 Vpp 引脚外加一个 8-9V 的电压源,且其供电间不得超过一小时,否则 FLASH可能损坏,所以 64 位宽度的操作一般是在量产时对 FLASH 写入应用程序时才使用,大部分应用场合都是用 32 位的宽度。
  3. 擦除扇区
    在写入新的数据前,需要先擦除存储区域, STM32 提供了扇区擦除指令和整个FLASH 擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。
    扇区擦除的过程如下:
    (1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何
    Flash 操作;
    (2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位 SER ”置 1,并设置“扇
    区编号寄存器位 SNB”,选择要擦除的扇区;
    (3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;
    (4) 等待 BSY 位被清零时,表示擦除完成。
  4. 写入数据
    擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:
    (1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;
    (2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位 PG” 置 1;
    (3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;
    (4) 等待 BSY 位被清零时,表示写入完成。

二、工程尝试向STM32的内部FLASH写入数据

flash工程的下载链接:链接: https://pan.baidu.com/s/1sb82aKRkwCY7_2dnB2D8nA
提取码: sayf

注意:下载完成后打开文件夹,将路径stm32_Flash\Drivers\CMSIS\Device\ST\STM32F1xx\Include下的system_stm32f1xx_20190722_092746.h文件修改为system_stm32f1xx.h,否则后面编译会报错

修改好后在MDK-ARM中打开工程,可以将想要存入Flash中的内容修改为自定义内容

uint8_t FlashTest[] = "LaiYiFei25";


进行程序调试前,先完成配置:
注意:下载的工程代码调试用的是硬件 st-link debuger,不是软件仿真,因此用软件仿真做,可能情况略有不同(小编这里软件仿真就没有出现结果)
点击Options->Debug->右边使用硬件ST-Link Debugger,接着点击S T-Link Debugger右边的Settings

进入到Cortex-M Target Driver Setup的Debug页面,其中的Port选择为SW

依次点击Flash Download->勾选Reset and Run->Add->选择STM32F10x Med-density Flash->Add->确定即可

最后点击OK完成硬件配置

由于要连接硬件ST-Link,所以要下载一个STLink驱动,不然下载不成功
链接: https://pan.baidu.com/s/1TPzucyz00hNPu19imAiRZg
提取码: 1me7

连线如下图所示:

点击左上角的LOAD按钮将程序下载到STM32中:

之后点击dubug按钮,进入硬件仿真调试(断点已自动设置好):

点击View->memory windows->memory 1打开内存观察窗口,并在地址栏中输入:0x800C000,观察将要修改的flash区间区容:

其中点击某一字符右击可选择显示格式,修改为Ascii

点击View->Watch windows->Watch 1打开一个变量观察窗口:

将变量FlashWBuffFlashRBuff加入到Watch 1观察窗口

另外View->勾选Periodic Windows Update,开启变量自动更新:

按如图所示的全速运行按钮或者F5:

这时就可以看到Watch 1窗口的数组FlashRBuff中的内容与数组FlashWBuff中的内容是一样的:

同时在Memory 1窗口中可以看到在FLASH地址0x0800C000区成功写入对应内容

断电后再重新上电进行调试,程序停在main入口处时还可以看到Flash对应区间的内容保持上一次写入内容值:

三、参考资料

  1. https://www.cnblogs.com/pertor/p/9484663.html
  2. STM32学习笔记:读写内部Flash
  3. STM32 进阶教程 13 – FLASH的读写操作
  4. Flash地址空间的数据读取——STM32

了解STM32的内部FLASH空间相关推荐

  1. c语言 将结构体放在flash,stm32的内部flash读写操作(含结构体的保存)

    不同的stm32单片机的flash大小不同,这个需要查阅芯片手册或者查看STM32CubeMX软件. stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实 ...

  2. STM32 --- 使用内部FLASH存储数据

    本文记录了对一些知识点的理解.操作方法,如有错误,请务必批评指正!! 最终的测试截图: 目录​ 一.内部FLASH要点 关于地址: 关于解锁: 关于擦除: 关于写入: 二.读取数据 三.存储数据 四. ...

  3. STM32读写内部flash

    概念:计算机中最小的信息单位是bit,也就是一个二进制位,8个bit组成一个Byte,也就是1个字节, 1个存储单元存放1个字节,每个存储单元对应一个32位(bit)地址,所以重要的话说三遍:对于32 ...

  4. STM32读写内部Flash(介绍+附代码)

    概述 内部flash读写详解 一.介绍 首先我们需要了解一个内存映射: stm32的flash地址起始于0x0800 0000,结束地址是0x0800 0000加上芯片实际的flash大小,不同的芯片 ...

  5. STM32之内部FLASH例程

    #include "stm32f10x.h" #include <string.h>/* STM32 内部 FLASH 配置 */ #define STM32_FLAS ...

  6. STM32之内部FLASH原理

    不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了 1024K 字节.市面上 STM32F1 开发板使用的芯片是 STM32F103系列,其 FLASH ...

  7. 一.stm32的内部flash操作笔记

    一.在文件stm32f4xx_hal_flash_ex.h中有对应的文件标号定义如下: /*--------------------------------------- STM32F40xxx/ST ...

  8. STM32系列内部Flash擦写程序

    stm32内部Flash擦写流程,对于FLash必须按页擦写,不同型号的flash页大小不同,需要根据实际修改 #define FLASH_PAGE_SIZE 2048 //定义Flash页大小,RC ...

  9. STM32单片机内部FLASH使用注意事项

    目录 1.前言 2.STM32 F1.F4.L1系列内部FLASH分区及大小 1.STM32F1系列 2.STM32F4系列 3.STM32L1系列 3.STM32 F1.F4.L1系列内部FLASH ...

  10. STM32的内部Flash读写

    内部Flash官方手册介绍 STM官方关于stm32F103系列的芯片有一个专门介绍flash读写的手册.STM32F100xx超值型产品闪存编程手册 通过J-Link查看自己的芯片内部的flash大 ...

最新文章

  1. 【BZOJ】2333: [SCOI2011]棘手的操作
  2. scrapy-redis组件写分布式爬虫实战
  3. 备份表到存在的表或者自动新建表
  4. linux轻量级进程LWP
  5. StringCollection FAQ [C#, BCL]
  6. java 的io流需要学吗_Java的IO流之字节流,必须要学得内容,你会嘛?
  7. vivo Y66的usb调试模式在哪里,打开vivo Y66usb调试模式的流程
  8. java计算机毕业设计家教管理系统源码+mysql数据库+系统+lw文档+部署
  9. 能够正常加入域但无法实施域策略
  10. numeric scale mysql_MySQL基础教程1 — 数据类型之数值类型 - numeric
  11. 零基础搭建Win系统Anaconda+Pytorch+OpenCV深度学习环境(Win10、Win11、RTX 3090显卡也适用)
  12. 【心理咨询师考试笔记】操作技能(四)——心理咨询方法
  13. vb.net(C#)调用CAD并画图
  14. 体脂秤方案开发脂肪秤方案设计
  15. python学习(一)
  16. linux学习---brk(), sbrk() 用法
  17. electron入门——安装及创建项目
  18. 全球及中国硬质合金钻头行业动态分析及投资前景预测报告2022-2027年
  19. 多米机器人教材_祝博士多米机器人首次进入公校课堂, 科技辅助教学培养学生全面发展!...
  20. 基于javaweb+mysql的就业管理系统设计和实现(java+springboot+ssm)

热门文章

  1. unity2018关联不到vs_Unity2018 VS2017打开CS脚本,提示全红及无法加载工程等问题解决...
  2. conda 转载自 生信技能树
  3. 用计算机数字表白,表白数字密码暗号大全 高级表白密码
  4. Spring Boot 的 JSON RPC(客户端示例) - briandilley/jsonrpc4j Wiki
  5. Recyclerview-BRVAH使用
  6. idea导入项目框架的方法
  7. IDEA导入本地项目
  8. 线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(一)
  9. html编写代码制作网站教程,html代码编写教程
  10. C语言面试题 - 指针概念