初学stm32 --- flash模仿eeprom

目录

STM32内部FLASH简介

 内部FLASH构成(F1)

FLASH读写过程(F1)

闪存的读取

闪存的写入

内部FLASH构成(F4 / F7 / H7)

 FLASH读写过程(F4 / F7 / H7)

闪存的读取 

闪存的写入

FLASH接口寄存器(写入 & 擦除相关)

FLASH相关HAL库函数简介(F1 / F4 / F7 / H7)

FLASH相关结构体:FLASH_EraseInitTypeDef

F103ZET6 stmflash_write思路

可操作的地址怎么确定?


STM32内部FLASH简介

        在STM32芯片内部有一个FLASH存储器,主要用于存储代码。

 内部FLASH构成(F1)

        内部FLASH主要由三部分组成:主存储器、信息块、闪存存储器接口寄存器。

主存储器:

        地址范围为0x0800 0000 ~ 0x0807 FFFF,分为256页,每页2KB(小/中容量为1K)。

        当BOOT0接地,系统将从0x0800 0000地址处开始读取代码(从主存储器启动)

信息块:

        系统存储大小为2KB,用来存储ST自带的启动程序,用来串口下载代码。

        选项字节大小为16B,一般用于设置内存的写保护、读保护

        当BOOT0VCCBOOT1GND (串口下载程序) ,系统运行的就是这部分代码

FLASH读写过程(F1)

  FLASH的核心操作就是

          FLASH的物理特性:只能写0,不能写1,写1擦除

闪存的读取

        直接在通用地址空间直接寻址,任何32位数据的读操作都能访问闪存模块的内容并得到相对应的数据。

        CPU运行速度比FLASH快得多,STM32F103FLASH最快访问速度≤24MHzCPU频率超过这个速度,得加入等待时间,否则读写FLASH可能出错,导致死机等情况。

        正确设置好等待周期后,利用指针读取数据。

        从地址addr,读取数据(字节为8位,半字为16位,字为32位)

                data = *(volatile uint8_t *)addr;  /* 读取一个字节数据 */

                data = *(volatile uint16_t *)addr;  /* 读取一个半字数据 */

                data = *(volatile uint32_t *)addr;  /* 读取一个字数据 */

        将addr强制转换为uintx_t指针,然后取该指针所指向地址的值,即可获得addr地址的数据。

        注意: 在进行写或擦除操作时,不能进行代码或数据的读取操作。

     

闪存的写入

        闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的。

        写操作有四步:解锁 à 擦除 à 写数据 à 上锁

