STM32 实现内部Flash的读写(HAL库版)

发布者:平凡的梦想最新更新时间:2025-02-18 来源: cnblogs关键字:STM32  内部Flash  读写 手机看文章 扫描二维码
随时随地手机看文章

  Flash 中文名字叫闪存,是一种长寿命的非易失性(断电数据不丢失)的存储器。可以对称为块的存储器单元块进行擦写和再编程,在进行写入操作之前必须先执行擦除。一个Nand Flash由多个块(Block)组成,每个块里面又包含很多页(page)。每个页对应一个空闲区域/冗余区域(spare area),这个区域不是用来存储数据的,用于放置数据的校验值检测和纠错的。块,是Nand Flash的擦除操作的基本/最小单位。页,是Nand Flash的写入操作的基本/最小的单位。

  首先简要写一下FLASH的读写流程:

    对FLASH写入数据

    解锁FLASH

    擦除FLASH

    写入数据到FLASH

    锁住FLASH  

          FLASH读取数据 (直接读取相应的FLASH地址即可)

  操作MCU里的Flash,还有几个注意事项:

  1、往Flash写入数据的时候,要先对要写入的页进行擦除,如果要写的页里有数据,要先读出来在缓存区,再把页擦除,再写入数据;在擦除页之后,只要这次你写的数据大小不够一页,可以连续写入。

  2、要计算好程序的内存,因为你的程序也是保存在MCU的Flash里的,如果你操作到保存着程序的内存,程序就会死掉,至于程序内存怎么看,你可以生成bin文件,bin文件的大小就是你程序所占内存的大小了,生成bin文件可以参考博客:https://www.cnblogs.com/xingboy/p/10818813.html;程序内存基本都是从Flash内存一开始存起的,这里以STM32Fo72c8t6举例,如下图。

 

 

 

  看图可以看出,这个芯片的Flash内存范围是 0x0800 0000 ~ 0x0802 0000  ,假设我要烧录进去的bin文件为10K,那我们操作Flash的时候,地址就要从 0x0800 0000 +  (0x400*11) 开始,避开程序的存储位置,Flash地址偏移1位就是1个字节。

  3、要注意MCU一页的大小,一些MCU一页是1KB,一些MCU一页是2KB

   下面举个例子写入数据 0x0001 到Flash中uint16_t my_add = 0x0001;


     uint32_t Robot_Num_Flash_Add = 0x08005000; 

      

        FLASH_EraseInitTypeDef My_Flash;  //声明 FLASH_EraseInitTypeDef 结构体为 My_Flash

        HAL_FLASH_Unlock();               //解锁Flash

            

        My_Flash.TypeErase = FLASH_TYPEERASE_PAGES;  //标明Flash执行页面只做擦除操作

        My_Flash.PageAddress = Robot_Num_Flash_Add;  //声明要擦除的地址

        My_Flash.NbPages = 1;                        //说明要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值

            

        uint32_t PageError = 0;                    //设置PageError,如果出现错误这个变量会被设置为出错的FLASH地址

        HAL_FLASHEx_Erase(&My_Flash, &PageError);  //调用擦除函数擦除

        

        uint16_t Write_Flash_Data = my_add;


       //对Flash进行烧写,FLASH_TYPEPROGRAM_HALFWORD 声明操作的Flash地址的16位的,此外还有32位跟64位的操作,自行翻查HAL库的定义即可

      HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, Robot_Num_Flash_Add, Write_Flash_Data);   


         HAL_FLASH_Lock(); //锁住Flash


  写完之后,接着就到读了,Flash写有次数限制,写的次数在1W次还是10W次(忘了)就不可写入了,而读是没有次数限制的,读多少次都可以,下面就把写入到Flash里的数据 0x0001 读出来


     uint32_t Robot_Num_Flash_Add = 0x08005000; 

   ID_Num = *(__IO uint16_t*)( Robot_Num_Flash_Add ); //*(__IO uint16_t *)是读取该地址的参数值,其值为16位数据,一次读取两个字节,*(__IO uint32_t *)就一次读4个字节

    printf('ID_num:0x%xrn', ID_Num);


  经过上面的程序就可以实现 STM32 中 Flash 数据的读写了,具体怎么读写,每个案子不同,各位就可以根据需求去修改,只要注意好注意事项即可,代码已经实测可用。


关键字:STM32  内部Flash  读写 引用地址:STM32 实现内部Flash的读写(HAL库版)

上一篇:STM32 在串口通信时运用MODBUS协议
下一篇:STM32 HAL库的定时器中断回调函数跟串口中断回调函数

推荐阅读最新更新时间:2026-03-20 10:47

