STM32F4X 内部FLASH使用
STM32F4X 内部FLASH使用
- STM32F4X 内部FLASH
- STM32F4X内部FLASH结构
- STM32F40X和STM32F41X内部FLASH结构
- STM32F42X和STM32F43X内部FLASH结构
- STM32F4X内部FLASH操作
- 例程
- internal_flash.h
- internal_flash.c
- main.c
在嵌入式开发中,经常需要实时保存一些数据。如果工程的代码量比较大的话可以使用一些外部的存储器件进行数据的保存。如果工程的代码量比较小则可以利用MCU的内部FLASH进行数据的存储。
STM32F4X 内部FLASH
当我们把程序编译好之后下载到MCU之后,下载器会把程序文件下载到MCU的内部FLASH中,内部FLASH除非人为擦除,否则会永久保存。内部FLASH除了可以保存代码之外,还可以保存数据。STM32F4X的内部FLASH有以下特点。
- STM32F40X和STM32F41X的内部FLASH容量是1MB,而STM32F42X和STM32F43X的内部FLASH容量是2MB。
- STM32F4X的内部FLASH支持字节、半字、字和双字写入。
- STM32F4X的内部FLASH支持扇区擦除和全擦除。
STM32F4X内部FLASH结构
STM32F40X和STM32F41X内部FLASH结构

可以看到STM32F40X和STM32F41X将1MB的内部FLASH分成了12个扇区,每个扇区的大小都不一样,分别是4个16KB的扇区,1个64KB的扇区和7个128KB的扇区。
STM32F42X和STM32F43X内部FLASH结构

