STM32如何读写NAND Flash存储器

文章目录

  • 1.简介
  • 2.资料参考
  • 3.频率设置
  • 4.FSMC参数设置
  • 5.修改宏定义 NAND_DEVICE
  • 6.程序测试
  • 6.1.简单测试
  • 6.2.擦除、写入、读取测试
  • 注意
  • 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源代码分享】

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32如何读写NAND Flash存储器

    发表评论