stm32读写nand flash

这篇具有很好参考价值的文章主要介绍了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的地址,可以参考一下。这个地址对于下面参数的设置非常重要。
stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机

3.频率设置

配置好工程之后,需要把晶振设置好,并且把cpu频率设置为168Mhz。
stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机

4.FSMC参数设置

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

在配置完之后,还要切换到代码模式,检查一下代码端的参数是否和下面的截图一致:
stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机可以看到,和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

stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机

6.程序测试

6.1.简单测试

然后就可以写段程序测试一下了:
stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机

只要读取出来的NAND_ID是【0xec 0xf1 0x00 0x95】,基本证明成功了。
【K9F1G08U0E手册】
stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机这个是我debug的结果,可以看到,是一致的。
stm32读写nand flash,嵌入式,stm32,嵌入式硬件,单片机

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);
  
  // 延时一下,具体数据需要自己测试一下
  HAL_Delay(2000);
  
  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源代码分享】文章来源地址https://www.toymoban.com/news/detail-674170.html

到了这里,关于stm32读写nand flash的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • stm32嵌入式实验考核

    STM32 实验考核题目 1. 利用 STM32 小板实现:控制外接 LED 灯每隔 3 秒钟亮暗变换,同 时在 PC 机上显示 MCU 的计时时间,MCU 的初始时间由 PC 机 方设置。 2. 利用 STM32 小板实现:利用导线外接 GPIO 口模拟 2 个按键输入, 根据输入组合的四种情况,分别控制三色灯四种流水灯效果

    2024年02月03日
    浏览(43)
  • STM32的时钟系统(嵌入式学习)

    时钟是指用于计量和同步时间的装置或系统。时钟是嵌入式系统的脉搏,处理器内核在时钟驱动下完成指令执行,状态变换等动作,外设部件在时钟的驱动下完成各种工作,例如:串口数据的发送、AD转换、定时器计数等。因此时钟对于计算机系统是至关重要的,通常时钟系

    2024年02月16日
    浏览(41)
  • 嵌入式 STM32 通讯协议--MODBUS

    目录 一、自定义通信协议 1、协议介绍 2、网络协议 3、自定义的通信协议  二、MODBUS通信协议 1、概述 2、MODBUS帧结构  协议描述 3、MODBUS数据模型   4、MODBUS事务处理的定义 5、MODBUS功能码  6、功能码定义   7、MODBUS数据链路层 8、MODBUS地址规则  9、MODBUS帧描述 10、MODBUS两种

    2024年02月11日
    浏览(51)
  • STM32串口通信详解(嵌入式学习)

    时钟信号在电子领域中是指用于同步和定时电路操作的周期性信号。它在数字系统和通信系统中起着至关重要的作用,用于协调各个组件之间的数据传输和操作。 时钟信号有以下几个重要的方面: 频率:时钟信号的频率是指单位时间内信号周期的数量。它通常以赫兹(Hz)为

    2024年02月09日
    浏览(58)
  • 嵌入式——新建STM32工程(标准库)

    目录 一、初识标准库 1.CMSIS标准及库层级关系 2.库文件介绍 (1)Libraries文件夹 ①CMSIS文件夹 ②STM32F10x_Std_Periph_Driver文件夹 ③ 在用库建立一个完整的工程时,还需要添加stm32f10x_it.c、 stm32f10x_conf.h 和 system_stm32f10x.c文件 (2)Project文件夹 (3)Utilities文件夹 3.库各文件之间的关

    2024年01月23日
    浏览(41)
  • 嵌入式项目分享 stm32智能运动计步系统 - 物联网 嵌入式 单片机

    🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。 为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天

    2024年02月20日
    浏览(61)
  • STM32的中断系统详解(嵌入式学习)

    中断是处理器中的一种机制,用于响应和处理突发事件或紧急事件。当发生中断时,当前正在执行的程序会被暂时中止,处理器会跳转到中断处理程序(也称为中断服务例程),对中断事件进行处理。处理完中断后,处理器再返回到被中断的程序继续执行。 中断可以分为内部

    2024年02月12日
    浏览(61)
  • 嵌入式C语言基础(STM32)

    前言:一条混迹嵌入式3年的老咸鱼,想到自己第一次接触到stm32的库函数时,c语言稀碎,痛不欲生的场景,该文章为萌新指条明路。 位操作在嵌入式中常用于直接对芯片的寄存器进行操作,当时作为初学者的我看着一脸懵逼,至于为什么这样修改,下面好好分析一下。  一

    2024年02月02日
    浏览(49)
  • 嵌入式学习笔记——STM32的时钟树

    在之前的所有代码编程的过程中,似乎每次都绕不开一个叫做时钟使能的东西,当时我们是在数据手册上直接看其挂接在那条时钟线上的,那么STM32内部的时钟到底是怎么一个构型呢,本文来对此做一个介绍。 老规矩,一个新的名词出现,首先需要搞清楚它是个啥,下图中对

    2024年02月02日
    浏览(48)
  • 嵌入式学习笔记——STM32硬件基础知识

    上一篇中我们重点是讲了一下怎么搭建开发环境以及怎么下载烧录的过程,这都是解决的电脑端的开发环境问题,还没有到实际的开发板上,我们的单片机是都是焊接在开发板上的,PCB上有着它所需的工作电路。并不是直接给供电电压就可以让其工作的,本文主要是简介一下

    2024年01月22日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包