stm32读写nand flash

1.简介

目前我在使用stm32f407ZGT6来读写三星的nand flash【K9F1G08U0E】。
板子我是在这里买的
【STM32F407ZGT6最小系统板/核心板/转接板/开发板/加128M FLASH】
他上面可以选装一个K9F1G08U0E。
针对这个nand flash,可以选择采用stm32的FSMC来进行读写。
stm32的程序我是stm32cubeide来编写的,感觉挺方便的。

2.资料参考

在官网搜 AN2784,就可以找到这个资料。
【AN2784: Using the high-density STM32F10xxx FSMC peripheral to drive external memories】
这里有各个bank的地址,可以参考一下。这个地址对于下面参数的设置非常重要。
在这里插入图片描述

3.频率设置

配置好工程之后,需要把晶振设置好,并且把cpu频率设置为168Mhz。
在这里插入图片描述

4.FSMC参数设置

然后设置nand flash的配置,注意参数最好要设置和下面一模一样,别的参数也许可以,但是我还没测试过。
此次不使用RB中断、不进行ECC检验等等。其实最好是使用,但是我一使用就出问题,所以暂时还是算了。
在这里插入图片描述后来经过测试,还要把Extra command enable打开,否则读上来的数据是错误的,为0x30。【STM32F767 NAND FLASH MT29F4G08 读写数据】

在配置完之后,还要切换到代码模式,检查一下代码端的参数是否和下面的截图一致:
在这里插入图片描述可以看到,和ui的参数差了1,不知道是为啥。但是代码的参数是我们想要的。

5.修改宏定义 NAND_DEVICE

然后就是最重要的一点,需要到stm32f4xx_hal_nand.h这个头文件中,修改一下这个 NAND_DEVICE 的定义。
因为我们现在选的是bank2,而bank2是从0x70000000UL开始的,而不是0x80000000UL。
不知道stm32cubeide的这个库怎么处理的,在使用FSMC来读写nand flash时,无论你选的是bank2还是bank3,默认他都是用的0x80000000UL。不知道是什么狗屁逻辑(可能我语气重了点,但是假如你和我一样被这个问题折磨了四五天的话,应该就能体会我的心情)。
而且更加恶心的是,每次在IOC界面修改一些数据后,系统重新生成代码,他又会把这个stm32f4xx_hal_nand.h改回原来的0x80000000UL,也就意味着,你需要再改一次。。。。

- #define NAND_DEVICE                0x80000000UL
+ #define NAND_DEVICE                0x70000000UL

在这里插入图片描述

6.程序测试

6.1.简单测试

然后就可以写段程序测试一下了:
![在这里插入图片描述

只要读取出来的NAND_ID是【0xec 0xf1 0x00 0x95】,基本证明成功了。
【K9F1G08U0E手册】
在这里插入图片描述这个是我debug的结果,可以看到,是一致的。
在这里插入图片描述

6.2.擦除、写入、读取测试

记得擦除之后,要稍微延时一下再去读写,否则会出问题。

 HAL_StatusTypeDef ret = HAL_OK;

  NAND_IDTypeDef info;
  ret = HAL_NAND_Read_ID(&hnand1, &info);

  int nand_status = HAL_NAND_Read_Status(&hnand1);

  NAND_AddressTypeDef addr = {
    
    0, 0, 0};


  ret = HAL_NAND_Erase_Block(&hnand1, &addr);

  uint8_t buffer_write[2 * 1024];
  for(int i = 0; i < 2048; i++)
  {
    
    
	  buffer_write[i] = i;
  }
  ret = HAL_NAND_Write_Page(&hnand1, &addr, buffer_write, 1);

  nand_status = HAL_NAND_Read_Status(&hnand1);

  uint8_t buffer[2 * 1024] = {
    
    0};
  ret = HAL_NAND_Read_Page(&hnand1, &addr, buffer, 1);

注意

a.有时候程序没问题,但是就是用st-link来debug时,总是会崩溃出,不知道为啥。难道是因为我的st-link是山寨的?


参考:
【NandFlash Board (A)】
【STM32F407 FSMC驱动MT29F4G08A NAND FLASH源代码分享】

猜你喜欢

转载自blog.csdn.net/joyopirate/article/details/131743763
今日推荐