STM32F42X和STM32F43X的内部FLASH结构跟STM32F40X和STM32F41X的差不多,只是有点细微的差别。STM32F42X和STM32F43X将内部2MB的FLASH分成了2个块,每个块是1MB,每个块分成了12个扇区,每个扇区的大小都不一样,分别是4个16KB的扇区,1个64KB的扇区和7个128KB的扇区。
STM32F4X内部FLASH操作
- 先将内部FLASH解锁
- 擦除扇区
- 往FLASH中写入数据
- 读出写入的数据进行校验
- FLASH上锁
例程
internal_flash.h
#ifndef __INTERNAL_FLASH__H
#define __INTERNAL_FLASH__H#include "stm32f4xx.h"
#include "stdio.h"#define ADDR_FLASH_SERTOR_0 (0x8000000)
#define ADDR_FLASH_SERTOR_1 (0x8004000)
#define ADDR_FLASH_SERTOR_2 (0x8008000)
#define ADDR_FLASH_SERTOR_3 (0x800C000)
#define ADDR_FLASH_SERTOR_4 (0x8010000)
#define ADDR_FLASH_SERTOR_5 (0x8020000)
#define ADDR_FLASH_SERTOR_6 (0x8040000)
#define ADDR_FLASH_SERTOR_7 (0x8060000)
#define ADDR_FLASH_SERTOR_8 (0x8080000)
#define ADDR_FLASH_SERTOR_9 (0x80A0000)
#define ADDR_FLASH_SERTOR_10 (0x80C0000)
#define ADDR_FLASH_SERTOR_11 (0x80E0000) int flash_test(void);
unsigned int get_sector_index(unsigned int start_address);
int compare_u8_data(const unsigned char *src,unsigned int start_address,int len);
int compare_u16_data(const unsigned short *src,unsigned int start_address,int len);
int compare_u32_data(const unsigned int *src,unsigned int start_address,int len);
#endif
internal_flash.c
#include "internal_flash.h"static unsigned char test_data_u8[] =
{
//随机数个数:100;每行显示个数:10;取值范围:0到255157, 115, 145, 130, 66, 251, 215, 97, 214, 233,
69, 161, 177, 204, 140, 72, 143, 247, 248, 120,
219, 190, 224, 68, 45, 233, 65, 194, 17, 98,
166, 97, 10, 49, 75, 125, 214, 170, 129, 49,
244, 229, 84, 109, 100, 111, 108, 72, 174, 63,
49, 151, 37, 236, 51, 190, 109, 29, 200, 198,
59, 64, 247, 176, 92, 127, 148, 9, 249, 239,
173, 191, 25, 11, 37, 51, 103, 98, 159, 143,
54, 140, 157, 90, 194, 98, 233, 74, 184, 111,
53, 89, 249, 161, 254, 26, 155, 68, 182, 78,
};static unsigned short test_data_u16[] =
{
//随机数个数:100;每行显示个数:10;取值范围:256到6553510301, 24195, 26063, 23491, 30667, 1467, 25287, 28733, 28285, 649,
20974, 22870, 22983, 28195, 8943, 22043, 4696, 15632, 15502, 9559,
17054, 31636, 5956, 17834, 30344, 11887, 27433, 31707, 22671, 11207,
29976, 4975, 16375, 32866, 5901, 3451, 29778, 13592, 22481, 12726,
19015, 2184, 1498, 13778, 32145, 28939, 364, 28429, 27722, 31462,
29189, 16899, 5994, 22212, 27384, 17606, 3211, 11363, 17240, 18224,
7407, 1421, 9495, 13688, 1475, 25930, 5999, 2308, 28069, 24404,
2177, 15230, 23397, 17355, 6717, 28714, 2568, 13098, 13953, 18295,
15891, 11898, 11909, 4308, 32774, 30661, 26998, 20164, 24614, 22222,
26209, 16693, 10111, 5631, 5459, 27150, 6698, 19363, 19391, 16391,
};static unsigned int test_data_u32[] =
{
//随机数个数:100;每行显示个数:10;取值范围:65536到10000077260, 82517, 87839, 66237, 89695, 72376, 96222, 92678, 95797, 93033,
80246, 71041, 65849, 67378, 98262, 66674, 82041, 77441, 81670, 96973,
83937, 83480, 75533, 69009, 76105, 91653, 83731, 84311, 86195, 87253,
93123, 75563, 95693, 82693, 81139, 82842, 83646, 88761, 89735, 68620,
77854, 96176, 71826, 87637, 91718, 72568, 84671, 71302, 70603, 94686,
77552, 75529, 86341, 96681, 77604, 87789, 84565, 75144, 86686, 78462,
78822, 67912, 67140, 80409, 96178, 91978, 83013, 97086, 80136, 78389,
89854, 81895, 71373, 87784, 95007, 83992, 85698, 90803, 83209, 82360,
75268, 88518, 68987, 94879, 80601, 86505, 96622, 84208, 74665, 75118,
90429, 83369, 98123, 86628, 97033, 95608, 88707, 88590, 68700, 93137,
};unsigned int get_sector_index(unsigned int start_address)
{if(start_address >= ADDR_FLASH_SERTOR_0 && start_address < ADDR_FLASH_SERTOR_1)return FLASH_Sector_0;else if(start_address >= ADDR_FLASH_SERTOR_1 && start_address < ADDR_FLASH_SERTOR_2)return FLASH_Sector_1;else if(start_address >= ADDR_FLASH_SERTOR_2 && start_address < ADDR_FLASH_SERTOR_3)return FLASH_Sector_2;else if(start_address >= ADDR_FLASH_SERTOR_3 && start_address < ADDR_FLASH_SERTOR_4)return FLASH_Sector_3;else if(start_address >= ADDR_FLASH_SERTOR_4 && start_address < ADDR_FLASH_SERTOR_5)return FLASH_Sector_4;else if(start_address >= ADDR_FLASH_SERTOR_5 && start_address < ADDR_FLASH_SERTOR_6)return FLASH_Sector_5;else if(start_address >= ADDR_FLASH_SERTOR_6 && start_address < ADDR_FLASH_SERTOR_7)return FLASH_Sector_6;else if(start_address >= ADDR_FLASH_SERTOR_7 && start_address < ADDR_FLASH_SERTOR_8)return FLASH_Sector_7;else if(start_address >= ADDR_FLASH_SERTOR_8 && start_address < ADDR_FLASH_SERTOR_9)return FLASH_Sector_8;else if(start_address >= ADDR_FLASH_SERTOR_9 && start_address < ADDR_FLASH_SERTOR_10)return FLASH_Sector_9;else if(start_address >= ADDR_FLASH_SERTOR_10 && start_address < ADDR_FLASH_SERTOR_11)return FLASH_Sector_10;elsereturn FLASH_Sector_11;}int flash_test(void)
{unsigned int i,write_setor,ret = 0;FLASH_Unlock();write_setor = get_sector_index(ADDR_FLASH_SERTOR_6); // 判断FLASH地址的扇区索引/* 字节读写测试 */if(FLASH_EraseSector(write_setor,VoltageRange_3) != FLASH_COMPLETE) // 扇区擦除printf("flash erase error\r\n");elseprintf("flash erase success\r\n");for(i = 0;i < sizeof(test_data_u8);i++)FLASH_ProgramByte(ADDR_FLASH_SERTOR_6 + i,test_data_u8[i]); // 写数据if(compare_u8_data(test_data_u8,ADDR_FLASH_SERTOR_6,sizeof(test_data_u8)) != 0) // 比较{printf("flash write u8 error\r\n");ret = 1;goto end;}else printf("flash write u8 success\r\n");/* 半字读写测试 */if(FLASH_EraseSector(write_setor,VoltageRange_3) != FLASH_COMPLETE) // 扇区擦除 printf("flash erase error\r\n");elseprintf("flash erase success\r\n");for(i = 0;i < sizeof(test_data_u16);i++)FLASH_ProgramHalfWord(ADDR_FLASH_SERTOR_6 + i * 2,test_data_u16[i]); // 写数据if(compare_u16_data(test_data_u16,ADDR_FLASH_SERTOR_6,sizeof(test_data_u16)) != 0) // 比较{printf("flash write u16 error\r\n");ret = 1;goto end;}else printf("flash write u16 success\r\n");/* 字读写测试 */if(FLASH_EraseSector(write_setor,VoltageRange_3) != FLASH_COMPLETE) // 扇区擦除 printf("flash erase error\r\n");elseprintf("flash erase success\r\n");for(i = 0;i < sizeof(test_data_u32);i++)FLASH_ProgramWord(ADDR_FLASH_SERTOR_6 + i * 4,test_data_u32[i]); // 写数据if(compare_u32_data(test_data_u32,ADDR_FLASH_SERTOR_6,sizeof(test_data_u32)) != 0) // 比较 {printf("flash write u32 error\r\n");ret = 1;goto end;}else printf("flash write u32 success\r\n");
end: FLASH_Lock();return ret;
}int compare_u8_data(const unsigned char *src,unsigned int start_address,int len)
{int i;for(i = 0;i < len;i++){if(*((unsigned char *)(start_address + i)) != src[i])return 1;}return 0;
}
int compare_u16_data(const unsigned short *src,unsigned int start_address,int len)
{int i;for(i = 0;i < len;i++){if(*((unsigned short *)(start_address + i * 2)) != src[i])return 1;}return 0;
}
int compare_u32_data(const unsigned int *src,unsigned int start_address,int len)
{int i;for(i = 0;i < len;i++){if(*((unsigned int *)(start_address + i * 4)) != src[i])return 1;}return 0;
}
main.c
#include "stm32f4xx.h"
#include "delay.h"
#include "usart.h"
#include "internal_flash.h"int main(void)
{int i;NVIC_PriorityGroupConfig(2);system_tick_init();bsp_usart_init(115200);if(flash_test() == 0)printf("STM32F4X Internal Test Scuess\r\n");elseprintf("STM32F4X Internal Test Error\r\n");while(1){}}

