Flash学习

FLASH介绍

FLASH是常用的,用于存储数据的半导体器件,它具有容量大,可重复擦写,按“扇区/块”擦除、掉电后数据可继续保存的特性。

常见的FLASH有NOR FLASH和NAND FLASH。
NOR和NAND是两种数字门电路,可以简单地认为FLASH内部存储单元使用哪种门作存储单元就是哪种类型的FLASH。

U盘,SSD,eMMC等为NAND型,而NOR FLASH则根据设计需要灵活应用于各类PCB上,如BIOS,手机等。

FLASH有一个物理特性:只能写0,不能写1,写1全靠擦除。

NOR 与 NAND 在数据写入前都需要有擦除操作,但实际上 NOR FLASH 的一个 bit 可以从 1 变成 0,而要从 0 变 1 就要擦除后再写入。

擦除的最小单位是“扇区/块”,这意味着有时候即使只写一字节的数据,这个“扇区/块”上之前的数据都可能会被擦除。

NOR FLASH的地址线和数据线分开,它可以按“字节”读写数据,符合CPU的指令译码执行要求,所以假如NOR FLASH上存储了代码指令,CPU给NOR FLASH一个地址,NOR FLASH就能向CPU返回一个数据让CPU执行。
中间不需要额外的处理操作,这体现于XIP特性(eXecute In Place)。因此可以用NOR FLASH直接作为嵌入式MCU的程序存储空间。

NAND的数据和地址共用,只能按块读写数据,假如 NAND 上存储了代码指令,CPU 给 NAND 地址后,它无法直接返回该地址的数据,所以不符合指令译码要求。

若代码存储在 NAND 上,可以把它先加载到 RAM 存储器上,再有 CPU 执行。所以在功能上可以认为 NOR 是一种断电后数据不丢失的 RAM,但它的擦除单位与 RAM 有区别,且读写速度比 RAM 要慢得多。

NOR FLASH基于字节读写。

STM32内部 FLASH组成

在这里插入图片描述
内部FLASH用于保存要运行的代码和常量。
外部FLASH用于存储需要掉电保护的用户数据。

在这里插入图片描述

STM32内部FLASH简介

在STM32芯片内部有一个FLASH存储器,主要用于存储代码。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

闪存的读取

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

在这里插入图片描述
CPU通过ICode指令总线访问FLASH指令。
通过DCode数据总线访问FLASH数据。

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

在这里插入图片描述
正确设置好等待周期后,利用指针读取数据。

从地址addr,读取数据(字节为8位,半字为16位,字为32位)。
在这里插入图片描述
将addr强制转换为uintx_t指针,然后取该指针所指向的地址的值。

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

闪存的写入

闪存编程是由FPEC(闪存编程和擦除控制器)模块处理的。
写操作有4步:

  1. 解锁
  2. 擦除:FLASH物理特性(只能写0,不能写1),所以写FLASH之前需要擦除,将要写入的区域变为0xFFFF。擦除操作分为:页擦除和批量擦除。
  3. 写数据:可以向FLASH写数据,每次只能以16位方式写入
  4. 上锁

FLASH相关HAL库函数简介

  • HAL_FLASH_Unlock():关联寄存器FLASH_KEYR,用于解锁FLASH_CR的访问。
  • HAL_FLASH_Lock():关联寄存器FLASH_KEYR,用于锁定FLASH_CR的访问。
  • HAL_FLASH_PROGRAM():用于FLASH的写入。
  • HAL_FLASHEx_Erase():用于大量擦除或擦除指定的内存扇区
  • FLASH_WaitForLastOperation():等待操作完成

在这里插入图片描述

C语言中用static修饰函数作用

限制函数作用域
当static用于修饰函数时,它将限制该函数的作用域仅限于当前源文件。这样,其它源文件无法访问该函数,即使它们包含了相同名称的函数。这有助于防止函数名称冲突和提高代码的模块化性。

