STM32 NAND FLASH知识点

1.NAND FLASH的简介

NAND FLASH 的概念是由东芝公司在 1989 年率先提出,它内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。 NAND FLASH 存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,在业界得到了广泛应用,如: SD 卡、 TF 卡、 U盘等,一般都是采用 NAND FLASH 作为存储的。 关于 NAND FLASH 的基础知识,请大家自行百度学习。接下来,我们介绍 NAND FLASH 的一些重要知识。

2.NAND FLASH 信号线

在这里插入图片描述因为 NAND FLASH 地址/数据是共用数据线的,所以必须有 CLE/ALE 信号,告诉 NAND
FLASH,发送的数据是命令还是地址。

3.存储单元

NAND FLASH 存储单元介绍,我们以 MT29F4G08( x8,8 位数据)为例进行介绍, MT29F4G08 的存储单元组织结构如图所示
在这里插入图片描述由图可知: MT29F4G08 由 2 个 plane 组成,每个 plane 有 2048 个 block,每个 block 由 64
个 page 组成,每个 page 有 2K+64 字节( 2112 字节)的存储容量。所以, MT29F4G08 的总容
量为: 2204864*( 2K+64) = 553648128 字节( 512MB)。其中, plane、 block、 page 等的个数,根据 NAND FLASH 型号的不同,会有所区别。

4.NAND FLASH 的地址

NAND FLASH 的地址分为三类:块地址( Block Address)、页地址( Page Address)和列地
址( Column Address)。以 MT29F4G08 为例,这三个地址,通过 5 个周期发送,如图所示
在这里插入图片描述
表中, CA0~CA11 为列地址( Column Address),用于在一个 Page 内部寻址, MT29F4G08
的一个 Page 大小为 2112 字节,需要 12 个地址线寻址; PA0~PA5 为页地址( Page Address),用于在一个 Block 内部寻址, MT29F4G08 一个 Block 大小为 64 个 Page,需要 6 个地址线寻址;
BA6~BA17 为块地址( Block Address),用于块寻址, MT29F4G08 总共有 4096 个 Block,需要
12 根地址线寻址。
整个寻址过程,分 5 次发送( 5 个周期),首先发送列地址,在发送页地址和块地址。这里提醒一下:块地址和页地址,其实是可以写在一起的,由一个参数传递即可,所以表中的 BA并不是由 BA0 开始的,大家可以理解为这个地址( PA+BA)为整个 NAND FLASH 的 Page 地址。在完成寻址以后,数据线 I/O0~ I/O7 来传输数据了。

5.NAND FLASH的控制命令

例如:读页命令
在这里插入图片描述
READ PAGE
该指令用于读取 NAND 的一个 Page(包括 spare 区数据,但不能跨页读),该指令时序如图所示:
在这里插入图片描述由图可知, READ PAGE 的命令分两次发送,首先发送 00H 命令,然后发送 5 次地址( Block&Page&Column 地址),指定读取的地址,随后发送 30H 命令,在等待 RDY 后,即可读取 PAGE 里面的数据。注意:不能跨页读,所以最多一次读取一个 PAGE 的数据(包括 spare区)。

6.FMC 接口的 NAND FLASH 控制寄存器

⚫ 独立 NAND FLASH 存储区域,可独立配置
⚫ 支持 8 位和 16 位 NAND FLASH
⚫ 支持硬件 ECC 计算(汉明码)
⚫ 支持 NAND FLASH 预等待功能

NAND FLASH 的控制寄存器: FMC_PCR,该寄存器各位描述如图所示:
在这里插入图片描述
该寄存器只有部分位有效,且都需要进行配置:
PWAITEN:该位用于设置等待特性: 0,禁止; 1,使能。这里我们设置为 0,禁止使用控制器自带的等待特性,因为如果使能的话,将导致 RGB 屏抖动( STM32 硬件 bug)。

PBKEN:该位用于使能存储区域: 0,禁止; 1,使能。我们要正常使用某个存储区域,必须设置该位为 1,所以,这个位要设置为 1。

PWID:这两个位,用于设置数据总线宽度: 00, 8 位宽度; 01, 16 位宽度。我们使用的MT29F4G08 为 8 位宽度,所以这里应该设置为: 00。

