stm32CubeMx实现SD卡/sdnandFATFS读写测试

标签:
nandflash嵌入式sd卡工业级sd卡单片机nandflash贴片式tf卡 |
分类: SDNAND |
文章目录
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卡没什么区别。
关于 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: CSNP1GCR01-AOW【样品CS创世SD NAND由深圳市雷龙发展有限公司免费提供的,感兴趣的可到雷龙官网申请】
软件环境:
CubeMx版本:Version 6.6.1
注意:当前最新版本 V6.8.0,生成的工程配置存在bug,具体细节在后文描述
2.2 外设原理图
SD卡槽原理图部分如下:
3. 工程搭建
3.1 CubeMx 配置
- 1.选择芯片,ACCESS TO MCU SELECTOR
- 2.搜索对应的芯片型号,在对应列表下方选择对应芯片
- 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
Card
9.配置SD卡检测引脚,有以下两种方案
- 方案一:选择一个输入IO,作为触发引脚
- 方案二:不配置输入IO,最后生成代码的时候无视警报即可,生成的代码会自动取消输入检测判断
10.配置调试串口,用来打印信息,此处我选择USART1,大家可根据自己硬件环境自行选择