stm32内部Flash读写操作
stm32的产品都有内置Flash,而且不同系列的产品其内置Flash的大小不尽相同,结构上也有差异,本文将对stm32f07x,stm32f10x,stm32f40x的内置Flash结构,以及如何进行读写操作做一个介绍。 一、特性与构成 1.stm32f07x系列 2、stm32f10x系列               3、stm32f40x系列    二、对内部Flash的读写操作  2.1 stm32不同系列的产品,内部Flash的特性与构成确实存在一定的差异,但是对于读写操作,步骤一致,比如要往内部flash写入数据,需要几个步骤:   ①、解锁flash   ②、擦
[单片机]
<font color='red'>stm32</font><font color='red'>内部</font><font color='red'>Flash</font>的<font color='red'>读写</font>操作
基于STM32内部Flash读写操作
本文主要介绍STM32多种的内部Flash读写方式和读写长文件的功能函数怎样编写。阅读完本文可以使你能够正常的完成Flash读写操作。 介绍 STM32 FLASH 不同型号的 STM32,其 FLASH 容量也有所不同,最小的只有 16K 字节,最大的则达到了1024K 字节。本次实验选用的STM32 开发板是F103ZET6,其 FLASH 容量为 512K 字节,属于大容量产品(另外还有中容量和小容量产品),大容量产品的闪存模块组织如图 所示: STM32 的闪存模块由:主存储器、信息块和闪存存储器接口寄存器等 3 部分组成。 主存储器,该部分用来存放代码和数据常数(如 const 类型的数据)。对于大容量产品
[单片机]
基于<font color='red'>STM32</font>的<font color='red'>内部</font><font color='red'>Flash</font><font color='red'>读写</font>操作
STM32内部FLASH读写接口函数
简介:因为要用内部FLASH代替外部EEPROM,把参数放在STM32的0x08000000+320K处,其中20K是bootloader,300K是应用程序。 原理:先要把整页FLASH的内容搬到RAM中,然后在RAM中改动,然后擦除整页FLASH,再把改动后的内容写入原Flash页。下面程序调试通过。 /******************************************************************************* * Function Name : I2C_EE_BufferRead * Description : Reads a block of data from th
[单片机]
STM32开发笔记38: 单片机内部Flash读写
单片机型号:STM32F070F6P6 本文介绍应用C语言进行单片机内部Flash的读写技巧,将从查看文档开始,到最终完成完整的程序。 单片机型号:STM32F070F6P6 步骤如下: 1、查看文档《STM32F030x4/x6/x8/xC and STM32F070x6/xB advanced ARM®-based 32-bit MCUs》确认其Flash的内部结构。 2、查看文档确认STM32F070F6P6内部存储器地址分配。从下表中得到的主要信息是Main Flash memory的起始地址是0x08000000,长度是32KB,到0x08017FFF结束(结束值可不关心)。 3、继续
[单片机]
<font color='red'>STM32</font>开发笔记38: 单片机<font color='red'>内部</font><font color='red'>Flash</font>的<font color='red'>读写</font>
STM32 读写内部Flash
STM32F4Discovery开发帮使用的STM32F407VGT6芯片,内部FLASH有1M之多。平时写的代码,烧写完之后还有大量的剩余。有效利用这剩余的FLASH能存储不少数据。因此研究了一下STM32F4读写内部FLASH的一些操作。 【STM32F4 内部Flash的一些信息】 STM32F407VG的内部FLASH的地址是:0x08000000,大小是0x00100000。 写FLASH的时候,如果发现写入地址的FLASH没有被擦出,数据将不会写入。FLASH的擦除操作,只能按Sector进行。不能单独擦除一个地址上的数据。因此在写数据之前需要将地址所在Sector的所有数据擦除。 在STM32F4的编程手册上可找到F
[单片机]
<font color='red'>STM32</font> <font color='red'>读写</font><font color='red'>内部</font><font color='red'>Flash</font>
STM32F103学习笔记(3)——读写内部Flash
一、简介 在STM32芯片内部有一个 FLASH 存储器,它主要用于存储代码,我们在电脑上编写好应用程序后,使用下载器把编译后的代码文件烧录到该内部 FLASH 中,由于 FLASH 存储器的内容在掉电后不会丢失,芯片重新上电复位后,内核可从内部 FLASH 中加载代码并运行。 STM32 的内部 FLASH 包含主存储器、系统存储器以及选项字节区域,它们的地址分布及大小见下表 主存储器 一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 256K FLASH、512K FLASH 都是指这个区域的大小。 主存储器分为 256 页,每页大小为 2
[单片机]
STM32G031G8U6单片机内部FLASH读写简单学习
此篇限定研究范围为FLASH区域的访问规则。 以下结论均为实测所得: 一、读 1.单字节读例程,单字节读可以从任意地址开始读 uint8_t STMFLASH_ReadByte(uint32_t faddr) { return *(volatile uint8_t*)faddr; } 2.半字(2个字节)读例程, 半字读只能从偶数地址开始读 ,从奇数地址读的话单片机就死机了 uint16_t STMFLASH_ReadHalfWord(uint32_t faddr) { return *(volatile uint16_t*)faddr; } 3.字(4个字节)读例程, 按字读只能从4的整数倍地址开始读
[单片机]
STM32f103 —— 内部flash读写
#ifndef _MCU_FLASH_H_ #define _MCU_FLASH_H_ #include stdint.h // STM32f103C8T6 64KB FLASH,20KB RAM,1个扇区1KB,程序起始0x8000000 #define FLASH_START_ADDR ((uint32_t)0x8000000) #define FLASH_END_ADDR ((uint32_t)(0x8000000 + FLASH_SECTOR_NUM * FLASH_SECTOR_SIZE)) #define FLASH_SECTOR_NUM 128 // 扇区数量 #define FLASH_SECTOR
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved