查看: 455  |  回复: 0
stm32 CubeMx 实现SD卡/sd nand FATFS读写测试

主题

回复
发表于2023-06-09 16:34:22 | 显示全部楼层
1# 电梯直达

文章目录

stm32 CubeMx 实现SD卡/SD nand FATFS读写测试

1. 前言

2. 环境介绍

2.1 软硬件说明

2.2 外设原理图

3. 工程搭建

3.1 CubeMx 配置

3.2 SDIO时钟配置说明

3.2 读写测试

3.2.1 添加读写测试代码

3.3 FATFS文件操作

3.3.1 修改读写测试代码

3.4 配置问题记录

3.4.1 CubeMx生成代码bug

3.4.2 SD插入检测引脚配置

4. 结束语

1. 前言

SD卡/SD nand是嵌入式开发中常为使用的大容量存储设备,SD nand虽然当前价格比SD卡高,但胜在价格、封装以及稳定性上有优势,实际操作和SD卡没什么区别。测试过程中使用的是CS创世 SD NAND FLASH由深圳市雷龙发展提供免费样品测试。关于 SD卡/SDnand 的驱动,有了CubeMx之后其实基本上都自动生成了对应的驱动了,基本上把驱动配置一下之后,自己写一些应用就可以完成基本的读写了,同时关于FATFS文件系统,也可以直接采用CubeMx配置,也不用自己移植,因此使用STM32开发这些还是比较爽的!不过使用过程中也有一些坑,自动生成的驱动有时候也还是有一些bug,因此还是需要大家对对应驱动有一定的了解。

本文将主要分享关于使用 CubeMx 配置 stm32 的工程,通过SDIO总线完成 SD卡/SD nand 的读写,并配置FATFS,采用文件操作实现对 SD卡/SD nand 的读写操作;此外还将分享博主在调试过程中遇到的一些问题,比如CubeMx自动生成的驱动存在的bug等,以及分享关于驱动部分的代码分析!

2. 环境介绍

2.1 软硬件说明

硬件环境:

主控:stm32f103vet6

SD nand: CSNPGCR01-AOW

软件环境:

CubeMx版本:Version 6.6.1

注意:当前最新版本 V6.8.0,生成的工程配置存在bug,具体细节在后文描述

2.2 外设原理图

SD卡槽原理图部分如下:CS创世 SD NAND FLASH由深圳市雷龙发展提供免费样品测试3. 工程搭建3.1 CubeMx 配置1.选择芯片,ACCESS TO MCU SELECTOR2.搜索对应的芯片型号,在对应列表下方选择对应芯片3.配置时钟方案,采用外部高速时钟,无源晶振方案4.配置调试器,由于我采用SWD调试接口,因此选择 Serial Wrie 串行总线5.配置SDIO外设,由于我们所使用的SD nand支持4线传输,因此此处选择4线宽度;如果你所使用的SD nand或SD卡不支持4线传输,此处应选择1线宽度;支持4线宽度的SD卡肯定可以使用1线宽度,因此如果你实在不知道你的SD卡支持几线宽度,你可以直接选择1线宽度!4线和1线宽度的差别也就在于速度上相差了4倍!(注意这里暂时不需要对SDIO的参数进行配置,后面我们再回来配置!)6.完成时钟树配置:配置外部晶振频率调整时钟选择,SYSCLK由PLL产生,PLL由外部时钟倍频产生配置SDIO外设时钟,注意此处SDIO外设比较特殊,有两个时钟!具体原因见后文!7.修改SDIO参数配置,主要是修改SDIOCLK的分频由于我们上述配置的SDIO时钟为 72M,而SD卡支持的通讯速率在0MHz至25MHz之间,因此我们需要分频,配置 SDIO Clock divider bypass 为 Disable此处设置 SDIOCLK clock divide factor CLKDIV分频系数为 8,这个受限于具体的SD卡支持的最大速度。如果设置值较小,可能由于SDIO_CK速度过高,SD卡/SDnand不支持,导致通讯失败,因此建议先将此值设大点(或查看SD卡/SDnand手册,或先设一个较大值,软件完成SD信息读取后再配置)注意这个配置的时钟是用于SD读写通讯时候的时钟,而不是SD卡信息识别过程时的速度!8.勾选 FATFS 配置,选择 SD Card9.配置SD卡检测引脚,有以下两种方案方案一:选择一个输入IO,作为触发引脚方案二:不配置输入IO,最后生成代码的时候无视警报即可,生成的代码会自动取消输入检测判断10.配置调试串口,用来打印信息,此处我选择USART1,大家可根据自己硬件环境自行选择11.配置工程信息配置工程名选择工程路径配置应用程序结构,我习惯选择 Basic 结构选择IDE工具及版本修改堆栈大小,适当改大一点,怕不够用12.勾选将外设初始化放置在独立的.c和.h文件,这样每个外设的初始化是独立的,方便阅读移植!13.生成代码3.2 SDIO时钟配置说明在上述CubeMx时钟配置中,外设的时钟一般都是只有一路过去,但是在此处我们会发现SDIO的时钟在时钟树中有两个!没弄清楚还会以为这是CubeMx出现bug了!其实这是SDIO外设的特殊点,我们查看数据手册上的时钟树,便可以发现,实际上是真的有两路时钟,分别是:1)SDIOCLK;2)至SDIO的AHB接口;之后,我们看到数据手册的SDIO章节,我们可以看到SDIO外设分为:1)AHB总线接口 和 2)SDIO适配器两大块,且使用不同的时钟,这也就是我们在时钟树配置中可以看到有两路时钟配置的原因了!

