stm32读写内部Flash

这篇具有很好参考价值的文章主要介绍了stm32读写内部Flash。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

stm32内部flash地址架构映射

因为我的stm32f407的内部flash是1M的所以块2不存在,但他的地址仍然存在,只是没有作用,这是stm32的整体框架。 

stm32读写内部Flash

 

主存储器

一般我们说 STM32 内部 FLASH 的时候,都是指这个主存储器区域,它是存储用户应用程序的空间,芯片型号说明中的 1M FLASH、2M FLASH 都是指这个区域的大小。
主存储器分为两块,共 2MB,每块内分 12 个扇区,其中包含 4 个 16KB 扇区、1 个 64KB 扇区和 7 个 128KB 的扇区。如我们实验板中使用的 STM32F407ZGT6 型号芯片,它的主存储区域大小为 1MB,所以它只包含有表中的扇区 0-扇区 11。
与其它 FLASH 一样,在写入数据前,要先按扇区擦除,而有的时候我们希望能以小规格操纵存储单元,所以 STM32F42x/43x 针对 1MB FLASH 的产品还提供了一种双块的存储格式,见表 1MB 产品的双块存储格式 。(2M 的产品按表 STM32 内部 FLASH 的构成 的格式)
通过配置 FLASH 选项控制寄存器 FLASH_OPTCR 的 DB1M 位,可以切换这两种格
式。
我的STM32F40x芯片没有这种模式
stm32读写内部Flash

 

系统存储区

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

OTP 区域

OTP(One Time Program),指的是只能写入一次的存储区域,容量为 512 字节,写入后数据就无法再更改,OTP 常用于存储应用程序的加密密钥。

选项字节

选项字节用于配置 FLASH 的读写保护、电源管理中的 BOR 级别、软件/硬件看门狗等功能,这部分共 32 字节。可以通过修改 FLASH 的选项控制寄存器修改。

写入过程

1、解锁

由于内部 FLASH 空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会结 FLASH 上锁,这个时候不允许设置 FLASH 的控制寄存器,并且不能对修改 FLASH 中的内容。
所以对 FLASH 写入数据前,需要先给它解锁。解锁的操作步骤如下:
(1) 往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY1 = 0x45670123
(2) 再往 Flash 密钥寄存器 FLASH_KEYR 中写入 KEY2 = 0xCDEF89AB

2、数据操作位数

在内部 FLASH 进行擦除及写入操作时,电源电压会影响数据的最大操作位数,该电源电压可通过配置 FLASH_CR 寄存器中的 PSIZE 位改变,见表数据操作位数

一般直接选择32位模式,电压也不需要改变,选择64位需外接8-9V电压给Vpp

stm32读写内部Flash

3、 擦除扇区

跟操作外部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 位被清零时,表示写入完成。

5、上锁

写完数据记得上锁内部flash防止误操作修改到code数据等等。

6、读取数据

读取数据是不受上锁影响的,上锁后可以根据地址读取变量的值核对是否写入成功。文章来源地址https://www.toymoban.com/news/detail-427149.html

代码流程


#include "stm32f4xx.h"
#include "./uart/bsp_debug_uart.h"
#include "./inter_flash/inter_flash.h"

#define TEST_DATA  0x12
#define TEST_ADDR  0x08008000

/**
  *	  本地擦除第二扇区,第一扇区存放代码code,通过查看map文件预留空间
  *		
  */
void inter_flash_test(void)
{
	/*
		1、解锁
		2、擦除
		3、写入
		4、上锁
		5、读取检验
	*/
	
	//解锁
	FLASH_Unlock();
	
	//擦除
	if(FLASH_EraseSector(FLASH_Sector_2,VoltageRange_3) == FLASH_COMPLETE)
	{
		printf("\r\n擦除成功");
	}
	else
	{
		printf("\r\n擦除失败");
	}
	
	//写入
	if(FLASH_ProgramByte(TEST_ADDR,TEST_DATA) == FLASH_COMPLETE)
	{
		printf("\r\n写入成功");
	}
	else
	{
		printf("\r\n写入失败");
	}
	
	//上锁
	FLASH_Lock();
	
	//检验
	printf("\r\n 读取地址0x%x的内容是:0x%x",TEST_ADDR,(char *)(TEST_ADDR));
}