ECCEN:该位用于使能 STM32 的硬件 ECC 计算逻辑: 0,禁止/复位 ECC; 1,使能 ECC计算;每次读写数据前, 应该设置该位为 1,在数据读写完毕,读取完 ECC 值之后,设置该位为 0,复位 ECC,以便下一次 ECC 计算。

TCLR:这四个位用于设置 CLE 到 RE 的延迟: 0000~1111,表示 1~16 个 fmc_ker_ck 周期。对应 NAND FLASH 数据手册的 tCLR 时间参数: t_clr=(TCLR+SET+2)*Tfmc_ker_ck。 TCLR 就是本寄存器的设置值, SET 对应 MEMSET 的值(我只用到 MEMSET), Tfmc_ker_ck 对应fmc_ker_ck 的周期。 MT29F4G08 的 tCLR 时间最少为 10ns,以 220M 的 fmc_ker_ck 频率计算,一个 fmc_ker_ck=4.5ns(下同),我们设置 TCLR=5,则 t_clr 至少为 7 个 fmc_ker_ck 即 31.5ns。

TAR:这四个位用于设置 ALE 到 RE 的延迟: 0000~1111,表示 1~16 个 HCLK 周期。对应NAND FLASH 数据手册的 tAR 时间参数,这里设置的 t_ar=(TAR+SET+2)* Tfmc_ker_ck。 TAR就是本寄存器的设置值, SET 对应 MEMSET 的值(我只用到 MEMSET), Tfmc_ker_ck 对应fmc_ker_ck 的周期。 MT29F4G08 的 tAR 时间最少为 10ns,我们设置 TAR=5,则 t_ar 至少为 7个 fmc_ker_ck 即 31.5ns。

ECCCPS:这三个位用于设置 ECC 的页大小: 000, 256 字节; 001, 512 字节; 010, 1024字节; 011, 2048 字节;100, 4096 字节; 101, 8192 字节。我们需要以 512 字节为单位进行ECC 计算,所以 ECCCPS 设置为: 001 即可。

NAND FLASH 的空间时序寄存器: FMC_PMEM,该寄存器各位描述如图所示:
在这里插入图片描述
该寄存器用于控制 NAND FLASH 的访问时序,非常重要。我们先来了解下 NAND FLASH控制器的通用存储器访问波形,如图所示:
在这里插入图片描述
由图可知, MEMxSET+MEMxHOLD 控制 NWE/NOE 的高电平时间, MEMxWAIT 控制NWE/NOE 的低电平时间, MEMxHIZ 控制写入时数据线高阻态时间。接下来我们分别介绍这几个参数:

MEMSET: 这八个位定义使能命令( NWE/NOE)前,地址建立所需要的 fmc_ker_ck 时钟周期数,表示 NWE/NOE 的高电平时间, 0000 0000~1111 1110 表示 1~255 个 fmc_ker_ck 周期。MT29F4G08 的 tREH/tWH 最少为 10ns,设置 MEMSET=3,即 4 个 fmc_ker_ck 周期,约 18ns。另外, MEMHOLD,也可以用于控制 NWE/NOE 的高电平时间,在连续访问的时候, MEMHOLD
和 MEMSET 共同构成 NWE/NOE 的高电平脉宽时间。

MEMWAIT:这八个位用于设置使能命令( NWE/NOE)所需的最小 fmc_ker_ck 时钟周期数(使能 NWAIT 将使这个时间延长),实际上就是 NWE/NOE 的低电平时间, 0000 0000~1111,1110 表示 1~255 个 HCLK 周期。 MT29F4G08 的 tRP/tWP 最少为 10ns,我们设置 MEMWAIT =5,即 6 个 fmc_ker_ck 周期,约 27ns。这里需要设置时间比较长一点,否则可能访问不正常。

MEMHOLD:这八个位用于设置禁止使能命令( NWE/NOE)后,保持地址(和写访问数据)的 fmc_ker_ck 时钟周期数,也可以用于设置一个读写周期内的 NWE/NOE 高电平时间, 00000000~1111 1110 表示 0~254 个 HCLK 周期。我们设置MEMHOLD=2,表示 2 个 fmc_ker_ck 周期,加上前面的 MEMSET,所以 NEW/NOE 高电平时间为 6 个 HCLK,即 27ns 左右。