相关文章:
STM32F4X 内部FLASH使用
STM32F4X 内部FLASH使用 STM32F4X 内部FLASHSTM32F4X内部FLASH结构STM32F40X和STM32F41X内部FLASH结构STM32F42X和STM32F43X内部FLASH结构 STM32F4X内部FLASH操作例程internal_flash.hinternal_flash.cmain.c 在嵌入式开发中,经常需要实时保存一些数据。如果工程的代…...
减小windows或linux虚拟机导出ova体积大小
减小windows或linux虚拟机导出ova体积大小 删除无用的文件,比如日志或者命令,程序等;去除磁盘碎片将不用的内存空间填充为0,便于vmdk压缩。 例子: 日志文件置空: 批量置空 /sf/data/log/ 目录下的日志文…...
WPF livecharts 折线图遮挡数字问题
在WPF里使用livecharts,如果折线图或者柱状图有多个的时候,可能会出现两个数字遮挡问题,这时候要设置DataLabelsTemplate 属性。 如LineSeries设置代码如下: 第一个折线图的DataLabelsTemplate var stackPanelFactory new Fra…...
电力系统数字化升级改造之配电室无人值守
随着科技的不断进步,电力系统的数字化升级改造已成为必然趋势。其中,配电室的无人值守是其中重要的一环。 配电室是电力系统的重要组成部分,其运行状态直接影响到电力系统的稳定性和可靠性。然而,传统的配电室存在很多问题&am…...
集合Set
目录 一、去重问题 一、去重问题 题目描述: 小明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性他先用计算机生成了N个1~1000之间的随机整数(N<1000),N是用户输入的,对于其中重复的数字,只保留一个&am…...
TCP/IP(二)导论
一 知识铺垫 以下内容参照 <<电子科技大学TCPIP协议原理>>全 ① 协议和标准 一组规则: 交通规则、学生上学的学生守则等;数据通信的规则,有一个专门的名称叫作协议 protocol语义:具体描述在通信当中,每一个信息的具体含义. 二进制bit流…...
Java之UDP,TCP的详细解析
练习四:文件名重复 public class UUIDTest { public static void main(String[] args) { String str UUID.randomUUID().toString().replace("-", ""); System.out.println(str);//9f15b8c356c54f55bfcb0ee3023fce8a } } public class Client…...
【总结】kubernates crd client-java 关于自定义资源的增删改查
Java model 准备 首先使用 crd.yml 和 kubernetes CRD 自动生成 Java model 类,这是一切的前提,之前在这个地方也卡了很久。如何生成在另外一个文章中已经有所记录。 使用 crd.yml 和 kubernetes CRD 自动生成 Java model 类 CustomObjectsApi 文档学习…...
蓝牙主要知识,一文概览
蓝牙知识相关 文章目录 蓝牙知识相关1.蓝牙版本的发展简史2.低功耗BLE PHY2.1 频段**2.2 BLE调制方案—GFSK**2.3 **蓝牙 LE 传输速度、功率和接收器灵敏度**2.4 **BLE 时分双工 (TDD)**3.BT主从连接过程3.1 主设备工作模式3.1.1 积木编程控制台3.2 从设备工作模式3.2.1 蓝牙遥…...
Linux 守护进程
一 何为守护进程 守护进程( Daemon )也称为精灵进程,是运行在后台的一种特殊进程,它独立于控制终端并且周期性 地执行某种任务或等待处理某些事情的发生,主要表现为以下两个特点: 长期运行。守护进程是一…...
自动驾驶技术的基础知识
自动驾驶技术是现代汽车工业中的一项革命性发展,它正在改变着我们对交通和出行的理解。本文将介绍自动驾驶技术的基础知识,包括其概念、历史发展、分类以及关键技术要素。 1. 自动驾驶概念 自动驾驶是一种先进的交通技术,它允许汽车在没有人…...
解决:yarn 无法加载文件 “C:\Users\XXXXX\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本“ 的问题
1、问题描述: 报错的整体代码为: yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本 // 整体的报错代码为 : yarn : 无法加载文件 C:\Users\admin\AppData\Roaming\npm\yarn.ps1&…...
【JVM--StringTable字符串常量池】
文章目录 1. String 的基本特性2. 字符串拼接操作3. intern()的使用4. StringTable 的垃圾回收 1. String 的基本特性 String 声明为 final 的,不可被继承String 实现了 Serializable 接口:表示字符串是支持序列化的。String 实现了 Comparable 接口&am…...
Large Language Models Meet Knowledge Graphs to Answer Factoid Questions
本文是LLM系列文章,针对《Large Language Models Meet Knowledge Graphs to Answer Factoid Questions》的翻译。 大型语言模型与知识图谱相遇,回答虚假问题 摘要1 引言2 相关工作3 提出的方法4 实验设计5 结果与讨论6 结论 摘要 最近,有研…...
blender 之视频渲染(以三维重建path为例)
blender 之视频渲染(以三维重建path为例) 1.新建轨迹路径2.设置相机,使其按照path运动3.将相机视角对准物体4.修改帧率5.设置输出路径6.设置输出格式7.渲染 1.新建轨迹路径 新建轨迹 选中新建的BezierCycle,按住S,拖…...
leetcode做题笔记166. 分数到小数
给定两个整数,分别表示分数的分子 numerator 和分母 denominator,以 字符串形式返回小数 。 如果小数部分为循环小数,则将循环的部分括在括号内。 如果存在多个答案,只需返回 任意一个 。 对于所有给定的输入,保证 …...
Android Studio新建项目缓慢解决方案
关于Android Studio2022新建项目时下载依赖慢的解决方案 起因解决方案gradle下载慢解决方案kotlin依赖下载慢解决方案 结尾 起因 新建Android Studio项目时,常会因为网络问题导致部分依赖下载缓慢,其中gradle和kotlin最拖慢进度。 解决方案 gradle下载…...
AmdU (5-azidomethyl-2‘-deoxyuridine)的反应原理|59090-48-1
产品简介:叠氮甲基dU(AmdU)是一种核苷类化合物,它含有叠氮基团,这种结构特点使其在细胞学和生物学领域得到了广泛应用。与胸腺嘧啶核苷相似的结构,使得叠氮甲基dU(AmdU)能够被细胞聚…...
使用nvm安装多个node版本
github下载地址: Releases coreybutler/nvm-windows (github.com) 安装了 nvm(Node Version Manager)后,可以使用以下步骤安装第二个 Node.js 版本: 打开终端或命令提示符。 使用以下命令列出可用的 Node.js 版本: …...
基于springboot实现自习室预订系统的设计与实现项目【项目源码+论文说明】分享
基于springboot实现自习室预订系统的设计与实现演示 摘要 在网络高速发展的时代,众多的软件被开发出来,给学生带来了很大的选择余地,而且人们越来越追求更个性的需求。在这种时代背景下,学院只能以学生为导向,所以自习…...
嵌入式游戏UI与动画实战:基于CircuitPython的对话框系统与位图动画实现
1. 项目概述与核心价值如果你在嵌入式平台上做过游戏开发,尤其是那种带有复古像素风格和复杂交互逻辑的项目,你肯定遇到过两个绕不开的难题:如何优雅地处理用户输入和反馈,以及如何在有限的硬件资源下实现流畅的动画效果。最近我在…...
Radiology(IF=15.2)中南大学湘雅二医院肖煜东教授等团队:基于CT放射组学的机器学习识别肝细胞癌瘤内纤维化及其潜在血管生成
01文献学习今天分享的文献是由中南大学湘雅二医院肖煜东教授等团队于2026年5月在放射学领域顶刊《Radiology》(中科院1区top,IF15.2)上发表的研究“CT Radiomics-based Machine Learning to Identify Intratumoral Fibrosis and Underlying A…...
Llama 3专用JavaScript分词器:原理、API与实战指南
1. 项目概述:一个为Llama 3量身定制的JavaScript分词器 如果你正在Web端或Node.js环境中折腾大语言模型,特别是Meta家的Llama 3系列,那么处理文本的第一步——分词(Tokenization)——很可能就是你遇到的第一个拦路虎。…...
AI应用分布式追踪系统GranClaw:从OpenTelemetry到微服务排障实战
1. 项目概述:一个为AI应用量身定制的分布式追踪系统如果你正在开发或维护一个涉及多个微服务、复杂调用链的AI应用,比如一个集成了大语言模型、向量数据库和多个数据处理服务的智能问答系统,那么你一定对“排障”这件事深有体会。当用户反馈“…...
从编码到网络:GLM模型在图论分析中的实战指南
1. GLM模型与图论分析的完美结合 第一次接触GLM模型是在分析脑网络数据时,当时手头有一批健康人和患者的脑功能连接数据,需要找出两组间的差异。传统方法只能逐个节点比较,效率低下且容易漏掉整体网络特征。直到发现GLM模型可以完美融入图论分…...
高性能计算能效优化:从异构架构到混合精度实践
1. 高性能计算能效优化的核心挑战在过去的十年里,高性能计算(HPC)系统的能耗问题已经从单纯的运营成本问题演变为制约科学发现速度的关键瓶颈。以欧洲核子研究中心(CERN)的大型强子对撞机(LHC)为…...
猫抓cat-catch浏览器扩展:专业级资源嗅探与下载解决方案
猫抓cat-catch浏览器扩展:专业级资源嗅探与下载解决方案 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾遇到这样的情况&#…...
copy4ai:专为AI工作流设计的智能复制工具,解决网页内容格式粘贴难题
1. 项目概述:一个为AI工作流设计的智能复制工具最近在折腾各种AI工具链的时候,我经常遇到一个挺烦人的问题:想把网页上的一段代码、一个表格,或者是一段带有特殊格式的文本,原封不动地喂给ChatGPT或者Claude࿰…...
高颜值、免费又好用的Linux命令速查神器:TUX星球,强烈推荐给大家!!
Linux 命令总是记不住?比死背更重要的是先学会“怎么查” 很多人刚开始接触 Linux 时,都会遇到一个很真实的问题:命令太多,参数太多,今天刚查过的 tar、grep、find,过两天又忘了;线上排查问题时…...
企业内训系统集成AI助教时如何通过Taotoken实现用量审计与风控
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业内训系统集成AI助教时如何通过Taotoken实现用量审计与风控 当企业将大模型能力以AI助教的形式集成到内部学习平台时࿰…...