到了这里,关于stm32读写内部Flash的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32 FLASH 读写数据

    2.1 修改代码后编译,会有提示信息 KEIL,计算出来代码总共 61076 Byte 2.2 如果什么都没有改,直接编译是没有这个提示信息的 0x08000000 是存放代码的起始地址,我们保存的数据要和代码分开,放在代码区域后面,所以后面加了个80000, 比keil 编译里面算出来的和要大将近2 万个

    2024年02月12日
    浏览(32)
  • STM32—Flash读写详解

    目录 前言 介绍 STM32 FLASH 闪存的编程和擦除 Flash读写的标准库函数 软件设计 FLASH的读取 直接读取某一地址的内容 读取选定位置的选定大小的内容 FLASH的写入 直接使用标准库写入 写入选定位置的选定大小的内容 如何在Keil 5中查看Flash某地址的内容 本文主要介绍STM32多种的内

    2024年02月09日
    浏览(39)
  • stm32读写nand flash

    目前我在使用stm32f407ZGT6来读写三星的nand flash【K9F1G08U0E】。 板子我是在这里买的 【STM32F407ZGT6最小系统板/核心板/转接板/开发板/加128M FLASH】 他上面可以选装一个K9F1G08U0E。 针对这个nand flash,可以选择采用stm32的FSMC来进行读写。 stm32的程序我是stm32cubeide来编写的,感觉挺方便

    2024年02月11日
    浏览(42)
  • #stm32整理(一)flash读写

    参考资料正点原子和野火开发手册 stm32f4中文参考手册和datasheet Flash 接口可管理 CPU 通过 **AHB I-Code(指令指令总线) 和 D-Code (数据总线)**对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编程操作,并实施读写保护机制。Flash 接口通过指令预取和缓存机制加速 代码执行。 关于

    2024年02月05日
    浏览(63)
  • STM32CubeMX学习笔记16--- STM32内部FLASH

    1. 内部FLASH简介         之前的文章中介绍过STM32F1利用SPI与外部FLASH(W25QXX芯片)通讯的例程,本例程将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。 不同型号的STM32,其FLASH容量也有所不同,最小的只有16K字节,最大的则达到了1024K字节。此处我们使用的是ST

    2024年04月09日
    浏览(45)
  • STM32CubeMX-Flash Hal库 内部Flash掉电存储

    本文将介绍STM32F1的内部FLASH,通过内部FLASH实现数据读写操作。从而做到掉电存储。不同型号的STM32,其FLASH:容量也有所不同,最小的只有 16K字节,最大的则达到了1024K字节。此处我们使用的是 STM32F103ZET6,其FLASH容量为512K字节,属于大容量产品,大容量产品的闪存模块组织图如下

    2024年02月13日
    浏览(42)
  • 基于STM32实现FLASH读写功能

    今天要学习的是flash读写,闪存(Flash Memory)是一种长寿命的非易失性(在断电情况下仍能保持所存储的数据信息)的存储器。用途SD卡、固态硬盘、芯片内存存储单元存储代码。 Flash 接口可管理 CPU 通过 AHB I-Code 和 D-Code 对 Flash 进行的访问。该接口可针对 Flash 执行擦除和编

    2024年02月11日
    浏览(41)
  • STM32 LCD 显示彩色图片(内部FLASH)

    在使用LCD颜色填充的时候发现正点原子提供了一个很好用的填充函数,就是LCD_Color_Fill();该函数是用来填充颜色块的,也可以直接用来显示图片,因为图片也是由颜色块组成的。所以在需要使用stm32从内部flash的方法来显示图片时就不要独立写显示图片的函数了,非常实用。

    2024年02月03日
    浏览(42)
  • 【STM32】HAL库Flash读写操作及配置

    【STM32】HAL库Flash读写操作及配置 在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB 而实际上程序部分大小应该要看硬件手册来确定 可以通过配置keil工程中size的大小 来确定程序地址的范围(如果太小了

    2024年02月03日
    浏览(47)
  • STM32F4单片机内部FLASH编程时间

    单片机内部的flash除了存储固件以外,经常将其分为多个区域,用来存储一些参数或存储OTA升级等待更新的固件,这时就会涉及单片机内部flash的编程和擦除操作。STM32同系列的单片机内部flash特性和扇区大小都不太一样,以下基于STM32F407VET6此型号进行简单介绍。 STM32F4xx中文参

    2024年02月03日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包