保留函数的静态存储(Internal Linkage): 在C语言中,未被修饰的函数默认具有外部链接性(external linkage),这意味着它们可以在其他源文件中使用。但是,当使用static修饰函数时,它将具有内部链接性(internal linkage),只能在当前源文件中使用。这也有助于提高程序的安全性和减少命名空间污染。

静态函数只在当前源文件中可见,但它仍然可以被当前文件内的其他函数调用。这种方式有助于将相关的函数组织在一起,但限制了可见性。

/* 静态函数(仅限stmflash.c调用) */
static void stmflash_unlock(void);                  /* 解锁STM32 内部FLASH */
static void stmflash_lock(void);                    /* 锁定STM32 内部FLASH */
static uint8_t stmflash_get_error_status(void);     /* 获取FLASH错误状态 */
static uint8_t stmflash_wait_done(uint32_t time);   /* 等待操作完成 */
static uint8_t stmflash_erase_sector(uint32_t saddr);                   /* 擦除扇区 */
static uint8_t stmflash_write_halfword(uint32_t faddr, uint16_t data);  /* FLASH写半字 */

在这里插入图片描述

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

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

相关文章

简述MyBatis、MyBatis-Plus、以及MyBatis-Plus的简单运用

什么是MyBatis MyBatis是一个开源的Java持久层框架,用于简化与关系型数据库的交互。它通过将SQL语句与Java代码进行分离,提供了一种优雅的方式来处理数据库操作。 MyBatis的核心思想是将SQL语句与Java方法进行映射,使得开发人员可以通过配置…

《ChatGPT实操应用大全》探索无限可能

🗣️探索ChatGPT,开启无限可能🚀 文末有免费送书福利!!! ChatGPT是人类有史以来最伟大的发明。他能写作、绘画、翻译、看病、做菜、编程、数据分析、制作视频、解高等数学题…,他会的技能…

FPGA 常用代码

边沿检测 Verilog边沿检测是数字电路设计中常用的方法之一。它是一种检测输入信号边沿变化的技术,用于实现时序控制、数据采集和数字信号处理等功能。其基本原理是通过触发器检测输入信号的状态变化,并触发相应的逻辑操作。 // 边沿检测模块 // 使用两…

docker踩坑记录:docker容器创建doris容器间无法通讯问题

背景: 开发大数据平台,使用doris作为数据仓储,使用docker做集群部署,先进行开发环境搭建,环境为BE1;FE1,原来使用官方例子,但是官方例子是创建了一个bridge使用172.20.80.0/24通讯,…

WPF Mvvm模式下面如何将事件映射到ViewModel层

前言 平常用惯了Command绑定,都快忘记传统的基于事件编程模式了,但是Commond模式里面有个明显的问题,就是你无法获取到事件源的参数。很多大聪明肯定会说,这还不简单,通过自己写控件,给控件加个自定义属性不就行了,想要啥事件就写啥事件进去,完全自主可控。但是对于写…

链式栈的结构与基本操作的实现(初始化,入栈,出栈,获取元素个数,判空,清空,销毁)

目录 一.链式栈的栈顶在哪里? 二.链栈的结构: 三.链式栈的实现: 四.链式栈的总结: 一.链式栈的栈顶在哪里? 二.链栈的结构: typedef struct LSNode{int data;struct LSNode* next;}LSNode ,*PLStack; //链栈的节点.由于栈顶在第一个数据节点,所以不需要top指针 三.链式…

基于SpringBoot高校心理教育辅导设计与实现

摘 要 随着Internet技术的发展,心理教育辅导系统应运而生,心理教育辅导系统为用户提供了一个更为便利的心理测试咨询平台。所以,为了充分满足高校学生心理教育辅导的需求,特开发了本高校心理教育辅导系统。 本高校心理教育辅导系统…

Python for循环及用法详解

for-in 循环专门用于遍历范围、列表、元素和字典等可迭代对象包含的元素。 for-in 循环的语法格式如下 for 变量 in 字符串|范围|集合等:statements 对于上面的语法格式有以下两点说明: for-in 循环中的变量的值受 for-in 循环控…

gstreamer移植

