本次分享关于STM32内部FLASH的笔记。

STM32 芯片内部的 FLASH 存储器,主要用于存储我们代码。如果内部FLASH存储完我们的代码还有剩余的空间,那么这些剩余的空间我们就可以利用起来,存储一些需要掉电保存的数据。

本文以STM32103ZET6为例。STM32103ZET6属于大容量产品,其闪存模块组织如下:

其主存储器大小为512KB,分为256页,每页大小都为2KB。我们的程序一般默认烧写到第0页的起始地址(0x08000000)处。当BOOT0引脚和BOOT1引脚都接GND时,就是从这个地址开始运行代码的。这个地址在keil中可以看到:

假如我们要下载的程序大小为4.05KB,则第0、1、2页用于保存我们的程序,我们需要掉电保存的数据只能保存在第3页至第255页这一部分空间内。我们最终要下载的程序大小可在工程对应的.map文件中看到。.map文件可以双击工程的Target的名字快速打开,如:

下面对STM32的内部FLASH进行简单的读写测试:

STM32的内部FLASH读写测试

过程图如下(省略异常情况,只考虑成功的情况):

示例代码:

本例的关键代码如下:

(1)进行解锁操作

STM32 的闪存编程是由内嵌的闪存编程/擦除控制器(FPEC)管理 ,这个模块包含的寄存器如下:

STM32 复位后, FPEC 模块是被保护的, 不能写入 FLASH_CR 寄存器; 通过写入特定的序列到 FLASH_KEYR 寄存器可以打开 FPEC 模块(即写入 KEY1 和KEY2) , 只有在写保护被解除后, 我们才能操作相关寄存器。 固件库中的函数为:

void FLASH_Unlock(void);

(2)擦除将要写的页

STM32 的 FLASH 在编程的时候,也必须要求其写入地址的 FLASH 是被擦除了的(也就是其值必须是 0XFFFF),否则无法写入,在 FLASH_SR 寄存器的 PGERR 位将得到一个警告。 STM32 的闪存擦除分为两种:页擦除和整片擦除。 也就是其最小擦除单位为1页,尽管你只需往某页里写10个字节数据或者更少的数据,你也必须先擦除该页(2*1024个字节)。我们这里使用按页擦除,固件库中按页擦除的函数为:

FLASH_Status FLASH_ErasePage(uint32_t Page_Address);

其返回值为枚举:

(3)往上一步擦写成功的页写入数据

STM32 闪存的编程每次必须写入16 位。虽然固件库中有如下三个写操作的函数:

分别为按字(32bit)写入、按半字(16bit)写入、按字节(8bit)写入函数。32 位字节写入实际上是写入的两次 16 位数据,写完第一次后地址+2,这与我们前面讲解的 STM32 闪存的编程每次必须写入 16 位并不矛盾。 写入 8 位实际也是占用的两个地址了,跟写入 16 位基本上没啥区别。

(4)写入操作完成后进行上锁操作

对FLASH进行写操作完成后要进行上锁操作,对应的固件库中函数为:

void FLASH_Lock(void);

(5)读出数据

固件库中并没有与读操作的函数。读操作其实就是读取FLASH某个地址的数据。

(6)对比写入的数据与读出的数据是否相等

最后对比我们写入的数据与读出的数据是否完全一致,若一致则表明读写测试成功,否则失败。

程序执行结果:

可见,读出的数据与写入的数据一致,表明读写测试成功。

最后

STM32的内部FLASH读写步骤大致如上,有时候我们还需要封装一些读写函数,但步骤大都如上。写入数据之前需要先进行擦除操作。以上就是本次的笔记分享,如有错误,欢迎指出!

