stm32读写内部Flash

news/2024/4/26 1:15:14/文章来源:https://blog.csdn.net/weixin_47321452/article/details/130339025

stm32内部flash地址架构映射

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

 

主存储器

一般我们说 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芯片没有这种模式

 

系统存储区

系统存储区是用户不能访问的区域,它在芯片出厂时已经固化了启动代码,它负责实现串口、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

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、读取数据

读取数据是不受上锁影响的,上锁后可以根据地址读取变量的值核对是否写入成功。

代码流程


#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));
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

生成树协议三姐妹:STP、RSTP 和 MSTP,附思科和华为双厂商命令示例

在计算机网络中,为了保证网络拓扑结构的稳定性和可靠性,需要采用一些协议进行网络的管理和控制。其中,STP、RSTP 和 MSTP 是三种常用的网络管理协议。本文将分别介绍这三种协议,并且使用华为、思科两家厂商作为案例给出相应的命令…

数据库之约束、索引和事务

一、约束 约束,顾名思义就是数据库对数据库中的数据所给出的一组检验规则.负责判断元素是否符合数据库要求.其目的就是为了提高效率以及准确性. 1.not null - > 数据元素非空 表示如果插入数据,则当前数据不能为空. //创建一张学生表,其班级id和年级id不为空 create …

【嵌入式笔/面试】嵌入式软件基础题和真题总结——网络相关

在学习的时候找到几个十分好的工程和个人博客,先码一下,内容都摘自其中,有些重难点做了补充! 才鲸 / 嵌入式软件笔试题汇总 嵌入式与Linux那些事 阿秀的学习笔记 小林coding 百问网linux 嵌入式软件面试合集 2022年春招实习十四面…

unity3d---物体加点击事件

目录 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 4.物体单独响应点击事件 5.控制脚本实现各物体的点击事件 6.点击ui时屏蔽 物体点击事件 1.给需要点击点物体加collider 2.层级面板加EventSystem 3. 相机加Physics Raycaster 2d…

6. 树的入门

6. 树的入门 之前我们实现的符号表中,不难看出,符号表的增删查操作,随着元素个数N的增多,其耗时也是线性增多的,时间复杂度都是O(n),为了提高运算效率,接下来我们学习树这种数据结构。 6.1 树的基本定义 …

PerformanceTest, monitoring command

PerformanceTest, monitoring command 1、数据库 #查看最大连接数 show variables like max_connections; #例如:查看mysql连接数 show status like Threads%; 说明: threads_cached //查看线程缓存内的线程的数量 threads_connected //查看当前打开的连接的数量(打开的…

Pytorch的几种常用优化器

文章目录 AdagradSGDRMSpropAdamAdamW Adagrad Adagrad是一种可以自动调节每个参数更新的梯度的优化器,也可以做到在梯度平缓时走的步长大,在梯度小时走的步长小,从而防止loss出现剧烈震荡的情况。这里默认你已知道了他的原理了,…

离散数学-考纲版-01-命题逻辑

文章目录 1. 命题逻辑的等值演算与推理演算参考1.1 命题1.2 常用联结词1.3 命题公式命题公式的分类-重言式-矛盾式-可满足式等价关系式-逻辑等价 logically equivalent 1.4 命题的等值演算与推理基本等价式逻辑蕴涵重言式 logically implication重言蕴涵推到归结法 1.5 命题公式…

机器学习——SVM的易错题型

问:支持向量机仅可以用于处理二分类任务 答:错误。支持向量机可以用于处理多分类任务,通过使用一对多或一对一的方法,将多个类别分别与其他类别做二分类。也可以使用多类支持向量机算法,直接将多个类别一起纳入训练和…

3、Typescript中补充的六个类型

1、元组 元组可以看做是数组的拓展,它表示已知元素数量和类型的数组。确切地说,是已知数组中每一个位置上的元素的 类型,来看例子: let tuple: [string, number, boolean]; tuple ["a", 2, false]; tuple [2, "…

网络设备发现工具

什么是网络设备发现 网络设备发现是识别和映射网络基础架构(如路由器、交换机、集线器、防火墙、无线接入点、服务器、虚拟机等)中存在的设备和接口的过程。网络发现是网络管理的第一步,也是成功监控解决方案的关键。该过程不仅涉及发现网络…

LINUX SVN 新建项目

从第三方代码创建代码库: 1、通过客户端进入服务端 2、在对应的目录创建新的项目/目录 在对应的目录右击 :creat folder... 例:创建testSvn 3、在客户端checkout(co) testSvn 4、将第三方源码(srcTest)拷贝到客户端下的对应路径 防止L…

Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层

Cesium 实战-最新版(1.104.0)通过异步方式初始化地球,加载影像以及高程图层 遇到问题初始化底图初始化高程(监听载入完成事件,开启关闭高程)初始化 3dtile在线示例 Cesium 最新版(1.104.0&#…

DIN11系列 大电流输出信号隔离模块线性驱动器0~100mA/0~500mA/0~2A/0-4A

主要特性 精度、线性度误差等级: 0.1、0.2、0.5 级4-20mA/0-5V/0-10V 等标准信号输入0~100mA/0~500mA/0~1A/0-5A 等电流信号输出0~1V(max 5A)/0~10V/0-24V(max 5A) 等电压信号输出信号输入/信号输出 3000VDC 隔离辅助电源:12V、15V 或 24V 直流单电源供…

NeRFStudio系列 Part 1:PipeLines概述

前言:Why NeRFStudio? NeRF社区是近两年来计算机领域最活跃的学术社区之一,各种具有milestone意义的算法层出不穷,各位作者的开源工作也做得非常扎实,非常多的工作都自带了code、data、project page。 但是后继者想要在这些伟大的…

jenkins自动化部署配置

文章目录 1. jenkins 插件安装2. 配置2.1 全局工具配置2.2 全局配置2.2.1 gitee 配置 3. 创建任务添加gitee ssh jenkins 开机自启动 1. jenkins 插件安装 ant Build Failure AnalyzerBuild Monitor ViewBuild Timeout dockerEmail Extension Plugin giteegithubgradle javama…

Python科研数据可视化

在过去的20 年中,随着社会产生数据的大量增加,对数据的理解、解释与决策的需求也随之增加。而固定不变是人类本身,所以我们的大脑必须学会理解这些日益增加的数据信息。所谓“一图胜千言”,对于数量、规模与复杂性不断增加的数据&…

广域通信网 - 流量控制(停等协议、滑动窗口协议)

文章目录 1 概述2 流量控制协议2.1 停等协议2.2 滑动窗口协议 1 概述 #mermaid-svg-c9cNIYsOvLpoO4AV {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-c9cNIYsOvLpoO4AV .error-icon{fill:#552222;}#mermaid-svg-c9c…

跳槽必备,全面总结Android面试知识点

在最近的 Android 开发(社招)面试中总结的 Android 基础知识点,已经拿到心仪的offer,回馈同学们,感谢其他大佬的分享。 Android中大厂面试都很重视基础知识的考察,面试前不仅要熟悉这些知识点,…

设计模式之访问者模式(C++)

作者:翟天保Steven 版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处 一、访问者模式是什么? 访问者模式是一种行为型的软件设计模式,表示一个作用于某对象结构中的各元素的操作…