从下图我们可以知道,SDIO外设不同于其他外设,其外设模块部分与中断、DMA是分开的,并采用不同的时钟!关于AHB总线接口及SDIO适配器更多细节,大家可自行阅读参考手册部分章节内容,此处不做赘述。

此外,关于时钟配置有一个特别需要注意的,也就是SDIO_CK时钟信号。SDIO_CK时钟,也就是我们SDIO外设与SD卡/SD nand通讯的CLK时钟,从上图我们可知,SDIO_CK时钟来自SDIO适配器,也就是来自SDIOCLK,对应CubeMX时钟配置中的:

3.4.1 CubeMx生成代码bug

测试发现,使用CubeMx当前最新版本:V6.8.0版本,生成代码会存在以下问题:SD卡/SDnand 卡片信息读取成功,但是读写测试失败经过仔细分析代码后发现,出现的问题在 MX_SDIO_SD_Init 此初始化函数内的配置项错误导致,具体分析如下:我们在CubeMx里面配置的时候选择的是4线宽度模式 SD 4bit Wide busv6.8.0版本CubeMx生成的 MX_SDIO_SD_Init SD初始化函数内,hsd.Init.BusWide = SDIO_BUS_WIDE_4B;看上去没有什么问题,配置4线模式,对应的初始化项也使用4线模式,但是不然,我们继续分析 MX_SDIO_SD_Init 此初始配置的调用MX_SDIO_SD_Init 此函数在main函数内初始化的时候调用,此函数只配置了 hsd 结构体,并未配置给SDIO硬件寄存器之后调用 SD_Driver.disk_initialize(0); 函数的时候才真正开始进行SDIO外设配置BSP_SD_Init

  ->HAL_SD_Init

    ->HAL_SD_InitCard

在 HAL_SD_InitCard 函数内使用Init结构体配置SDIO外设,总线宽度1bit,时钟速度<400k,以进行卡片的初始化识别。

      -> SD_InitCard

        -> SDIO_Init(hsd->Instance, hsd->Init)

      -> SDMMC_CmdBlockLength(hsd->Instance, BLOCKSIZE)

· 在 SD_InitCard 函数内实现SD卡的初始化识别,之后调用 SDIO_Init 将 MX_SDIO_SD_Init 内对 hsd 的配置配置给SDIO外设,此处的作用主要是提升SDIO外设时钟速率为我们配置的速率;

· v6.8.0版本的代码此时hsd.Init.BusWide = SDIO_BUS_WIDE_4B; ,因此v6.8.0版本代码后续SDIO外设使用4线通讯;

· 之后调用 SDMMC_CmdBlockLength 设置块大小,由于SDIO外设已切换到4线模式,而SD卡/SDnand此时仍然处于1线模式,因此配置会出错

   -> HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B)

根据前面获取到的SD卡SCR寄存器值,判断是否支持4线模式,如果支持则发送配置命令通知SD卡/SDnand进入4线模式,之后修改SDIO外设总线宽度为4线模式

6.通过以上分析可知,MX_SDIO_SD_Init 函数内对 hsd.Init.BusWide = SDIO_BUS_WIDE_4B; 的配置会导致对SD卡块大小的配置失败,从而导致后续读写时失败,报错为块大小设置失败!

7.综上,针对当前最新版本 V6.8.0 版本CubeMx的处理方法是:手动修改此 hsd.Init.BusWide 配置为 SDIO_BUS_WIDE_1B 或更换低版本CubeMx,本人更换V6.6.1版本后无此bug。

3.4.2 SD插入检测引脚配置

使用CubeMx配置FATFS 选择 SD Card 之后,有一个配置参数,用来配置SD Card的输入检测引脚。如果我们在硬件上有设计SD卡的卡槽插入检测引脚插入连接到了MCU的IO,则可配置对应IO为输入模式,并设置对应IO为输入检测引脚,比如,我们设置PD12为输入检测引脚,则配置如下:

对应代码如下,输入检测 IO 低电平有效!如果硬件上,没有此插入检测引脚,则可以在CubeMx内不进行配置,只是在生成代码的时候会提示警报而已,可以不用关心,生成的代码项会自动屏蔽插入检测!4. 结束语以上便是本文的全部内容了,欢迎大家评论区留言讨论!需要存储芯片SD NAND FLASH来咨询深圳市雷龙发展专注存储行业13年,专业提供小容量存储解决方案。



主题

回复
  • 温馨提示: 标题不合格、重复发帖、发布广告贴,将会被删除帖子或禁止发言。 详情请参考: 社区发帖规则
  • 您当前输入了 0 个文字。还可以输入 8000 个文字。 已添加复制上传图片功能,该功能目前仅支持chrome和火狐

禁言/删除

X
请选择禁言时长:
是否清除头像:
禁言/删除备注:
昵 称:
 
温馨提示:昵称只能设置一次,设置后无法修改。
只支持中文、英文和数字。

举报

X
请选择举报类型:
请输入详细内容:

顶部