MEMHIZ:这八个位定义通用存储空间开始执行写访问之后,数据总线保持高阻态所持续的 fmc_ker_ck 时钟周期数。该参数仅对写入事务有效, 0000~1111 1110 表示 0~254 个 fmc_ker_ck周期。我们设置 MEMHIZ=3,表示 3 个 fmc_ker_ck 周期, 即 13.5ns 左右。

7.NAND FLASH和STM32芯片的连接图
在这里插入图片描述
8.STM32CubeMx配置Nand Flash

(1).选择FMC项
Data/Address:由于Nand Flash是地址和数据共线,由于MT29F4G08芯片是8根数据线,所以这里设置为8bits。

Ready or busy:等待特性使能/失能,对应FMC_PCR寄存器中的PWAITEN位,用于设置等待特性: 0,禁止; 1,使能。这里我们设置为 0,禁止使用控制器自带的等待特性,因为如果使能的话,将导致 RGB 屏抖动( STM32 硬件 bug)。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

ECC computation:ECC计算逻辑使能/失能,对应FMC_PCR寄存器中的ECCEN位,0:禁止/复位ECC,1:使能ECC计算

ECC page size:ECC页大小,对应FMC_PCR寄存器中的ECCCPS,这三个位用于设置ECC的页大小,256字节,512字节,1024字节,2048字节,4096字节,8192字节。

CLE low to RE low delay in HCLK cycles:CLE到RE的延迟,对应FMC_PCR寄存器中的TCLR,这四个位用于设置 CLE 到 RE 的延迟: 0000~1111,表示 1~16 个 fmc_ker_ck 周期。对应 NAND FLASH 数据手册的 tCLR 时间参数: t_clr=(TCLR+SET+2)*Tfmc_ker_ck。 TCLR 就是本寄存器的设置值, SET 对应 MEMSET 的值(我只用到 MEMSET), Tfmc_ker_ck 对应fmc_ker_ck 的周期。 MT29F4G08 的 tCLR 时间最少为 10ns,以 220M 的 fmc_ker_ck 频率计算,
一个 fmc_ker_ck=4.5ns(下同),我们设置 TCLR=5,则 t_clr 至少为 7 个 fmc_ker_ck 即 31.5ns。

ALE low to RE low delay in HCLK cycles:ALE到RE的延时,对应FMC_PCR寄存器中的TAR位,这四个位用于设置 ALE 到 RE 的延迟: 0000~1111,表示 1~16 个 HCLK 周期。对应NAND FLASH 数据手册的 tAR 时间参数,这里设置的 t_ar=(TAR+SET+2)* Tfmc_ker_ck。 TAR就是本寄存器的设置值, SET 对应 MEMSET 的值(我只用到 MEMSET), Tfmc_ker_ck 对应fmc_ker_ck 的周期。 MT29F4G08 的 tAR 时间最少为 10ns,我们设置 TAR=5,则 t_ar 至少为 7个 fmc_ker_ck 即 31.5ns。

NAND common space timing in HCLK cycles为NAND 通用存储器空间时序,NAND attribute space timing in HCLK cycles为NAND 特性存储器空间时序,这两个参数信息设置一致即可。

Common space setup time:地址建立的时间,对应空间时序寄存器,FMC_PMEM中的MEMSET,这八个位定义使能命令( NWE/NOE)前,地址建立所需要的 fmc_ker_ck 时钟周期数,表示 NWE/NOE 的高电平时间, 0000 0000~1111 1110 表示 1~255 个 fmc_ker_ck 周期。MT29F4G08 的 tREH/tWH 最少为 10ns,设置 MEMSET=3,即 4 个 fmc_ker_ck 周期,约 18ns。另外, MEMHOLD,也可以用于控制 NWE/NOE 的高电平时间,在连续访问的时候, MEMHOLD
和 MEMSET 共同构成 NWE/NOE 的高电平脉宽时间。

Common space wait time:对应空间时序寄存器,FMC_PMEM中的MEMWAIT,这八个位用于设置使能命令( NWE/NOE)所需的最小 fmc_ker_ck 时钟周期数(使能 NWAIT 将使这个时间延长),实际上就是 NWE/NOE 的低电平时间, 0000 0000~11111110 表示 1~255 个 HCLK 周期。 MT29F4G08 的 tRP/tWP 最少为 10ns,我们设置 MEMWAIT =5,即 6 个 fmc_ker_ck 周期,约 27ns。这里需要设置时间比较长一点,否则可能访问不正常。