map文件分析 stm32_使用STM32内部Flash额外的空间来存储数据相关推荐

  1. map文件分析 stm32_浅谈STM32的启动过程

    分享这篇文章,谈一下STM32启动流程.如果读者朋友已经有过汇编相关基础,能够够好理解本文内容.汇编语言是比C语言更接近机器底层的编程语言,能让我们更好的理解和操纵硬件底层. STM32三种启动模式 ...

  2. STM32 内部Flash读写 程序源码 [已验证]

    目录 STM32 内部Flash带缓存读写 程序源码 0 Macro 1.Flash_Erase 2. Flash_Read_Byte 3.Flash_Write_NoBuffer 4.Flash_W ...

  3. STM32内部flash详解(1)

    STM32 内部FLAsh概述 今天说一下STM32中的内部flash. 当我们把写好的代码下载MCU中,这个代码时存放在flash中的.当芯片重启复位上电后,会通过内核对flash进行代码的加载运行 ...

  4. STM32CubeMX系列|STM32内部FLASH

    STM32内部FLASH 1. 内部FLASH简介 之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLA ...

  5. stm32内部Flash读写

    文章目录 1.stm32内部flash介绍 2.读写驱动编写 3.源码 上篇文章讲到了STM32来驱动外部flah的操作,flash真是好东西啊,内存大,能存的东西多,这样我们就可以用它来做一些大点的 ...

  6. 读写STM32内部flash读写代码

    读写STM32内部flash读写代码 由于老师的要求,所以写了一份读写STM32内部FLASH的代码,这样的话就可以把STM32里面没有用来保存代码段的部分用来存储数据了. 由于<stm32fl ...

  7. STM32 KEIL里的MAP文件分析

    一.要让Keil生成map文件,要设置: 再重新编译,没有错误后,就会生成map文件了. 二.map文件中相关概念: 段(section) :描述映像文件的代码和数据块. RO:Read-Only的缩 ...

  8. c语言flash里能存文件吗,STM32内部FLASH打包读写

    最近做到的项目在运行需要把一组uint8_t(unsigned char)的数据进行掉电储存,想到单片机STM32f030f4p6内部flash可以直接由程序操作,写了以下代码用于uint8_t数据打 ...

  9. STM8S103 解决Rom空间不足 Map文件分析

    STM8S103只有8KRom,很容易造成空间不足.对于空间不足,我们就要从map文件着手分析,究竟哪些函数占了多少空间,map文件分为几部分:Segments(总括了各个段所占的空间), Modul ...

最新文章

  1. 浅谈几种区块链网络攻击以及防御方案之拒绝服务攻击
  2. Nginx+Tomcat实现反向代理与动静分离
  3. 全网最火的Nacos源码构建,你找不到第二个有我仔细的!!
  4. 鸿蒙系统方舟运行时,方舟编译器立功!第三方App已经落地,距离鸿蒙系统还会远吗?...
  5. Android 多进程调试技巧
  6. 记录一次【模仿真实环境】的内网漫游
  7. 收货地址 - 删除收货地址
  8. (五) shiro web应用
  9. oracle数据包对交换机要求,Exalogic Ethernet交换机配置的备份与还原
  10. 那些对你说学历不重要,技术重要的人,他们大部分都是有学历的。
  11. Spring Cloud 入门 之 Hystrix 篇(四)
  12. Linux系统启动过程分析
  13. python语言程序设计实验题p181答案_2010年新版教材自考网络操作系统02335_复习笔记...
  14. 答案原文翻译及解析《避凶就吉精明鬼,千变万化心不变》是指什么意思?
  15. 【Python】TX云服务器下CentOS+Python3+Nginx+uwsgi+Bottle搭建Web服务
  16. 耦合度如何降低耦合度
  17. CMD连接MySQL,本地phpAdmin登陆
  18. 什么是React为什么使用React什么时候使用React
  19. 服务器应用程序不可用的问题
  20. 知乎点赞过万留学生自述:我们为什么需要代写???

热门文章

  1. VBS编程基础教程 (第5篇)
  2. 算法高级(41)-推荐算法实现
  3. Linux 下的 Docker 安装与使用
  4. win8超极本盘符误删找回数据的办法
  5. 当当并购重组了,我们还有书读吗?
  6. 我的worktools集合们
  7. React Native商城项目实战04 - 封装TabNavigator.Item的创建
  8. C/C++二维数组分配内存
  9. 微软IT规划方法论解读
  10. Windows内存管理(3)--检查内存可用性,结构化异常处理 和 ASSERT