本文介绍: FLASH是常用的,用于存储数据的半导体器件,它具有容量大,可重复擦写,按“扇区/块”擦除、掉电后数据可继续保存特性常见的FLASH有NOR FLASH和NAND FLASH。NOR和NAND是两种数字电路可以简单地认为FLASH内部存储单元使用哪种门作存储单元就是哪种类型的FLASH。U盘,SSD,eMMC等为NAND型,而NOR FLASH则根据设计需要灵活应用于各类PCB上,如BIOS,手机等。FLASH有一个物理特性:只能写0,不能写1,写1全靠擦除

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库函数简介

在这里插入图片描述

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写半字 */

在这里插入图片描述

原文地址:https://blog.csdn.net/Caramel_biscuit/article/details/134705350

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_21700.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注