参考 arm-linux交叉编译Gstreamer(重要)gstreamer移植qnx(四):交叉编译qnx版本的gstreamer插件库(重要)gstreamer交叉编译关于linux:GStreamer上的“黑名单”是什么意思?gstreamer 环境变亮设置…

PHP实践:用ThinkPHP6完整实现用户分页功能

🏆作者简介,黑夜开发者,CSDN领军人物,全栈领域优质创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师…

太阳能路灯系统在道路照明中的应用

太阳能路灯作为一种极为科学和环保的光源利用形式,一直以来备受关注,但是,目前虽然有很多技术可以证明太阳能路灯的可行性,不过,如何真正的将太阳能路灯应用到道路照明之中,还是需要进行深入分析和探讨的。…

10个让UI设计更轻松的工具

UI设计软件对设计师来说非常重要。UI设计工具的使用是否直接影响到最终结果的质量,然后有人会问:UI界面设计使用什么软件?这里有一些UI设计师和那些对UI设计感兴趣的朋友列出了10个易于使用和免费的UI设计软件。 即时设计 即时设计是一款免…

腾讯云避坑——无法远程root登录

因为各种原因,最近需要使用腾讯云来代替阿里云。 但在ubuntu18/20的服务器中,我使用另一个电脑试图用scp命令来拷贝服务器中的一些文件,命令为: scp root服务器ip:文件目录 本地目录但一直显示密码错误。 原因是腾讯云ubuntu系统在创建时并不…

了解SpireCV如何利用G1吊舱进行点击跟踪

功能概述 SpireCV-SDK是一个专为智能无人系统打造的边缘实时感知SDK库。该库能够控制无人机的相机和吊舱,包括拍照、录像、推流等功能,并可以保存视频和进行推流。此外,SpireCV-SDK还集成了目标检测、识别与跟踪功能,以实现更智能…

关于加强型葡萄酒的类型有哪些?

加强型葡萄酒指的是在酿造过程中或酿造完后,添加酒精提高葡萄酒酒精度的葡萄酒,一般加强型葡萄酒的酒精度数都能达到15度以上。那么,云仓酒庄的品牌雷盛红酒分享加强型葡萄酒的类型有哪些呢? 云仓酒庄多品牌多代言运营模式&#…

量子光学的进步:光子学的“下一件小事”

量子光学是量子力学和光学交叉领域中发展迅速的一门学科,探索光的基本特性及其与物质在量子水平上的相互作用。通过利用光的独特特性,量子光学为通信、计算、密码学和传感等各个学科的变革性进步铺平了道路。 如今,量子光学领域的研究人员和工…

微信号被封了怎么办

13-7 常在河边走,哪有不湿鞋,做为经常用微信做电商客服的,或者经常在微信上和顾客谈钱的,总是会被微信后台重点关注,一不小心就有可能被封号。 如果遇到太倒霉的时候,永久封号了,这个时候微信…

基于SpringBoot的免税商品优选购物商城设计与实现

摘 要 随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势,免税商品优选购物商城当然也不能排除在外,随着购物商城的不断成熟,它彻底改变了过去传统的免税商品优选购物商城方式&…

FastDFS文件系统本地部署结合Nginx与内网穿透实现远程访问本地服务器

文章目录 前言1. 本地搭建FastDFS文件系统1.1 环境安装1.2 安装libfastcommon1.3 安装FastDFS1.4 配置Tracker1.5 配置Storage1.6 测试上传下载1.7 与Nginx整合1.8 安装Nginx1.9 配置Nginx 2. 局域网测试访问FastDFS3. 安装cpolar内网穿透4. 配置公网访问地址5. 固定公网地址5.…

python之pyqt专栏10-键盘事件

需求 通过按键盘的上下左右,移动button的位置。 UI界面设计 代码 # 导入sys模块 import sysfrom PyQt6.QtCore import Qt # PyQt6.QtWidgets模块中导入QApplication, QWidget from PyQt6.QtWidgets import QApplication, QWidget# untitled模块中导入Ui_Form类 f…