STM32CbueMX之NAND FLASH

2024-02-10 14:48
文章标签 flash nand stm32cbuemx

本文主要是介绍STM32CbueMX之NAND FLASH,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

关于NAND FLASH,外面好多例程都是关于时序的计算都是一笔带过。

只会告诉你a=2,但是不会告诉你为什么=2,而不是3.

所以找了挺多资料看,希望文章对你有帮助吧。

ECC我没研究。

本文代码链接:FSMCNAND.rar-其它代码类资源-CSDN下载

Nand flash

Nand-flash存储器是flash存储器的一种,其内部采用非线性宏单元模式,为固态大容量内存的实现提供了廉价有效的解决方案。Nand-flash存储器具有容量较大,改写速度快等优点,适用于大量数据的存储,因而在业界得到了越来越广泛的应用,如嵌入式产品中包括数码相机、MP3随身听记忆卡、体积小巧的U盘等。

硬件 :MT29F4G08+ F429

发送命令周期时序图:

STM32 FMC NAND寄存器

(MEMxSET + 1) + MEMxHOLD  控制NWE/NOE的高电平时间,

(MEMxWAIT + 1)  控制NWE/NOE的低电平时间,

MEMxHIZ 控制写入时数据线高阻态时间。

计算时序过程:

配置STM32CubeMX之前需要先把MEMxSET、MEMxWAIT、MEMxHOLD 和 MEMxHIZ算出来。

先看一下《AN4761 Application note Using STM32L476/486 FSMC peripheral to drive external memories》手册的4 Interfacing an 8-bit NAND Flash memory章节(手册可以在意法半导体STM32/STM8技术社区 - 提供最新的ST资讯和技术交流搜索AN4761找到)

得到下面时序计算不等式:

结合我们上面硬件芯片时序表格,代入不等式,未知数大等于0且向上取整:

tHCLK = 1s / 180MHz = 5.5ns

(SET + 1) x tHCLK ≥ max (tCS, tCLS, tALS, tCLR, tAR) - tWP

(SET + 1) x 5.5 >= max (15, 10, 10, 10, 10) - 10 

(SET + 1) x 5.5 >= 15 - 10 

SET >= 0  即可让不等式成立;

不等式(SET + 1) x 5.5 >= 5 ,SET >= 0 虽然不等式成立;

但是5.5ns仅仅比5ns大了0.5ns,考虑到走线等等因素,建议SET >= 1;(向上加 1)

(HIZ) x tHCLK ≥ max (tCS, tALS, tCLS) + (tWP - tDS)

(HIZ) x 5.5 ≥ max (15, 10, 10) + (10 - 7)

(HIZ) x 5.5 >= 15 + 3

HIZ >= 4  即可让不等式成立;

(HOLD) x tHCLK ≥ max (tCH, tCLH, tALH)

(HOLD) x tHCLK ≥ max (5, 5, 5)

(HOLD) x tHCLK ≥ 5

HOLD >= 1 即可让不等式成立;

不等式HOLD x 5.5 >= 5 ,HOLD >= 1 虽然不等式成立;

但是5.5ns仅仅比5ns大了0.5ns,考虑到走线等等因素,建议HOLD >= 2;(向上加 1)

WAIT 计算比较麻烦:必须满足下面几条不等式:

(WAIT + 1) x tHCLK ≥ max (tWP, tRP)

(WAIT + 1)× tHCLK ≥ (tREA + tsu(D-NOE))

WAIT ≥ (tREA + tsu(D-NOE)) /tHCLK - 1

tsu(D-NOE) = 9 ns(来自如《DS9405 STM32F427xx STM32F429xx datasheets》)

最后的计算结果:WAIT  >= 4 即可让不等式成立;

最后一步验证一下:

((WAIT + 1) + (HOLD) + (SET + 1)) x tHCLK ≥ max (tWC/RC)

((4+ 1) + (2) + (1+ 1)) x 5.5 ≥ 20

成立!

得到下面结果:

MEMxSET = 1

MEMxWAIT = 4

MEMxHOLD  = 2

MEMxHIZ = 4

STM32MXCUBEMX配置:

NAND FLASH使用的是AHB时钟,180MHz,1 HCLK = 5.5ns

ECC computation  使能ECC纠正

ECC page size        选PAGE大小,芯片的page大小是2048

CLE low to RE low delay in HCLK cycles  = 1

ALE low to RE low delay in HCLK cycles = 1

由下图手册得知:t_clr = (TCLR + SET + 2) × THCLK ;其中 TCLR 是我们软件CLE low to RE low delay in HCLK cycles的设置值,而SET手册也有写 “注意: 根据寻址空间,SET 为 MEMSET 或 ATTSET”。芯片手册tCLR = 10ns

THCLK = 1 / 180MHz = 5.5ns。由于MEMSET = 1;故TAR >= 0即可。

那为什么软件配置是CLE low to RE low delay in HCLK cycles  = 1 呢,