Common space hold time:对应空间时序寄存器,FMC_PMEM中的MEMHOLD,这八个位用于设置禁止使能命令( NWE/NOE)后,保持地址(和写访问数据)的 fmc_ker_ck 时钟周期数,也可以用于设置一个读写周期内的 NWE/NOE 高电平时间, 00000000~1111 1110 表示 0~254 个 HCLK 周期。我们设置 MEMHOLD=2,表示 2 个 fmc_ker_ck 周
期,加上前面的 MEMSET,所以 NEW/NOE 高电平时间为 6 个 HCLK,即 27ns 左右。

Common space Hi-Z time:对应空间时序寄存器,FMC_PMEM中的MEMHIZ,这八个位定义通用存储空间开始执行写访问之后,数据总线保持高阻态所持续的 fmc_ker_ck 时钟周期数。该参数仅对写入事务有效, 0000~1111 1110 表示 0~254 个 fmc_ker_ck周期。我们设置 MEMHIZ=3,表示 3 个 fmc_ker_ck 周期, 即 13.5ns 左右。

Page size:Nand Flash芯片每页的字节数。
Spare area size:Nand Flash芯片每页中备份区域的字节数。
Block size:Nand Flash芯片中每块的字节数大小,字节限制为0-4294967295,因为最高支持的容量为4GB。128K+4K=135168。
Block number:Nand Flash芯片中块的数目。
Phane number:Nand Flash芯片中平面的数目。
Phane size:Nand Flash芯片中每个平面的字节数,128K+4K=135168,135168*1024=138412032。

(2).配置GPIO Settings
根据电路原理图,配置相应的管脚

9.MT29F4G08芯片时序时间表

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

VR 全景模式OpenGL原理

VR 全景模式OpenGL原理 VR 全景模式原理 VR 全景模式原理将画面渲染到球面上,相当于从球心去观察内部球面,观察到的画面 360 度无死角,与普通播平面渲染的本质区别在渲染图像部分,画面渲染到一个矩形平面上,而全景需…

字节跳动发布SDXL-Lightning模型,支持WebUI与ComfyUI双平台,只需一步生成1024高清大图!

字节跳动发布SDXL-Lightning模型,WebUI与ComfyUI平台,只需一步生成1024高清大图,需要的步数比 LCM 更低了! 什么是SDXL-Lightning: SDXL-Lightning 是一种快速的文本到图像生成模型。SDXL-Lightning模型的核心优势在于其创新的蒸馏策略,它可以通过几个步骤生成高质量的 1…

红黑树的简单介绍

红黑树 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍&#x…

服务器出现故障如何恢复数据?

服务器数据恢复案例之服务器raid6中3块硬盘离线导致阵列崩溃的数据恢复案例 服务器故障: 服务器中有一组由6块盘组建的 RAID6,这台网站服务器上运行MYSQL数据库和存放其它类型的文件。该组raid中有两块磁盘离线,管理员没有及时更换磁盘&#…

#QT(智能家居界面-界面切换)

1.IDE:QTCreator 2.实验 3.记录 (1)创建一个新界面(UI界面) (2)可以看到新加入一个ui文件,双击打开,设置窗口大小与登录界面一致 (3)加入几个PUS…

Linux 运维:CentOS/RHEL防火墙和selinux设置

Linux 运维:CentOS/RHEL防火墙和selinux设置 一、防火墙常用管理命令1.1 CentOS/RHEL 7系统1.2 CentOS/RHEL 6系统 二、临时/永久关闭SELinux2.1 临时更改SELinux的执行模式2.2 永久更改SELinux的执行模式 💖The Begin💖点点关注,…

【CSP试题回顾】201312-3-最大的矩形

CSP-201312-3-最大的矩形 解题思路 1. 遍历所有可能的矩形高度: 通过遍历所有矩形高度来找到最大的矩形,即对每个可能的高度 it(从直方图中的最小高度到最大高度 heightMax),代码将尝试找到在这个高度或以上的最长连…

Linux常用命令(超详细)

一、基本命令 1.1 关机和重启 关机 shutdown -h now 立刻关机 shutdown -h 5 5分钟后关机 poweroff 立刻关机 重启 shutdown -r now 立刻重启 shutdown -r 5 5分钟后重启 reboot 立刻重启 1.2 帮助命令 –help命令 shutdown --help: ifconfig --help:查看…

