本文基于W29N01HV这款NAND FLASH芯片进行讲解,这款芯片的讲解在网上的资料真的很少,关于这款flash的datasheet我会免费共享出来。(如果觉得本文对你没什么帮助可参考:
NAND FLASH
文章)
NAND FLASH是一个静态存储设备,所以用STM32上的FSMC功能,具体功能可以看STM32公司发的(也可以是经过行业的大佬翻译过的中文版本)1-STM32F4xx中文参考手册,在手册中
可以同时使用两块NAND FLASH,由下图可见,NAND信号有FSMC_NCE[3:2],FSMC_INT[3:2]着两个寄存器。
这两个寄存器用来确定你的NAND FLASH连接着F429的那块区域(Bank2 or Bank3)。
接着看原理图,由原理图可知片选引脚CE连接F429的PG9引脚, 在从cubemx上查看PG9引脚复用功能,由下图可知,PG9可复用为FMC_NCE3。NCE3对应着Bank3
在从数据手册中查看NAND FLASH是多少位
由图可知8bit,接下来进行cubemx配置
以上这些数据都可从数据手册中查看到
Ready or busy那一栏本人现在没搞懂怎么配,如果有懂得大佬麻烦在评论区教我一下,万分感谢!!
接着是本文重点:配置wait,setup,hold,Hi-z time
在sudaroot大佬的文章中给出了这四个时间的计算公式
thclk是系统时钟,为5.5ns(具体时间要看你配置的时钟,这里为180MHZ,具体计算公式为1/时钟频率)
先算SET: 先在数据手册中找出tcs,tcls等时间
由上图数据手册可知时间最大为15ns,twp=12ns代入公式(SET+1)*tHCLK>=15-12=3
可计算出SET>=0这里取1
同理的HIZ,HOLD,WAIT与SET算法一样,篇幅有限,有兴趣的读者可以自行去计算(WAIT的满足条件较多容易计算出错)。在sudaroot大佬的文章中有全部都进行计算感兴趣的请到文章开头的连接可直接跳转。
算出HIZ=4,HOLD=2,WAIT=5;
接下来就是计算
这里需要参考STM32F4XX和NAND FLASH的数据手册
由前面计算可知SET我们取1;带入公式(TAR+1+2)*5.5>10,可得TAR>=0这里取1,同理TCLR=1
接着就是配置cubemx了
最后就差配置
就配置完成了。查看需要配置哪些:
这几个参数可参考NAND FLASH
照着填就行
最后打开串口即可生成工程了;
测试代码:
int main()
{
uint32_t i = 0;
NAND_IDTypeDef NAND2;
NAND_AddressTypeDef temp;
temp.Plane = 0;
temp.Block = 0;
temp.Page = 0;
if( HAL_NAND_Read_ID(&hnand2,&NAND2)==HAL_OK)
{
printf("ID:NAND2\r\n");
}
if(HAL_NAND_Write_Page(&hnand2,&temp,buf,1)==HAL_OK)
{
printf("NAND写入成功\r\n");
}
if(HAL_NAND_Read_Page(&hnand2,&temp,read,1)==HAL_OK)
{
printf("读取成功!\r\n");
printf("%s",read);
}
}
如果串口打印出数据就是成功。
这也是我现学现教,有讲的不是很透彻的可以私信或者评论区问我,我看到肯定会回复的,最后,创作不易,如果感觉有帮助就点个赞吧!