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 章——多表查询
多表查询,也称为关联查询,是指两个表或多个表一起完成查询操作 前提条件,这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段的。这个关联字段可能建立了外键,也可能没…...

猴子吃桃.
本节通过学习解决一个有趣的问题来加深对递归的理解. 问题描述: 有一个猴子摘了桃子吃,第一天吃一半多一个,第二天吃第一天剩余的一半多一个,第三天吃第二天剩余的一半多一个..以此类推,当第n天时,恰好只剩下一个桃子.求猴子一共摘了多少桃子. 思路解析: 解读题目,第n天的桃子…...

游戏引擎学习第72天
无论如何,我们今天有一些调试工作要做,因为昨天做了一些修改,结果没有时间进行调试和处理。我们知道自己还有一些需要解决的问题,却没有及时完成,所以我们想继续进行这些调试。对我们来说,拖延调试工作总是…...

element-ui dialog 组件源码分享
简单分享 dialog 组件源码,主要从以下三个方面: 1、dialog 页面结构。 2、dialog 组件属性。 3、dialog 组件挂载。 4、dialog 组件事件。 一、dialog 页面结构: 二、组件属性: 2.1 visible 是否显示 Dialog,支持…...

unity开发之shader 管道介质流动特效
效果 shader graph 如果出现下面的效果,那是因为你模型的问题,建模做贴图的时候没有设置好UV映射,只需重新设置下映射即可...

人工智能之机器学习算法
所有的机器学习算法都是要优化的,优化的必要条件是确定优化的目标函数(损失函数),目标函数是根据实际问题(数据)转成的数学公式。 一.线性回归原理推导 (1)回归问题概述 在机器学习的有监督算法中,分类与回归二种情…...
Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin
Android布局layout的draw简洁clipPath实现圆角矩形布局,Kotlin 通常,如果要把一个相对布局,FrameLayout,或者线性布局等这样的布局变成具有圆角或者圆形的布局,需要增加一个style,给它设置圆角,…...

信息系统常见的系统架构
1.1单文件架构 现在很多企业内部虽然已经建设了一些信息系统,但还是有不少业务没有用专门的信息系统管理起来,普遍都是采用Excel表格来实现这些业务数据的填报和查询统计。Excel就是属单文件架构,这种架构是指整个系统就是一个文件࿰…...

AngularJS 过滤器:提升用户体验的数据处理利器
AngularJS 过滤器:提升用户体验的数据处理利器 AngularJS,作为一款由Google维护的开源JavaScript框架,以其独特的双向数据绑定和MVVM(Model-View-ViewModel)架构在Web应用开发领域占据着重要地位。其中,AngularJS的过滤器(Filters)功能,为开发者提供了一种轻量级、高…...

Upload-labs 第四关(学习记录)
上传.htaccess文件 SetHandler application/x-httpd-php <IfModule mime_module> SetHandler application/x-httpd-php #在当前目录下,所有文件都会被解析成php代码执行 </IfModule> 上传一句话木马 保存为 1.png 文件 成功解析...

金融租赁系统的创新与发展推动行业效率提升
金融租赁系统的技术升级与创新 在当今快速发展的金融市场中,金融租赁系统的技术升级与创新充满了无限可能。想象一下,传统的租赁方式就像一位沉闷的老师,而新兴技术就如同一位活泼的学生,不断追求新鲜事物。通过自动化、人工智能…...