Unity 协程(Coroutine)到底是什么?

参考链接:Unity 协程(Coroutine)原理与用法详解_unity coroutine-CSDN博客 为啥在Unity中一般不考虑多线程 因为在Unity中,只能在主线程中获取物体的组件、方法、对象,如果脱离这些,Unity的很多功能无法实现,那么多线程…

(MATLAB)第十二章-数列与极限

目录 12.1 数列 12.1.1 数列求和 1. 累计求和函数sum() 2. 忽略NaN累计求和函数 nansum() 3. 求此元素位置之前的元素和函数cumsum() 4. 求梯形累计和函数cumtrapz() 12.1.2 数列求积 1. 元素连续相乘函数 prod() 2. 求累计积函数 cumprod() 3. 阶乘函数 ffactorial(n…

bun build

Bun 的快速原生打包器现已进入测试版阶段。可通过 bun build CLI 命令或 Bun.build() JavaScript API 使用。 bun build ./index.tsx --outdir ./build await Bun.build({entrypoints: [./index.tsx],outdir: ./build, }); 速度很快。下面的数字代表 esbuild 在 three.js 基…

Crossbar阵列的电路结构及其基本原理

忆阻器Crossbar阵列是一种先进的神经网络硬件实现技术,它利用忆阻器的物理特性来模拟神经网络中的突触连接,为人工智能和机器学习应用提供了一种高效、低能耗的计算平台。本文将深入探讨忆阻器Crossbar阵列的基本原理及其在Read(读取&#xf…

Studio One 6永久激活版 附完整图文安装破解教程

Studio One 6是一款功能强大的音乐制作和录音软件,专为Mac操作系统设计。它提供了多轨录音和混音、MIDI音乐制作、实时效果和处理、VST插件支持以及高级编辑和编排等丰富的功能。无论是专业音乐制作人还是音乐爱好者,都可以使用Studio One 6来创建和编辑…

Android m/mm/mmm/make编译模块

一.编译成模块的前置条件 Android编译环境初始化完成后,我们就可以用m/mm/mmm/make命令编译源代码了。lunch命令其实是定义在build/envsetup.sh文件中的函数lunch提供的。与lunch命令一样,m、mm和mmm命令也分别是由定义在build/envsetup.sh文件中的函数…

istio pod不启动及访问报RBAC错误问题解决

istio pod不启动问题解决 在kubernetes集群中安装istio之后,在创建的depoyment中已经使用了注入注解sidecar.istio.io/inject: true’配置,但是istio pod不创建,代码示例如下 kind: Deployment apiVersion: apps/v1 metadata:name: name-an…

Linux 操作系统概述

GNU计划 GNU --"GNUs Not UNIX" 建立一个自由、开放的UNIX操作系统(Free UNIX) GNU 通用公共许可证(General Public License,GPL) ”四项基本自由“ 按照自己的意愿自由地运行该软件自由地学习并根据…

高级大数据技术 实验一 scala编程

​ 高级大数据技术 实验一 scala编程 写的不是很好,大家多见谅! 1. 计算水仙花数 实验目标; (1) 掌握scala的数组,列表,映射的定义与使用 (2) 掌握scala的基本编程 实验说明 …

【系统需求分析报告-项目案例直接套用】

软件需求分析报告 软件开发要求项目建设内容物理设计安全系统设计安全网络安全设计应用安全设计用户安全管理性能设计稳定性设计安全性设计兼容性设计易操作性设计可维护行设计 软件开发全套精华资料过去进主页领取。

博弈论实用原理浅谈及题目实战【算法竞赛】

一、前言 本篇记录博弈论一些常见原理、做题技巧。 之前没有了解学习过博弈论,这篇文章可以当作记录学习笔记了。 二、初识博弈论 博弈论题目在竞赛中我感觉其实并不少见,只是需要技巧性很强,找到规律打代码很简单,而找不到基本上…

go语言基础 -- 面向对象 -- 接口与多态

接口定义与基本使用 - interface go语言中,接口类型可以定义一组方法,不需要在接口定义中实现方法,并且interface中不能含有变量,如果某个自定义类型要使用时再实现接口的方法。 golang中的接口不需要显式地实现,只要…