【STM32标准库】读写内部FLASH

news2024/9/24 13:17:58

1.内部FLASH的构成

STM32F407的内部FLASH包含主存储器、系统存储器、OTP区域以及选项字节区域。

在这里插入图片描述

一般我们说STM32内部FLASH的时候,都是指这个主存储器区域,它是存储用户应用程序的空间。STM32F407ZGT6型号芯片, 它的主存储区域大小为1MB。其中包含4个16KB扇区、1个64KB扇区和7个128KB的扇区。

  • 系统存储区

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

  • OTP区域

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

  • 选项字节

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

2.对内部FLASH的写入过程

2.1解锁

由于内部FLASH空间主要存储的是应用程序,是非常关键的数据,为了防止误操作修改了这些内容,芯片复位后默认会给FLASH上锁, 这个时候不允许设置FLASH的控制寄存器,并且不能对修改FLASH中的内容。

所以对FLASH写入数据前,需要先给它解锁。解锁的操作步骤如下:

(1) 往Flash 密钥寄存器 FLASH_KEYR中写入 KEY1 = 0x45670123

(2) 再往Flash 密钥寄存器 FLASH_KEYR中写入 KEY2 = 0xCDEF89AB

2.2数据操作位数

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

数据操作位数

最大操作位数会影响擦除和写入的速度,其中64位宽度的操作除了配置寄存器位外,还需要在Vpp引脚外加一个8-9V的电压源, 且其供电时间不得超过一小时,否则FLASH可能损坏,所以64位宽度的操作一般是在量产时对FLASH写入应用程序时才使用,大部分应用场合都是用32位的宽度。

2.3擦除扇区

在写入新的数据前,需要先擦除存储区域,STM32提供了扇区擦除指令和整个FLASH擦除(批量擦除)的指令,批量擦除指令仅针对主存储区。

扇区擦除的过程如下:

(1) 检查 FLASH_SR 寄存器中的“忙碌寄存器位 BSY”,以确认当前未执行任何 Flash 操作;

(2) 在 FLASH_CR 寄存器中,将“激活扇区擦除寄存器位SER ”置 1,并设置“扇区编号寄存器位SNB”,选择要擦除的扇区;

(3) 将 FLASH_CR 寄存器中的“开始擦除寄存器位 STRT ”置 1,开始擦除;

(4) 等待 BSY 位被清零时,表示擦除完成。

2.4写入数据

擦除完毕后即可写入数据,写入数据的过程并不是仅仅使用指针向地址赋值,赋值前还还需要配置一系列的寄存器,步骤如下:

(1) 检查 FLASH_SR 中的 BSY 位,以确认当前未执行任何其它的内部 Flash 操作;

(2) 将 FLASH_CR 寄存器中的 “激活编程寄存器位PG” 置 1;

(3) 针对所需存储器地址(主存储器块或 OTP 区域内)执行数据写入操作;

(4) 等待 BSY 位被清零时,表示写入完成。

3.查看工程的空间分布

在这里插入图片描述

在上面map文件的描述中,我们了解到加载及执行空间的基地址(Base)都是0x08000000,它正好是STM32内部FLASH的首地址, 即STM32的程序存储空间就直接是执行空间;它们的大小(Size)分别为0x00001ae4及0x00001ab4, 执行空间的ROM比较小的原因就是因为部分RW-data类型的变量被拷贝到RAM空间了;它们的最大空间(Max)均为0x00100000,即1M字节,它指的是内部FLASH的最大空间。计算程序占用的空间时,需要使用加载区域的大小进行计算,本例子中应用程序使用的内部FLASH是从0x08000000至(0x08000000+0x00001ae4)地址的空间区域。所以,一个扇区的大小就够了。

4.FLASH读写实验

#ifndef __BSP_INTER_FLASH_H
#define __BSP_INTER_FLASH_H

#ifdef __cplusplus
extern "C"{

#endif

#include "stm32f4xx.h"


#define TEST_FLASH_SECTION            FLASH_Sector_1 //这里用或操作直接两块section好像不太行
#define TEST_FLASH_BASE_ADDRESS       0x08004000
#define TEST_FLASH_SIZE               16*1024
#define TEST_FLASH_DATA               0x5a5aa5a5 


void inter_flash_test(void);
#ifdef __cplusplus
}
#endif

#endif


#include "bsp_inter_flash.h"
#include "stdio.h"