看下面手册 TAR = 0,实际上是1个tHCKL。而软件配置问的是几个tHCKL,

那么配置写1个tHCKL,生成代码的时候会变成0。

ALE low to RE low delay in HCLK cycles计算过程如上。

Common space setup time = MEMxSET = 2 tHCLK;

STM32CubeMX 的Common space setup time的单位是tHCLK;从下面手册图可以看到 

MEMxSET = 0的时候就是1个tHCLK;由于上面我们已经算出来MEMxSET 取 1,即2tHCLK。

图片来源于《STM32F4xx中文参考手册-扩展章节.pdf》

Common space wait time = MEMxWAIT = 4 tHCLK

Common space hold time = MEMxHOLD  = 2 tHCLK(这个参数  不  需要MEMxHOLD  往上加1

Common space Hi-Z time = MEMxHIZ = 4 tHCLK

下面4个参数和上面4个参数设置过程类似。

Attribute space setup time = MEMxSET = 1 tHCLK

Attribute space wait time = MEMxWAIT = 4 tHCLK

Attribute space hold time = MEMxHOLD  = 2 tHCLK

Attribute space Hi-Z time = MEMxHIZ = 4 tHCLK

看图配置

Page size = 2048 bytes

Spare area size = 64 bytes

Block size = 64 pages

Block number = 2048 blocks

Plane number = 2 planes

Plane size = 4096 blocks

Extra command enable  = Disabled

生成代码。

main.c

int main(void)
{/* USER CODE BEGIN 1 */uint32_t i = 0;NAND_IDTypeDef id;NAND_AddressTypeDef temp;/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();MX_FMC_Init();/* USER CODE BEGIN 2 */HAL_Delay(100);printf("sudaroot\r\n");HAL_NAND_Reset(&hnand1);HAL_NAND_Read_ID(&hnand1, &id);printf("HAL_id = 0x%X\r\n", *((unsigned int *)&id));for(i = 0; i < NAND_PAGE_SIZE; i++){buf[i] = 0xFA;}temp.Plane = 0;temp.Block = 0;temp.Page = 0;printf("HAL_NAND_Erase_Block = %d\r\n", HAL_NAND_Erase_Block(&hnand1, &temp));printf("HAL_NAND_Write_Page_8b = %d\r\n", HAL_NAND_Write_Page_8b(&hnand1, &temp, buf, 1));memset(buf, 0, NAND_PAGE_SIZE);printf("HAL_NAND_Read_Page_8b = %d\r\n", HAL_NAND_Read_Page_8b(&hnand1, &temp, buf, 1));for(i = 0; i < NAND_PAGE_SIZE; i++){if((i % 5) == 0)  printf("\r\n");printf("buf[%04d] = 0x%02X ", i, buf[i]);        }printf("\r\n");/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);HAL_Delay(100);}/* USER CODE END 3 */
}

现象:

20200715:更新main函数的测试代码

int main(void)
{uint32_t i = 0;NAND_IDTypeDef id;NAND_AddressTypeDef temp;temp.Plane = 0;temp.Block = 0;temp.Page = 0;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_FMC_Init();HAL_Delay(100);printf("sudaroot\r\n");// 1、复位NAND芯片,读取芯片IDHAL_NAND_Reset(&hnand1);HAL_NAND_Read_ID(&hnand1, &id);printf("1.HAL_id = 0x%X\r\n", *((unsigned int *)&id));// 2、擦除第0页所在的第0块的数据,并打印HAL_NAND_Erase_Block函数执行结果printf("3.HAL_NAND_Erase_Block = %d\r\n", HAL_NAND_Erase_Block(&hnand1, &temp));// 3、读取在芯片第0页的数据,并打印HAL_NAND_Read_Page_8b函数执行结果memset(buf, 0, NAND_PAGE_SIZE);printf("2.HAL_NAND_Read_Page_8b = %d\r\n", HAL_NAND_Read_Page_8b(&hnand1, &temp, buf, 1));for(i = 0; i < NAND_PAGE_SIZE; i++){if((i % 5) == 0)  printf("\r\n");printf("buf[%04d] = 0x%02X ", i, buf[i]);}printf("\r\n");// 4、初始化数据,把新的数据写入芯片第0页,并打印HAL_NAND_Write_Page_8b函数执行结果for(i = 0; i < NAND_PAGE_SIZE; i++){buf[i] = i & 0x00FF;}printf("4.HAL_NAND_Write_Page_8b = %d\r\n", HAL_NAND_Write_Page_8b(&hnand1, &temp, buf, 1));// 5、重新读取芯片第0页数据,并打印HAL_NAND_Read_Page_8b函数执行结果memset(buf, 0, NAND_PAGE_SIZE);printf("5.HAL_NAND_Read_Page_8b = %d\r\n", HAL_NAND_Read_Page_8b(&hnand1, &temp, buf, 1));for(i = 0; i < NAND_PAGE_SIZE; i++){if((i % 5) == 0)  printf("\r\n");printf("buf[%04d] = 0x%02X ", i, buf[i]);}printf("\r\n");while (1){HAL_Delay(100);}
}

