STM32增强型微控制器访问NAND Flash学习笔记.docx
- 文档编号:30006717
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:13
- 大小:268.56KB
STM32增强型微控制器访问NAND Flash学习笔记.docx
《STM32增强型微控制器访问NAND Flash学习笔记.docx》由会员分享,可在线阅读,更多相关《STM32增强型微控制器访问NAND Flash学习笔记.docx(13页珍藏版)》请在冰豆网上搜索。
STM32增强型微控制器访问NANDFlash学习笔记
一、了解NANDFlash
Flash即是存储芯片的一种,其结合了ROM和RAM的特点,既具备电可擦除编程的性能,又可以快速读取数据,数据不会因断电丢失。
目前市面上Flash主要有NORFlash和NANDFlash。
简单的理解就是,NOR Flash具有随机存取和随字节执行写操作的能力,即可以访问到存储器内部的任意一个字节,且具有读取速度快等特点,它占据1MB—16MB闪存的大部分市场,根据其读取数据速度快的特点主要应用在代码存储;而NANDFlash以“页”为单位进行对数据的读写操作,且具有写入和擦除速度快等特点,它应用在8MB—256MB的产品中,根据其特点主要应用在数据存储上。
以型号HY27UF081G2A的NANDFlash芯片为例,其总线宽度为8bit,总内存大小为1Gbit(即128MB),共分为1024块(Block),每块又分为64页(Page),每页共2KB(mainmemory)+64B(sparememory),mainmemory用来存放数据,spare memory用来标记已坏的块区和保存对main memory的ECC校验码等(正常情况下不用)。
更多的HY27UF081G2A资料参照相关Datasheet。
二、了解HY27UF081G2A芯片引脚功能和NAND Flash接口时序及控制命令
1、引脚说明
图1 引脚图
图2 引脚名称
2、地址周期
图3 地址周期
其中A10—A0表示页内地址偏移(表示0—2047字节,1页大小即为2K)
A11表示上半页或者下半页(这位程序员无需关心,决定A10—A0时也间接决定了A11)
A17—A12表示页地址(表示0—63页)
A27—A18表示块地址(表示0—1023块)
由于NANDFlash访问的单位是“页”,设置访问地址时只需要确定A27—A12的值即可确定到某一页,如果要从页内的某一位置开始访问,则根据需要设置A10—A0位来确定从页内第几个字节开始访问,如:
要访问存储空间为第3块的第5页,且从第100字节开始进行访问,则对应的4个Cycle周期的地址信号为:
1 st :
0x64 , 2nd :
0x00 , 3 rd :
0xC5 , 4th :
0x00
3、了解控制命令,如下所示
图4 控制命令
4、了解接口时序,对该存储器进行访问操作有读取芯片ID、读页数据、写页数据,块擦除等共有13种,每种不同的操作对应不用的接口时序,此处只例举其中的4种操作:
读取芯片ID、读页数据、写页数据、块擦除相应的接口时序图,更多操作参阅其Datasheet。
图5 读取芯片ID时序
图6 读取一页数据
图7 写一页数据(页编程)
图8 块擦除
同时应注意一些时序参数,如在上几幅时序图中出现的tAR(ALE至~RE的延时),tCLR(CLE至~RE的延时)等等,这些时间参数都有不同的取值范围(ns级别),时序图中出现的Col Add1、ColAdd2为列地址表示页内地址偏移,对应4个Cycle地址中的第1、第2个,RowAdd1、RowAdd2为行地址标识某块某页地址,对应4个Cycle地址中的第3、第4个。
更多详细资料参见相关Datasheet。
三、STM32F10x增强型控制器的FSMC模块
FSMC(可变静态存储控制器)是STM32系列微控制器采用的一种新型的存储器扩展技术,可根据系统的需要方便的进行不用类型大容量静态存储器的扩展;简单的理解FSMC模块可对多种外接存储器进行控制,其主要包括NOR Flash、NAND Flash、PC卡,下面对访问NANDFlash介绍。
1、STM32F10x控制器与HY27UF081G2A的对接
先看STM32F10x控制器提供的NANDFlash接口(这里为8位的NAND闪存)
图9 STM32F10x控制器的NANDFlash接口
接口各信号对应的GPIO口为:
A[17] :
PD12
A[16] :
PD11
D[0:
7] :
PD14,PD15,PD0,PD1,PE7,PE8,PE9,PE10
NCE[x]:
这里使用NCE[2],对应GPIO口为PD7
NOE(=NER) :
PD4
NWE :
PD5
NWAIT/INT[3:
2] :
PD6(根据情况使用该引脚信号,这里不使用)
结合HY27UF081G2A的引脚功能说明,STM32与HY27UF081G2A的连线方式选择如下:
STM32F10x的NAND接口 HY27UF081G2A引脚
D[0:
7]------------------------------------------IO0~IO7
A[17]-------------------------------------------ALE
A[16]-------------------------------------------CLE这里使用PG6接到R/~B,在检测NAND Flash
NEC[2]------------------------------------------~CE
NOE---------------------------------------------~RE
NWE--------------------------------------------~WE
PG6---------------------------------------------R/~B(是否忙时直接读取PG6引脚上的电平来判断)
2、NAND地址映像及功能介绍
图10 存储器映像和时序寄存器(这里只用块2来控制访问NANDFlash)
通用和属性空间又可以在低256K字节部分画分为三个区
图11 存储块选择
应用软件使用这三个区访问NAND Flash存储器:
发送命令至NANDFlash:
对命令区任意地区写入命令即可。
指定NAND Flash的地址:
对地址区任意地址写入地址命令即可,一个NAND地址有4或5个字节(这里使用的HY27UF081G2A芯片为4个字节),需要连续地执行对地址区的写才能输出完整的操作地址。
读写数据:
软件只需对数据区任意一个地址写入或读出数据即可。
注:
因为NANDFlash存储器自动累加其内部的操作地址,读写数据时没有必要变换数据区的地址,即不必对连续的地址区操作;应用软件使用这三个区进行访问NANDFlash之前要先完成对相应的管理寄存器的初始化配置,下面介绍相应的管理配置寄存器。
3、STM32的NANDFlash存储器块通过以下一组寄存器来管理配置
控制寄存器:
FSMC_PCRx
中断状态寄存器:
FSMC_SRx
ECC寄存器:
FSMC_ECCRx
通用存储器空间的时序寄存器:
FSMC_MEMx
属性存储器空间的时序寄存器:
FSMC_PATTx
I/O空间的时序寄存器:
FSMC_PIOx
注:
这里用的是块2部分,因此上面寄存器中的x=2。
对于要只控制NANDFlash存储器,上面的三个时序寄存器中只用到FSMC_MEMx,配置该寄存器来控制NAND通用存储空间的访问时序,该寄存器中保存着访问时序的4个时间参数(MEMsSET+1、MEMxHIZ+1、MEMxWAIT+1、MEMxHOLD+1),每个时间参数的具体说明可参阅STM32相应Datasheet。
访问时序图如下:
图12 STM32的NAND通用存储空间的访问时序
对NANDFlash的简单控制访问(读、写、擦除等)这里只需要配置FSMC_PCRx和FSMC_MEMx这两个寄存器就够了,对NAND Flash复杂的控制访问(检测坏块、ECC校验等)此处不做研究。
FSMC_PCRx和FSMC_MEMx寄存器功能参阅STM32相关Datasheet。
四、STM32F10x控制器访问HY27UF081G2A过程
针对于简单的读、写、擦除等访问,则过程为:
1、管理寄存器FSMC_PCRx和FSMC_MEMx初始化
2、通过访问通用空间的命令区、数据区、地址区完成对NANDFlash的读、写、擦除等操作。
软件实现过程:
(在此之前要完成系统时钟配置、相应的总线时钟使能、相应GPIO口的初始化工作,这里不再进行说明)
1、管理寄存器FSMC_PCRx和FSMC_MEMx初始化
FSMC_PCRx=0x00060048;
(设置ECC页面大小2048字节、ALE至~RE的延时为1个HCLK,CLE至~RE的延时为1个HCLK,使能ECC电路,设置总线宽度为8位,设置存储器类型为NANDFlash,关闭模块功能,关闭模块等待功能)
FSMC_MEMx=0x01020301; //设置MEMsSET+1=4个HCLK、MEMxHIZ+1=3个HCLK、
//MEMxWAIT+1=4个HCLK、MEMxHOLD+1=4个HCLK
FSMC_PCRx|=0x00000002; //使能模块功能
2、对NANDFlash的读、写、擦除等操作根据HY27UF081G2A的接口时序来对STM32的NAND通用命令、数据、地址区进行访问操作:
预先宏定义命令、数据、地址区的地址空间:
#define NAND_DATA 0x70000000 //数据空间
#define NAND_CMD 0x70010000 //命令空间
#define NAND_ADDR 0x70020000 //地址空间
根据HY27UF081G2A的地址周期(图3)、命令控制(图4)、接口时序(图5、6、7、8)得到
-----------------------------------------------------------------------------------------------------------------------------------------------
如读取ID操作:
u32data; //u32 即 unsignedint(32位系统中即为4字节)
*(vu8*)(NAND_CMD)=0x90;//vu8 即 volatileunsignedchar
*(vu8*)(NAND_CMD)=0x00;
data=*(uv32*)(NAND_DATA);
此时data中的四个字节就包含了从HY27UF081G2A中读出来的芯片ID。
-----------------------------------------------------------------------------------------------------------------------------------------------
如读第3块、第5页的全部数据,则4个周期地址分别为:
1st:
0x00,2st:
0x00,3st:
0xC5,4st:
0x00。
u8pbuf[2048],i; //1页有2048字节
*(vu8*)(NAND_CMD)=0x00;
*(vu8*)(NAND_ADDR)=0x00;
*(vu8*)(NAND_ADDR)=0x00;
*(vu8*)(NAND_ADDR)=0xC5;
*(vu8*)(NAND_ADDR)=0x00;
*(vu8*)(NAND_CMD)=0x30;
while(GPIO_ReadInputDataBit(GPIOG,GPIO_PIN_6)==0);//等待PG6引脚被拉高
for(i=0;i<2048;i++)
{
pbuf[i]=*(vu8*)(NAND_DATA);
}
此时pbuf[2048]保存了从NANDFlash的第3块第5页读出来的全部数据。
-----------------------------------------------------------------------------------------------------------------------------------------------如读第3块、第5页的全部数据,则4个周期地址分别为:
1st:
0x00,2st:
0x00,3st:
0xC5,4st:
0x00。
u8pbuf[2048]={0x00},i,status=0x00;
*(vu8*)(NAND_CMD)=0x80;
*(vu8*)(NAND_ADDR)=0x00;
*(vu8*)(NAND_ADDR)=0x00;
*(vu8*)(NAND_ADDR)=0xC5;
*(vu8*)(NAND_ADDR)=0x00;
for(i=0;i<2048;i++)
{
*(vu8*)(NAND_DATA)=pbuf[i];
}
*(vu8*)(NAND_CMD)=0x10;
while(GPIO_ReadInputDataBit(GPIOG,GPIO_PIN_6)==0);//等待PG6引脚被拉高
*(vu8*)(NAND_CMD)=0x70;//发送读状态寄存器命令
for(i=0;i<10000;i++) //多次读取状态寄存器
{
status=*(vu8*)(NAND_DATA);
if((status&0x40)==0x40) //如果状态寄存器的BIT6为1,则写入数据成功,结束循环
break;
}
此时若status的值为0x40则表示数据写入成功,否则失败
-----------------------------------------------------------------------------------------------------------------------------------------------
块擦除操作只需要4个Cycle地址中的第3、第4这两个就够了,如要擦除第3块的全部数据(擦除后全部为0xFF),则这两个周期地址分别为:
3st:
0xC0,4st:
0x00。
u8status=0x00;
*(vu8*)(NAND_CMD)=0x60;
*(vu8*)(NAND_ADDR)=0xC0;
*(vu8*)(NAND_ADDR)=0x00;
*(vu8*)(NAND_CMD)=0xD0;
while(GPIO_ReadInputDataBit(GPIOG,GPIO_PIN_6)==0);//等待PG6引脚被拉高
for(i=0;i<10000;i++) //多次读取状态寄存器
{
status=*(vu8*)(NAND_DATA);
if((status&0x40)==0x40) //如果状态寄存器的BIT6为1,则写入擦除成功,结束循环
break;
}
此时若status的值为0x40则表示数据擦除成功,否则失败
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- STM32增强型微控制器访问NAND Flash学习笔记 STM32 增强 控制器 访问 NAND Flash 学习 笔记