void inter_flash_test()
{
	//1.解锁  2.擦除  3.写入  4.上锁  5.读取
	FLASH_Status status = FLASH_COMPLETE;
	
	FLASH_Unlock();

	status=FLASH_EraseSector(TEST_FLASH_SECTION,VoltageRange_3);
	if(FLASH_COMPLETE==status)
	{
		printf("FLASH_EraseSector OK\r\n");
	}
	
	for(int i=0;i<TEST_FLASH_SIZE;i+=4)
	{
		status=FLASH_ProgramWord(TEST_FLASH_BASE_ADDRESS+i,TEST_FLASH_DATA);
		if(FLASH_COMPLETE==status)
	    {
		     printf("FLASH_ProgramWord OK\r\n");
	    }
	}
	
	FLASH_Lock();
	
	__IO uint32_t* addr=(__IO uint32_t*)TEST_FLASH_BASE_ADDRESS;
	for(int i=0;i<TEST_FLASH_SIZE;i+=4)
	{
		if(TEST_FLASH_DATA!=*(addr++))
		{
			printf("TEST_FLASH_DATA ERROR\r\n");
		}
	}
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1920863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JavaSE 面向对象程序设计进阶 IO 综合练习 利用糊涂包生成假数据 随机点名器 登录案例

目录 生成假数据 利用糊涂包生成假数据 随机点名器 综合练习 生成假数据 制造假数据 制造假数据也是开发中的一个能力 在各个网上爬取数据 这是其中一个方法 爬取网站中的内容 import cn.hutool.core.io.FileUtil;import java.io.IOException; import java.io.InputSt…

银行函证业务的数字化转型:合合信息智能文档处理平台如何实现集中化处理与全流程合规?

“银行函证”是注册会计师在获取被审计单位授权后&#xff0c;直接向银行业金融机构发出询证函&#xff0c;银行业金融机构针对所收到的询证函&#xff0c;查询、核对相关信息并直接提供书面回函的过程。 财政部、银保监会联合发布《关于加快推进银行函证规范化、集约化、数字…

教程系列2 | 趋动云『社区项目』一步实现与 AI 对话

上周&#xff0c;我们沉浸于文生图【教程系列1 | 趋动云『社区项目』极速部署 SD WebUI】的奇幻世界&#xff0c;领略了文字转化为视觉的无限乐趣。本周我们继续与 AI 进行对话&#xff0c;探索智能交互的无限魅力&#xff01; Llama3-8B-Chinese-Chat Llama3-8B-Chinese-Cha…

system V共享内存【Linux】

文章目录 原理shmgetftokshmat(share memory attach)shmdt&#xff0c;去关联&#xff08;share memory delete attach&#xff09;shmctl ,删除共享内存共享内存与管道 原理 共享内存本质让不同进程看到同一份资源。 申请共享内存&#xff1a; 1、操作系统在物理内存当中申请…

PGCCC|【PostgreSQL】PCA认证考试大纲#postgresql认证

PostgreSQL Certified Associate|PCA&#xff08;初级&#xff09; 学员将学会安装、创建和维护PostgreSQL数据库。学完后&#xff0c;学员可以从事PostgreSQL数据库的数据操作和管理等工作。 获证途径 参加PostgreSQL培训再考试 考试为上机考试。 PostgreSQL PCA培训考试课…

【嵌入式Linux】<知识点> GDB调试(更新中)

文章目录 前言 一、GDB调试预备工作 二、GDB的启动与退出 三、GDB中查看源代码 四、GDB断点操作 五、GDB调试指令 前言 在专栏【嵌入式Linux】应用开发篇_Linux打工仔的博客中&#xff0c;我们已经写了大量的源程序。但是在调试这些程序时我们都是通过printf大法和肉眼除…

网络(一)——初始网络

文章目录 计算机网络的背景网络发展认识 "协议" 网络协议初识协议分层网络分层 网络传输基本流程数据包封装和分用网络中的地址管理认识IP地址认识MAC地址 计算机网络的背景 网络发展 独立模式:计算机之间相互独立 在最早的时候&#xff0c;计算机之间是相互独立的&…

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏应用于称重测力控制仪表

称重测力控制仪表是将称重传感器信号&#xff08;或再通过重量变送器&#xff09;转换为重量数字显示&#xff0c;并可对重量数据进行传输、储存、统计、打印的电子设备&#xff0c;常用于工农业生产中的自动化配料&#xff0c;称重&#xff0c;以提高生产效率。随着工业化的发…

Oracle11g_RAC for vmware workstation 安装教程(on suse11)

一、前言 本文介绍在vmware workstation环境下&#xff0c;基于suse11sp1操作系统安装Oracle11g RACASM 数据库&#xff08;两节点&#xff09;。 1.1 RAC中的基本概念 安装ORACLE RACASM前&#xff0c;您可能需要事先简要的了解RAC&#xff0c;CRS&#xff0c;ASM的概念。 1.1…

【Linux】01.Linux 的常见指令

1. ls 指令 语法&#xff1a;ls [选项] [目录名或文件名] 功能&#xff1a;对于目录&#xff0c;该命令列出该目录下的所有子目录与文件。对于文件&#xff0c;将列出文件名以及其他信息 常用选项&#xff1a; -a&#xff1a;列出当前目录下的所有文件&#xff0c;包含隐藏文件…

java 实验一:Java集成开发环境的搭建

一、实验目的 1、掌握Java集成开发环境的搭建方式&#xff0c;重点掌握JDK/Eclipse的安装&#xff0c;同时熟悉开发环境的使用&#xff1b; 2、重点掌握JDK/Eclipse的安装&#xff0c;同时熟悉开发环境的使用&#xff1b; 3、会使用输出语句在命令行输出信息&#xff1b; 4…

智能合约和分布式应用管理系统:技术革新与未来展望

引言 随着区块链技术的不断发展&#xff0c;智能合约和分布式应用&#xff08;DApps&#xff09;逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议&#xff0c;能够在预设条件满足时自动执行代码&#xff0c;而无需人工干预或中介机构。这种自动化和信任机制极大…

学习网络的第一步:全面解析OSI与TCP/IP模型

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号“软件求生”,获取更多技术干货! Hello,大家好!我是你们的好朋友小米。今天我们来聊一聊网络基础知识中的重量级选手——OSI模型和TCP/IP模型!网络的世界就像一个巨大的迷宫,而这两个…

Hadoop简明教程

文章目录 关于HadoopHadoop拓扑结构Namenode 和 Datanode 基本管理启动Hadoop启动YARN验证Hadoop服务停止Hadoop停止HDFS Hadoop集群搭建步骤准备阶段Java环境配置Hadoop安装与配置HDFS格式化与启动服务测试集群安装额外组件监控与维护&#xff1a; 使用Docker搭建集群使用Hado…

SQL构造一个触发器audit_log

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 描述 构造一个触发…

华为如何做成数字化转型?

目录 企业数字化转型是什么&#xff1f; 华为如何定义数字化转型&#xff1f; 为什么做数字化转型&#xff1f; 怎么做数字化转型&#xff1f; 华为IPD的最佳实践之“金蝶云” 企业数字化转型是什么&#xff1f; 先看一下案例&#xff0c;华为经历了多次战略转型&#xf…

Python数据分析-乳腺癌诊断分析预测

一、研究背景 乳腺癌是全球女性中最常见的癌症之一&#xff0c;发病率和死亡率都处于较高水平。据世界卫生组织&#xff08;WHO&#xff09;统计&#xff0c;乳腺癌每年造成数百万女性的死亡&#xff0c;并且其发病率在许多国家呈上升趋势。乳腺癌的早期诊断对于提高患者的生存…

气膜仓储与传统仓储的成本优势对比—轻空间

随着物流和仓储需求的不断增长&#xff0c;企业对仓储设施的要求也日益提高。传统仓储设施虽然具有一定的优势&#xff0c;但在建设和运营成本上往往较高。近年来&#xff0c;气膜仓储作为一种新型仓储方式&#xff0c;以其独特的优势逐渐受到市场青睐。轻空间将详细探讨气膜仓…

小程序创建与项目初始化(构建 npm + 集成 Sass)

一、打开微信开发者工具 确认 左侧导航栏是否选中的 小程序点击 【】创建小程序 二、创建小程序 三、初始化 清空 app.wxss、app.js 去掉 rendererOptions 和 componentFramework 不需要最新的搜索引擎 留下以下文件 四、自定义构建 npm 集成 Sass 首先 先把小程序源…

如何使用Python正则表达式解析多行文本

使用 Python 的正则表达式来解析多行文本通常涉及到使用多行模式&#xff08;re.MULTILINE&#xff09;和 re.DOTALL 标志&#xff0c;以及适当的正则表达式模式来匹配你想要提取或处理的文本块。以下是一个简单的示例&#xff0c;展示了如何处理多行文本&#xff1a; 1、问题背…