解锁:将两个特定的解锁序列号(KEY1:0x45670123 KEY2:0xCDEF89AB依次写入FLASH_KEYR

擦除:FLASH物理特性(只能写0,不能写1),所以写FLASH之前需要擦除,将要写入的区域变为0xFFFF。擦除操作分为:页擦除和批量擦除

写数据:擦除完成,可以向FLASH写数据,每次只能16位方式写入

上锁:写入数据完成,需要设置FLASH_CR[LOCK]1,重新上锁,以防数据不小心被修改。

 

内部FLASH构成(F4 / F7 / H7)

        内部FLASH主要由四部分组成:主存储器、系统存储器、OPT区域和选项字节。

        闪存存储器接口寄存器,该部分用于控制闪存读写等,是整个闪存模块的控制机构。

         注意:对于H7来说,在Bank1内部有2KB大小的用户选项字节,不过没有映射到内存地址上,可通过FLASH相关寄存器访问。

        STM32F7的FLASH访问路径有两条:AXIMITCM,对应不同的地址映射。

F767 Bank1M闪存组织结构(默认)双Bank详看《STM32F7xx参考手册

 

 FLASH读写过程(F4 / F7 / H7)

        对FLASH的核心操作就是

        FLASH的物理特性:只能写0,不能写1,写1擦除

闪存的读取 

        正确设置好等待周期后,利用指针读取数据。

        从地址addr,读取数据(字节为8位,半字为16位,字为32位)

                data = *(volatile uint8_t *)addr;  /* 读取一个字节数据 */

                data = *(volatile uint16_t *)addr;  /* 读取一个半字数据 */

                data = *(volatile uint32_t *)addr;  /* 读取一个字数据 */

        将addr强制转换为uintx_t指针,然后取该指针所指向地址的值,即可获得addr地址的数据。

        注意: 在进行写或擦除操作时,不能进行代码或数据的读取操作。

        

闪存的写入

        STM32F4/F7/H7 FLASH进行写操作或擦除,电源电压会影响数据的最大操作位数

        最大操作位数会影响擦除和写入的速度。 

        开发板使用的电压是3.3VPSIZE设置10,即32并行位数。擦除或者写入都以32位为单位。

        写操作有四步:解锁 à 擦除 à 写数据 à 上锁

解锁:将两个特定的解锁序列号(KEY1:0x45670123 KEY2:0xCDEF89AB依次写入FLASH_KEYR

擦除:FLASH物理特性(只能写0,不能写1),所以写FLASH之前需要擦除,将要写入的区域变为0xFFFF。擦除操作分为:页扇区擦除和整片擦除

写数据:擦除完成,可以向FLASH写数据,根据PSIZE设置写入数据的单位

PSZIE:00 字节、PSIZE:01 半字、PSIZE:10 字、PSIZE:11 双字

上锁:写入数据完成,需要设置FLASH_CR[LOCK]1,重新上锁,以防数据不小心被修改。

      注意:对于STM32H7 FLASH写入的规则:写入首地址必须是32的倍数,写入数据长度必须是32字节的倍数。  

FLASH接口寄存器(写入 & 擦除相关)

FLASH_CR

LOCK:指示FLASH_CR寄存器是否被锁住(10未锁)

STRT:用于开始一次擦除操作(1开始)

PSIZE:用于设置编程宽度(3.3V PSIZE2

SNB:用于选择要擦除的扇区编号

SER:用于选择扇区擦除操作(页擦除置1

PG:用于选择编程操作,往FLASH写数据需置1

         对于H7还有FLASH_CCR 清除与控制寄存器用于清除相关错误。

FLASH相关HAL库函数简介(F1 / F4 / F7 / H7)

FLASH相关结构体:FLASH_EraseInitTypeDef

F1:

uint32_t	TypeErase	 	/* 擦除类型 */
uint32_t	Banks		/* 擦除的bank编号(整片擦除) */
uint32_t 	PageAddress	/* 擦除页面地址 */
uint32_t 	NbPages		/* 擦除的页面数 */

F4/F7/H7

uint32_t	TypeErase	 	
uint32_t	Banks		
uint32_t 	Sector	
uint32_t 	NbSectors
uint32_t	VoltageRange	

F103ZET6 stmflash_write思路

        每个扇区()2KB,也就是2048个地址,写任何一个地址前,如果该地址的值并不是0xFF,需先擦除再写入

根据w_addr,确定No.sector号以及w_addr在该sector的偏移

根据w_addrlength,确定写入的内容是否跨sector

确定好要操作的sector以及sector的地址范围

遍历要写的地址区域数据是否都是0xFF,如果都是不用擦除,否则需要先读出保存在buf后擦除

把该sector要操作的数据,也写到buf,最后一次性把buf写入到这个对应的sector即可

        跨扇区:需要注意偏移(扇区地址 / 扇区中的偏移 / 写入数据的偏移 / 写地址偏移 / 写入长度)

可操作的地址怎么确定?

        不能影响原有已存放有用数据的FLASH区域,通过MDK编译完成提示或者map文件可得占用flash大小。

        占用FLASH大小 4058827360 + 12868 + 360

        占用SRAM大小 4496360 + 4136

Code段:表示程序代码占用FLASH的大小(FLASH 

RO-data段,即Read Only-Data,程序定义的所有常量(FLASH 

RW-data段,即Read Write-Data,已经初始化的所有静态变量,占用FLASH空间(存储初值)和RAM(读写操作)

ZI-data(Zero initialized)段:未初始化的静态变量

RO(Read Only)段:指代码Code以及只读数据RO-data的统称,占用FLASH空间 

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

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

相关文章

Kinova仿生机械臂Gen3搭载BOTA 力矩传感器SeneOne:彰显机器人触觉 AI 与六维力传感的融合力量

随着工业4.0时代的到来,自动化和智能化成为制造业的趋势。机器人作为实现这一趋势的重要工具,其性能和智能水平直接影响到生产效率和产品质量。然而,传统的机器人系统在应对复杂任务时往往缺乏足够的灵活性和适应性。为了解决这一问题&#x…

浅谈计算机网络03 | 现代网络组成

现代网络组成 一 、网络生态体系1.1网络生态系统的多元主体1.2 网络接入设施的多样类型 二、现代网络的典型体系结构解析三、高速网络技术3.1 以太网技术3.2 Wi-Fi技术的深度剖析3.2.1 应用场景的多元覆盖3.2.2 标准升级与性能提升 3.3 4G/5G蜂窝网的技术演进3.3.1 蜂窝技术的代…

电子画册制作平台哪个好?

​作为一个热爱分享的人,我试过了好几个平台,终于找到了几款比较好用得电子杂志制作平台,都是操作界面很简洁,上手非常快的工具。 FLBOOK:这是一款在线制作H5电子画册软件,提供了各种类型的模板,可支持添加…

如何在 Google Cloud Shell 中使用 Visual Studio Code (VS Code)?

Google Cloud Shell 是一个基于浏览器的命令行界面,它提供了一个临时的虚拟机环境,允许开发者在没有本地环境配置的情况下使用 Google Cloud 的各种服务。它还提供了一个免费的 5GB 存储空间以及可以在其中执行所有 Google Cloud 操作的命令行界面。 Vis…

anaconda安装和环境配置

文章目录 一、Anaconda下载1.从官网直接下载:2.从镜像站中下载: 二、Anaconda安装三、检测是否有Anaconda配置anaconda环境 四、 Anaconda创建多个python环境(方便管理项目环境)1.查看conda有哪些环境2.创建python3.6的环境3.激活…

CF 641A.Little Artem and Grasshopper(Java实现)

题目分析 蚂蚱会在n个房间中根据既定房间规则向固定方向跳跃固定长度,试问是否能够跳出这个长度(即落点位置在0或n1) 思路分析 输入n就有n个房间,n套规则(固定方向和跳跃距离),蚂蚱到哪个房间就…

css 实现自定义虚线

需求: ui 画的图是虚线,但是虚线很宽正常的border 参数无法做到 进程: 尝试使用 border:1px dashed 发现使用这个虽然是虚线但是很短密密麻麻的 这并不是我们想要的那就只能换方案 第一个最简单,让ui 画一个图然…

Bottleneck层模型介绍

瓶颈设计的思想是引入一个瓶颈层,它由一系列不同大小的滤波器组成,通常是1x1、3x3和1x1的卷积层序列:第一个1x1卷积层:用于减少通道数,即降维,从而降低计算复杂度。 3x3卷积层:用于提取空间特征…

软件测试—接口测试面试题及jmeter面试题

一,接口面试题 1.接口的作用 实现前后端的交互,实现数据的传输 2.什么是接口测试 接口测试就是对系统或组件之间的接口进行测试,主要是校验数据的交换、传递和控制管理过程,以及相互逻辑关系 3.接口测试必要性 1.可以发现很…

使用python+pytest+requests完成自动化接口测试(包括html报告的生成和日志记录以及层级的封装(包括调用Json文件))

一、API的选择 我们进行接口测试需要API文档和系统,我们选择JSONPlaceholder免费API,因为它是一个非常适合进行接口测试、API 测试和学习的工具。它免费、易于使用、无需认证,能够快速帮助开发者模拟常见的接口操作(增、删、改、…

高等数学学习笔记 ☞ 不定积分的积分方法

1. 第一换元积分法 1. 基础概念:形如的过程,称为第一换元积分法。 2. 核心思想:通过对被积函数的观察(把被积函数的形式与积分表的积分公式进行比较),把外部的部分项拿到的内部(求原函数), 然后进行拼凑,…

win32汇编环境,窗口程序中基础列表框的应用举例

;运行效果 ;win32汇编环境,窗口程序中基础列表框的应用举例 ;比如在窗口程序中生成列表框,增加子项,删除某项,取得指定项内容等 ;直接抄进RadAsm可编译运行。重点部分加备注。 ;以下是ASM文件 ;>>>>>>>>>>>…

Jmeter配置服务代理器 Proxy(二)

1.创建脚本记录器 2.配置:Jmeter代理、端口、记录目标等 3.配置谷歌浏览器代理 浏览器配置代理的详细教程可参考:使用whistle代理-CSDN博客 4.启动Jmeter记录器 点击ok后弹出这个界面,生成了证书: 5.给浏览器安装Jmeter代理的证书…

红日-VulnStack靶场一

http://vulnstack.qiyuanxuetang.net/vuln/ 一、环境部署 win7(被攻击机/关火墙) web服务器 1张外网网卡(桥接192.168.1.105),一张内网网卡192.168.52.143/255.255.255.0/192.168.52.2 DNS 192.168.52.138 winser2008 域控服务器 1张…

Chrome谷歌浏览器如何能恢复到之前的旧版本

升级了谷歌最新版不习惯,如何降级版本 未完待续。。 电脑中的Chrome谷歌浏览器升级到了最新版本,但是有种种的不适应,如何能恢复到之前的旧版本呢?我们来看看操作步骤,而且无需卸载重装。 怎么恢复Chrome 之前版本&a…

云上贵州多彩宝荣获仓颉社区先锋应用奖 | 助力数字政务新突破

在信息技术应用创新的浪潮中,仓颉社区吸引了众多企业和开发者的积极参与,已有多个应用成功落地,展现出蓬勃的创新活力。仓颉编程语言精心遴选了在社区建设、应用创新、开源共建、技术布道等方面做出突出贡献的优秀项目应用,并颁发…

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…

Java算法 二叉树入门 力扣简单题相同的树 翻转二叉树 判断对称二叉树 递归求二叉树的层数

目录 模版 先序遍历 中序遍历 后序遍历 力扣原题 相同的二叉树 力扣原题 翻转二叉树 遍历树的层数 题目 静态变量 核心逻辑 模版 // 二叉树public static class Node{public int value;public Node left;public Node right;public Node(int v) {valuev;}} 先序遍历 …

P6周:VGG-16算法-Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 我的环境 语言环境:Python 3.8.12 编译器:jupyter notebook 深度学习环境:torch 1.12.0cu113 一、前期准备 1.设置GPU im…

Ubuntu、Windows系统网络设置(ping通内外网)

一、 虚拟机VMware和Ubuntu系统的网络配置说明 1、虚拟机的网络适配器的模式有三种: 桥接模式NAT模式主机模式 2、虚拟机VMware的网卡配置(如何进行配置界面(虚拟机->设置)) 注意: 1、以上桥接模式(ubuntu有独立IP)、NAT模式(没有独立IP)都可以联…