现象:

1、读取芯片ID.证明时序配置正常。

2、擦除第0页所在的第0块的数据,并打印HAL_NAND_Erase_Block函数执行结果(0表示成功)

3、读取在芯片第0页的数据,并打印HAL_NAND_Read_Page_8b函数执行结果(此时数据全是0xFF)

4、初始化数据0x00~0xFF循环,把新的数据写入芯片第0页,并打印HAL_NAND_Write_Page_8b函数执行结果

5、重新读取芯片第0页数据,并打印HAL_NAND_Read_Page_8b函数执行结果,数据0x00~0xFF循环,正确。

  全篇完。

本人是一个嵌入式未入门小白,博客仅仅代表我个人主观见解,记录成长笔记。
笔记是以最简单的方式,只展示最核心的原理。
若有与 大神大大 见解有歧义,我绝对坚信 大神大大 见解是对的,我的是错的。
若无积分等无法下载源码,可加入QQ群657407920下载交流经验。感谢~!

 

 

这篇关于STM32CbueMX之NAND FLASH的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/697393

相关文章

什么是 Flash Attention

Flash Attention 是 由 Tri Dao 和 Dan Fu 等人在2022年的论文 FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 中 提出的, 论文可以从 https://arxiv.org/abs/2205.14135 页面下载,点击 View PDF 就可以下载。 下面我

STM32内部闪存FLASH(内部ROM)、IAP

1 FLASH简介  1 利用程序存储器的剩余空间来保存掉电不丢失的用户数据 2 通过在程序中编程(IAP)实现程序的自我更新 (OTA) 3在线编程(ICP把整个程序都更新掉) 1 系统的Bootloader写死了,只能用串口下载到指定的位置,启动方式也不方便需要配置BOOT引脚触发启动  4 IAP(自己写的Bootloader,实现程序升级) 1 比如蓝牙转串口,

STM32 ADC+DMA导致写FLASH失败

最近用STM32G070系列的ADC+DMA采样时,遇到了一些小坑记录一下; 一、ADC+DMA采样时进入死循环; 解决方法:ADC-dma死循环问题_stm32 adc dma死机-CSDN博客 将ADC的DMA中断调整为最高,且增大ADCHAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, ADC_Buffer_Size); 的ADC_Bu

通过 Flash 让所有浏览器支持 WebP 格式图像解码

http://www.guao.hk/tag/webp#userconsent# http://www.etherdream.com/WebP/

提高Flash builder编译速度 (转)

提高Flash builder编译速度   2013-04-08 03:14:42|  分类: flash |  标签: |举报 |字号大中小 订阅 我们在开发过程中随着项目的不断壮大,经常会碰到编译速度过慢,IDE崩溃等令人头痛的问题,这里我总结了一下网上别人的经验,对FB进行了3点优化,效果明显  1、把 Build Auto 改成 手动 Build  2

DM8168 关于nand flash的折腾之路

主机平台:ubuntu 12.04  目标平台:TI DM8168 开发套件:*****北京某公司开发板 拿到板子,看了看资源,看了看平台的组成,上网看了看这写博客的评价,之后就开始了折腾之路,还是老方法;首先用厂商给的东西,原封不动的启动,摸索认识一番,TI给的是带开发套件的SD卡,按照 【快速开始QSG】;拨马开关-连线上电,启动。一切ok. 接着安装交叉编译工具,配置host主

“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程

“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程 文章目录 一、“FLASH闪存”是什么?1. 简介2. 特点3. 未来发展 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程 三、STM32测试例程 本篇除了对flash闪存进行简单介绍外,另给读

【保姆级教程】“Flash闪存”介绍 及 “SD NAND Flash”产品的测试含例程

文章目录 一、“FLASH闪存”是什么?1. 简介2. 特点2.1 性能2.2 可靠性2.3 耐用性2.4 易于使用 3. 未来发展 二、SD NAND Flash1. 概述2. 特点3. 引脚分配4. 数据传输模式5. SD NAND寄存器6. 通电图7. 参考设计 三、STM32测试例程1. 初始化2. 单数据块测试3. 多数据块测试4. 状态缓冲 本篇除了对flash闪存

LiDAR 4 固态激光雷达 (Flash LiDAR)

固态激光雷达分为Flash LiDAR和OPA (Optical Phased Array) LiDAR,Flash LiDAR是非扫描式的,OPA LiDAR 是扫描式的。Flash LiDAR的发射光源和接收部件都是阵列式结构。 Leddar Tech的Flash LiDAR模块, Linear array光源从上至下依次点亮,形成一个点阵面。 Ibeo的方案, 发射光源为VCSEL,128列

仿FLASH的图片轮换播放器

效果思路             两边的按钮——淡入淡出             大图下拉——层级、高度变化             下方的li——多物体淡入淡出             下方的Ul——位置计算         左右按钮           淡入淡出             鼠标移到按钮上,按钮会消失                 层级问题