【STM32标准库】读写内部FLASH

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.rhkb.cn/news/375206.html

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

相关文章

ppt翻译免费怎么做?5个方法让你秒懂PPT的内容

当你收到一份来自海外的PPT资料&#xff0c;眼前或许是一片陌生的语言海洋&#xff0c;但别让这成为理解与灵感之间的障碍。 这时&#xff0c;一款优秀的PPT翻译软件就如同你的私人导航员&#xff0c;能迅速将这份知识宝藏转化为你熟悉的语言&#xff0c;让每一个图表、每一段…

Unity引擎制作玻璃的反射和折射效果

Unity引擎制作玻璃球玻璃杯 大家好&#xff0c;我是阿赵。   之前做海面效果的时候&#xff0c;没做反射和折射的效果&#xff0c;因为我觉得过于复杂的效果没有太大的实际作用。这方面的效果&#xff0c;我就做了现在这个例子来补充一下。 在这个demo场景里面&#xff0c;我…

社交媒体数据分析:赋能企业营销策略的利器

一、数据&#xff1a;未来的石油与导航仪 在数字化转型的大潮中&#xff0c;数据已成为推动企业发展的新燃料。它不仅是决策的依据&#xff0c;更是预见未来的水晶球。特别是在社交媒体这片广袤的海洋里&#xff0c;每一条帖子、每一次点赞、评论都蕴藏着消费者的偏好、市场的…

thinkphp8框架源码精讲

前言 很开心你能看到这个笔记&#xff0c;相信你对thinkphp是有一定兴趣的&#xff0c;正好大家都是志同道合的人。 thinkphp是我入门学习的第一个框架&#xff0c;经过这么多年了&#xff0c;还没好好的研究它&#xff0c;今年利用了空闲的时间狠狠的深入源码学习了一把&…

Proteus + Keil单片机仿真教程(五)多位LED数码管的静态显示

Proteus + Keil单片机仿真教程(五)多位LED数码管 上一章节讲解了单个数码管的静态和动态显示,这一章节将对多个数码管的静态显示进行学习,本章节主要难点: 1.锁存器的理解和使用; 2.多个数码管的接线封装方式; 3.Proteus 快速接头的使用。 第一个多位数码管示例 元件…

Qt学生管理系统(付源码)

Qt学生管理系统 一、前言1.1 项目介绍1.2 项目目标 2、需求说明2.1 功能性说明2.2 非功能性说明 三、UX设计3.1 登录界面3.2 学生数据展示3.3 信息插入和更新 三、架构说明3.1 客户端结构如下3.2 数据流程图3.2.1 数据管理3.2.2 管理员登录 四、 设计说明3.1 数据库设计3.2 结构…

嵌入式要卷成下一个Java了吗?

嵌入式系统与Java的关系在技术发展和市场需求的影响下在逐步演变&#xff0c;但尚未达到完全替代的阶段。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&…

system V共享内存【Linux】

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

【鸿蒙学习笔记】通过用户首选项实现数据持久化

官方文档&#xff1a;通过用户首选项实现数据持久化 目录标题 使用场景第1步&#xff1a;源码第2步&#xff1a;启动模拟器第3步&#xff1a;启动entry第6步&#xff1a;操作样例2 使用场景 Preferences会将该数据缓存在内存中&#xff0c;当用户读取的时候&#xff0c;能够快…

从2024上半年《人工智能现状报告》看GPU前世今生

前不久&#xff0c;全球领先的低代码平台Retool发布了最新的2024上半年《人工智能现状报告》&#xff0c;这份报告收集了约750名技术人员的意见&#xff0c;包括开发者、数据团队和各行业的领导者。报告通过调研人们对AI产生的情绪变化、AI应用现状、AI使用率等等几个方面总结了…

上海慕尼黑电子展开展,启明智显携物联网前沿方案亮相

随着科技创新的浪潮不断涌来&#xff0c;上海慕尼黑电子展在万众瞩目中盛大开幕。本次展会汇聚了全球顶尖的电子产品与技术解决方案&#xff0c;成为业界瞩目的焦点。启明智显作为物联网彩屏显示领域的佼佼者携产品亮相展会&#xff0c;为参展者带来了RTOS、LINUX全系列方案及A…

HTML 基础

文章目录 HTML 结构认识 HTML 标签HTML 文件基本结构快速生成代码框架 HTML 常见标签注释标签标题标签: h1-h6段落标签: p换行标签: br格式化标签图片标签: img超链接标签: a表格标签列表标签表单标签form 标签input 标签 label 标签select 标签textarea 标签无语义标签: div &…

浏览器书签助手mTab

本文软件由网友 P家单推人 推荐 什么是 mTab ? mTab 是免费无广告的浏览器书签助手&#xff0c;多端同步、美观易用的在线导航和书签工具&#xff0c;可以用 mTab 书签收藏并自定义常用网站的图标样式&#xff0c;帮助您高效管理网页和应用&#xff0c;提升在线体验。 官方提供…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行&#xff0c;可能是因为DNS不稳定吧&#xff0c;因为yum安装时会从三个”repo源“&#xff08;base&#xff0c;extras&#xff0c;updates&#xff09;随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时&#xff0c;比…

【开源项目的机遇与挑战】探索、贡献与应对

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一&#xff1a;开源项目的发展趋势 &#x1f343;开源项目的蓬勃发展现状 &#x1f343;开…

ubuntu16.04安装低版本cmake(安装cmake安装)

文章目录 ubuntu16.04安装低版本cmake&#xff08;安装cmake安装&#xff09;1. **下载并解压CMake压缩文件**&#xff1a;- 首先&#xff0c;你需要从CMake的官方网站或其他可靠来源下载cmake-2.8.9-Linux-i386.tar.gz文件。- 然后在终端中使用以下命令解压文件&#xff1a; 2…

C++相关概念和易错语法(18)(array、模板)

1.array &#xff08;1&#xff09;普通数组的劣势 当我们直接越界修改值时&#xff0c;一般会在编译时就被拦截 但是越界访问&#xff0c;只要访问距离不算特别大&#xff0c;那么也可以越界访问 当我们不直接越界修改或访问&#xff0c;间接去访问和修改能越界非常远 这里的…

FPGA上板项目(一)——点灯熟悉完整开发流程、ILA在线调试

目录 创建工程创建 HDL 代码仿真添加管脚约束添加时序约束生成 bit 文件下载ILA 在线调试 创建工程 型号选择&#xff1a;以 AXU9EG 开发板为例&#xff0c;芯片选择 xczu9eg-ffvb1156-2-i 创建 HDL 代码 注意&#xff1a;由于输入时钟为 200MHz 的差分时钟&#xff0c;因此…

嵌入式开发过程中,常见报错以及解决方法

编写不易&#xff0c;仅供学习&#xff0c;参考谢谢&#xff0c;还望理解。 #常见报错 文件最后一行没有新行 翻译&#xff1a;文件的最后一行结束时没有新行 解决方法&#xff1a;定位到&#xff0c;提示报错的 .h 文件 报错行 &#xff0c;加上一个新行 函数定义时与官方提…

Vue中实现在线画流程图实现

概述 最近在调研一些在线文档的实现&#xff0c;包括文档编辑器、在线思维导图、在线流程图等&#xff0c;前面的文章基于语雀编辑器的在线文档编辑与查看实现了文档编辑器。在本文&#xff0c;分享在Vue框架下基于metaeditor-mxgraph实现在线流程图。 实现效果 实现 1. 添加…