stm32内部flash在线读写操作
stm32内部flash在线读写操作
- 📍相关开源库文章介绍《STM32 利用FlashDB库实现在线扇区数据管理不丢失》
✨不同系列,内部flash编程有所区别。例如stm32f1是按照页擦除,半字(16bit)或全字(32bit)数据写入;stm32f4系列按照扇区擦除,可以字节(8bit)、半字(16bit)、字(32bit)和双字(64bit)数据写入.其他系列可以参考对应的参考手册内容说明。
📗stm32内部flash划分
- 📍STM32F10xxx闪存编程手册:
https://picture.iczhiku.com/resource/eetop/WhkWowqdUaYYwcnv.pdf
- 不同型号的MCU内部flash容量是不同的。STM32F1为例:按照页划分
- 🌿flash容量低于256KB的,页大小为:1KB=0x400;
- 🌿flash容量等于或大于256KB的,页大小为:2KB=0x800;
- 🧨stm32f4xx系列基于扇区操作,含 4 个 16 KB 扇区、1 个 64 KB 扇区 和 7 个 128 KB 扇区。(PM0081编程手册)

📘闪存编程
- 标准的闪存编程顺序:
- 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;
- 设置FLASH_CR寄存器的PG位为1;
- 写入要编程的半字到指定的地址;
- 等待BSY位变为0;
- 读出写入的地址并验证数据。
- 注意: 当FLASH_SR寄存器的BSY位为1时,不能对任何寄存器执行写操作。
- 编程过程流程图:

- stm32标准库,FLASH编程操作:
/*** 函 数:FLASH编程字* 参 数:Address 要写入数据的字地址* 参 数:Data 要写入的32位数据* 返 回 值:无*/
void MyFLASH_ProgramWord(uint32_t Address, uint32_t Data)
{FLASH_Unlock(); //解锁FLASH_ProgramWord(Address, Data); //编程字FLASH_Lock(); //加锁
}/*** 函 数:FLASH编程半字* 参 数:Address 要写入数据的半字地址* 参 数:Data 要写入的16位数据* 返 回 值:无*/
void MyFLASH_ProgramHalfWord(uint32_t Address, uint16_t Data)
{FLASH_Unlock(); //解锁FLASH_ProgramHalfWord(Address, Data); //编程半字FLASH_Lock(); //加锁
}
- HAL库,FLASH编程实现:
/*** @brief 将16位数据写入FLASH** @param data 指向要写入的数据的指针* @param len 要写入的数据长度(以半字为单位)* @param address 写入数据的起始地址* @return HAL_StatusTypeDef 返回HAL状态,表示操作是否成功*/
HAL_StatusTypeDef FLASH_HALFWORD_Write(uint16_t *data, uint16_t len, uint32_t address)
{// 解锁FLASH,以便进行写操作HAL_FLASH_Unlock();// 初始化循环变量uint16_t i = 0;// 循环写入数据for (i = 0; i < len; i++){// 对FLASH进行编程,使用HAL_FLASH_Program函数以半字(16位)为单位写入数据if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_HALFWORD, address, *data) == HAL_OK){// 如果写入成功,更新地址和数据指针address = address + i * 2; // 地址每次增加2字节(16位)data = data + 1; // 数据指针指向下一个半字}else{// 如果写入失败,锁定FLASH并返回错误状态HAL_FLASH_Lock();return HAL_ERROR;}}// 所有数据写入成功后,锁定FLASH并返回成功状态HAL_FLASH_Lock();return HAL_OK;
}
/*** @brief 将32位数据写入FLASH** @param data 指向要写入的数据的指针* @param len 要写入的数据长度(以字为单位)* @param address 写入数据的起始地址* @return HAL_StatusTypeDef 返回HAL状态,表示操作是否成功*/
HAL_StatusTypeDef FLASH_WORD_Write(uint32_t *data, uint16_t len, uint32_t address)
{// 解锁FLASH,以便进行写操作HAL_FLASH_Unlock();// 初始化循环变量uint16_t i = 0;// 循环写入数据for (i = 0; i < len; i++){// 对FLASH进行编程,使用HAL_FLASH_Program函数以字(32位)为单位写入数据if (HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, address, *data) == HAL_OK){// 如果写入成功,更新地址和数据指针address = address + i * 4; // 地址每次增加4字节(32位)data = data + 1; // 数据指针指向下一个字}else{// 如果写入失败,锁定FLASH并返回错误状态HAL_FLASH_Lock();return HAL_ERROR;}}// 所有数据写入成功后,锁定FLASH并返回成功状态HAL_FLASH_Lock();return HAL_OK;
}
信息块的编程
- 选项字节编程流程::
- 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的编程操作;
- 设置FLASH_CR寄存器的OPTWRE位为1;
- 设置FLASH_CR寄存器的OPTPG位为1;
- 写入要编程的半字到指定的地址;
- 等待BSY位变为0;
- 读出写入的地址并验证数据
📒闪存擦除
闪存可以按页擦除,也可以全部擦除。
页擦除
闪存的任何一页都可以通过FPEC的页擦除功能擦除;擦除一页应遵守下述过程:
- 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
- 用FLASH_AR寄存器选择要擦除的页;
- 设置FLASH_CR寄存器的PER位为1;
- 设置FLASH_CR寄存器的STRT位为1;
- 等待BSY位变为0;
- 读出被擦除的页并做验证。
- 闪存页擦除过程流程图:

- stm32标准库,FLASH页擦除操作:
/*** 函 数:FLASH页擦除* 参 数:PageAddress 要擦除页的页地址* 返 回 值:无*/
void MyFLASH_ErasePage(uint32_t PageAddress)
{FLASH_Unlock(); //解锁FLASH_ErasePage(PageAddress); //页擦除FLASH_Lock(); //加锁
}
- HAL库 页擦除操作
HAL_StatusTypeDef FLASH_Erase_Page(uint32_t Page_Addr,uint32_t Page_Num)
{FLASH_EraseInitTypeDef EraseInitStruct;uint32_t PageError = 0;HAL_FLASH_Unlock(); //解锁内部flashEraseInitStruct.TypeErase = FLASH_TYPEERASE_PAGES;//标明Flash执行页面只做擦除操作EraseInitStruct.PageAddress = Page_Addr; //声明要擦除的地址EraseInitStruct.NbPages = Page_Num; //要擦除的页数,此参数必须是Min_Data = 1和Max_Data =(最大页数-初始页的值)之间的值if (HAL_FLASHEx_Erase(&EraseInitStruct, &PageError) != HAL_OK){HAL_FLASH_Lock();return HAL_ERROR;}HAL_FLASH_Lock();return HAL_OK;
}
全部擦除
可以用全部擦除功能擦除所有用户区的闪存,信息块不受此操作影响。建议使用下述过程:
- 检查FLASH_SR寄存器的BSY位,以确认没有其他正在进行的闪存操作;
- 设置FLASH_CR寄存器的MER位为1;
- 设置FLASH_CR寄存器的STRT位为1;
- 等待BSY位变为0;
- 读出所有页并做验证。
- 闪存全擦除过程流程图:

- stm32标准库,FLASH全擦除操作:
/*** 函 数:FLASH全擦除* 参 数:无* 返 回 值:无* 说 明:调用此函数后,FLASH的所有页都会被擦除,包括程序文件本身,擦除后,程序将不复存在*/
void MyFLASH_EraseAllPages(void)
{FLASH_Unlock(); //解锁FLASH_EraseAllPages(); //全擦除FLASH_Lock(); //加锁
}
-
⚡需要注意,全擦除,会对内部整个flash进行擦除,擦除后,整个mcu成为空片,原来所烧录的程序将不复存在。如需再使用,需要重新烧录程序。
📙读取操作
内置闪存模块可以在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相应的数据。
- 代码实现:
/*** 函 数:FLASH读取一个32位的字* 参 数:Address 要读取数据的字地址* 返 回 值:指定地址下的数据*/
uint32_t MyFLASH_ReadWord(uint32_t Address)
{return *((__IO uint32_t *)(Address)); //使用指针访问指定地址下的数据并返回
}/*** 函 数:FLASH读取一个16位的半字* 参 数:Address 要读取数据的半字地址* 返 回 值:指定地址下的数据*/
uint16_t MyFLASH_ReadHalfWord(uint32_t Address)
{return *((__IO uint16_t *)(Address)); //使用指针访问指定地址下的数据并返回
}/*** 函 数:FLASH读取一个8位的字节* 参 数:Address 要读取数据的字节地址* 返 回 值:指定地址下的数据*/
uint8_t MyFLASH_ReadByte(uint32_t Address)
{return *((__IO uint8_t *)(Address)); //使用指针访问指定地址下的数据并返回
}
📚相关测试代码
- 基于
STM32F103VC,大容量芯片,页容量2K
- 🔖HAL库
通过网盘分享的文件:STM32F103VC_FLASH_Program.rar
链接: https://pan.baidu.com/s/1BrxBfByBddTfv4BUbFdZlA?pwd=3qry 提取码: 3qry
- 🔖std标准库,基于
STM32F103VC,大容量芯片,页容量2K。(参考江协科技代码)
通过网盘分享的文件:15-1 读写内部FLASH.rar
链接: https://pan.baidu.com/s/115JvFfDWzdurpzlsaiWl6Q?pwd=vepn 提取码: vepn
相关文章:
stm32内部flash在线读写操作
stm32内部flash在线读写操作 📍相关开源库文章介绍《STM32 利用FlashDB库实现在线扇区数据管理不丢失》 ✨不同系列,内部flash编程有所区别。例如stm32f1是按照页擦除,半字(16bit)或全字(32bit)数据写入;st…...
SpringCloud源码分析-nacos与eureka
一、高版本为什么优先用nacos 如果用alibaba springcloud,那么就是阿里的技术体系。nacos属于阿里的原生技术栈,所以阿里更偏向于用nacos作为服务发现注册。 二、对比分析 Spring Cloud Alibaba 推荐使用 Nacos 作为服务发现和配置管理的首选组件&…...
DCGAN模型详解
模型背景 在深度学习领域迅速发展的背景下,生成对抗网络(GAN)作为一种革命性的生成模型应运而生。 Ian Goodfellow等人于2014年首次提出GAN概念 ,开创了生成模型的新纪元。这一创新源于对深度学习在图像生成方面潜力的探索,旨在解决非监督学习中的关键问题:如何让机器创造…...
单片机-蜂鸣器实验
#include "reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit BEEPP2^5; //将 P2.5 管脚定义为 BEEP P2.5默认高电平 void delay_10us(u16 ten_us){ while(ten_us--); } void main() { u16 i2000;//脉冲2000次 while(1) { …...
SQL 分析函数与聚合函数的组合应用
目标:掌握 SQL 中分析函数(窗口函数)与聚合函数的组合使用,通过实际案例实现复杂业务需求,如同比、环比和趋势分析。 1. 分析函数与聚合函数的区别 聚合函数(Aggregate Functions):…...
【项目】基于趋动云平台的Stable Diffusion开发
【项目】基于趋动云平台的Stable Diffusion开发 (一)登录趋动云(二)创建项目:(三)初始化开发环境:(四)运行代码(五)运行模型 …...
游戏如何检测iOS越狱
不同于安卓的开源生态,iOS一直秉承着安全性更高的闭源生态,系统中的硬件、软件和服务会经过严格审核和测试,来保障安全性与稳定性。 据FairGurd观察,虽然iOS系统具备一定的安全性,但并非没有漏洞,如市面上…...
【AIGC-ChatGPT进阶提示词指令】AI美食助手的设计与实现:Lisp风格系统提示词分析
引言 在人工智能助手的应用领域中,美食烹饪是一个既专业又贴近生活的方向。本文将详细分析一个基于Lisp风格编写的美食助手系统提示词,探讨其结构设计、功能实现以及实际应用效果。 提出你的菜系,为你分析,并生成图片卡片 提示词…...
库伦值自动化功耗测试工具
1. 功能介绍 PlatformPower工具可以自动化测试不同场景的功耗电流,并可导出为excel文件便于测试结果分析查看。测试同时便于后续根据需求拓展其他自动化测试用例。 主要原理:基于文件节点 coulomb_count 实现,计算公式:电流&…...
Javascript数据结构——图Graph
当然,让我们深入探讨一下JavaScript中的图数据结构,并列出一些常见的面试题及其代码示例。 图数据结构详解 图(Graph)是一种非线性的数据结构,由节点(也称为顶点)和连接这些节点的边组成。节点…...
搭建nginx文件服务器
方法一:通过docker方式搭建 1、创建一个nginx配置文件/etc/nginx/nginx.conf user nginx; worker_processes 1;error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid;events {worker_connections 1024; }http {include mime.types;default_typ…...
Ubuntu Server安装谷歌浏览器
背景 服务器上跑爬虫服务器需要安装谷歌浏览器 安装 wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb### sudo apt install ./google-chrome-stable_current_amd64.deb...
Vue项目结构推荐(复杂国际化项目与一般项目结构)
Vue项目结构推荐 一、一般项目结构二、复杂国际化项目结构总结/建议 下面结构是基于Vue和TypeScript开发的项目结构下src包下的结构,若只用到vue与js。则去掉typescript部分的包即可。 一、一般项目结构 assets:存放静态资源,如图片、字体、样…...
hive-sql 连续登录五天的用户
with tmp as (select 梁牧泽 as uid, 2023-03-03 as dt union allselect 梁牧泽 as uid, 2023-03-04 as dt union allselect 梁牧泽 as uid, 2023-03-05 as dt union allselect 梁牧泽 as uid, 2023-03-07 as dt union allselect 梁牧泽 as uid, 2023-03-08 as dt union allsel…...
FPGA 4x4矩阵键盘 实现
1原理 FPGA(现场可编程门阵列)4x4矩阵键盘的实现原理主要基于行列扫描法,通过FPGA对键盘的扫描和识别,实现对键盘输入信号的采集和处理。以下是对FPGA 4x4矩阵键盘实现原理的详细解释: 一、矩阵键盘的基本原理 结构:4x4矩阵键盘由4行和4列组成,共16个按键。每个按键位…...
ruoyi开发学习
将若依框架中的若依元素删掉 1.删除主目录中的“若依官网”: 在后端项目中,idea里借助mysql管理工具,找到sys_menu数据表,双击打开,找到4 若依官网,选中点击减号,绿色上箭头刷新,删…...
MacBook_Xcode_Swift雨燕
Swift Swift Swift Swift是苹果公司开发的现代化编程语言, 专为Apple平台设计。其简洁语法、类型安全、Optionals处理、Playgrounds交互式环境、泛型编程、协议与扩展、闭包功能、枚举与关联值、结构体与类的高效内存管理、异步编程的async/await语法、Swift Packa…...
ABAQUS三维Voronoi晶体几何建模
材料晶体塑性理论与细观尺度上晶体几何模型相融合的模拟方法为探究材料在塑性变形过程中的行为机制以及晶体材料优化开辟了新途径。本案例演示在CAD软件内通过Voronoi建立晶体三维模型,并将模型导入到Abaqus CAE内,完成晶体材料的有限元建模。 在AutoC…...
.Net加密与Java互通
.Net加密与Java互通 文章目录 .Net加密与Java互通前言RSA生成私钥和公钥.net加密出数据传给Java端采用java方给出的公钥进行加密采用java方给出的私钥进行解密 .net 解密来自Java端的数据 AES带有向量的AES加密带有向量的AES解密无向量AES加密无向量AES解密 SM2(国密)SM2加密Sm…...
MySQL 06 章——多表查询
多表查询,也称为关联查询,是指两个表或多个表一起完成查询操作 前提条件,这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段的。这个关联字段可能建立了外键,也可能没…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验
Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...


