| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32F103基于cubemx的SD卡的读写及FATFS文件系统移植 -> 正文阅读 |
|
[嵌入式]STM32F103基于cubemx的SD卡的读写及FATFS文件系统移植 |
STM32F103基于cubemx的SD卡的读写及FATFS文件系统移植前言:之前一直对SD的读写感兴趣,这次刚好趁着和老师的项目有关系,就顺便学了一些皮毛,总的来说前前后后或多或少踩到了一些坑,在此记录。 一、SD卡相关内容1、SD卡简介在嵌入式项目中,经常会有要用到大容量存储的场景,SD卡提供了一种方便低廉的形式来储存数据。
本文SD卡主要采用STM32内部外设SDIO控制器完成与SD卡的数据传输。SDIO控制器不仅支持SD卡,还支持多媒体卡( MMC 卡)、SD I/O 卡和 CE-ATA 设备等。(反正后面的这些乱七八糟的我活那么大都没见过,有个印象就行,反正正点原子的介绍讲了很多这些老套的,可能为了全面吧,我看的那是一个迷惑) 2、SDIO的引脚及其功能SDIO引脚包括SDIO_CLK、SDIO_CMD、SDIO_D[3:0]。
(另外现在能买到的SD卡基本上都是4位数据传输的,我就不做用一位数据传输的MMC卡等的介绍和代码分类了。) 此外 S D I O _ C L K = H C L K 2 + C L K D I V SDIO\_CLK=\frac{HCLK}{2+CLKDIV} SDIO_CLK=2+CLKDIVHCLK??,这里的分频很重要,卡时钟不能超过SD卡所支持的最大操作频率,另外SD卡在刚初始化时时钟是不能超过400KHz否则容易失败,初始化完成以后就可以设置时钟频率到最大。 3、SDIO的通信协议与正常的通信方式一样,SDIO也有一套完整的命令以及响应的协议,但是此协议过于底层,在此就不展开赘述,有兴趣的可自行上网了解,包括SDIO的寄存器操作。 下图为SDIO的读操作: 下图为SDIO的写操作: 此外补充一点,SDIO有一个FIFO寄存器,单片机对SD卡的读和写工作都是通过FIFO完成,FIFO相当于一个”粘合剂“! 4、SD卡的初始化流程按照正点原子的初始化流程大约是以下这样: 他是对卡先进行分类、然后确定供电电压等等,标准库确实挺麻烦的,后面我们用到HAL库就没有这么多事情了,但是我个人认为了解一点底层和内部的关系终究没有坏处。 二、FATFA文件系统1、FATFS系统简介FATFS是一个免费开源的文件系统,如果想让SD卡里的东西在电脑上也能用(即兼容Windows系统),就必须要用上文件系统。FATFA系统最顶层是应用层,我们只需关注这一块,而系统内部的结构、复杂的协议我们无需理会。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nHSbSOM2-1628238638436)(https://img.pandior.ink/20210731222453.png)] 其中,应用层是最后面我们使用的如f_open,f_write,f_close等。 中间层是FAT文件的读、写协议,非必要情况无需更改。 底层是我们需要修改移植的地方,主要是对存储媒介(本文是SD卡)的读、写接口对应以及创建、修改时种。(这个时钟我没用上) 2、系统移植无需更改的文件:
需要更改的文件:
FATFS的移植主要分为以下几步:
三、cubemx配置真的是特别感谢意法半导体公司出的这一款神器,可视化的配置大大缩短了STM32相关的项目开发时间。 上面我们讲的那一堆东西其实根本不需要懂(但是我也说过了,底层的东西了解一些没有坏处),只需要用鼠标点点点就可以轻松完成SD卡以及FATFS系统的移植。 1、选择使用的STM32芯片以及基本配置(时钟,串口调试等) [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P7MuFjpd-1628238638438)(https://img.pandior.ink/20210802220220.png)] 2、打开SDIO外设并设置 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C8WvaXz9-1628238638438)(https://img.pandior.ink/20210802211541.png)] 这里我们选择SD卡并且4位数据传输,前面也说过了,现在正常买到的卡都是支持4位的。 下面红框的选项非常的重要,我们之前也说过 S D I O _ C L K = H C L K 2 + C L K D I V SDIO\_CLK=\frac{HCLK}{2+CLKDIV} SDIO_CLK=2+CLKDIVHCLK?,这里我们输入4,一般来说STM32F1单片机的主频工作在72MHz,这时SD卡的时钟就是12MHz,刚好可以满足要求,如果SD卡时钟速度过高可能会通讯失败。 3、打开全局中断 这里DMA开不开看个人选择,我本来是想打开的,但是F1好像DMA功能不全。 这里注意:如果配置DMA,在中断优先级配置里SDIO中断优先级必须大于DMA! 4、移植FATFS系统 这里选择SD卡,下面具体设置里选择GBK编码(支持简体中文),同时选择支持长文件名并将动态工作区放在堆栈中。 cubemx上面的包括下面的一些设置,什么支持快速查找,最大长度之类的都是前面讲过的ffconf.h内的修改内容,这里可以直接在cubemx里选择,不能不说,cubemx,yyds! 5、SD卡插入检测 如果按部就班的按照上面的设置来,这里应该是选择不了的,这是一个检测SD卡是否插入的功能,如果在PCB板设计中标注了这个脚就按设计的来,如果没有就随便选择一个没有用到的引脚并设置为下拉(该引脚为低时SD卡插入)。 6、配置时钟树 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fwny4xUM-1628238638440)(https://img.pandior.ink/20210802214045.png)]
言归正传,这里可以看到SDIO的时钟呵HCLK的时钟一致,在32其他高版本中可能可以单独设置SDIO的时钟,那另说。 7、设置堆栈大小 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tp7whS77-1628238638440)(https://img.pandior.ink/20210802215421.png)] 我们在第四步中将工作暂存区放在了堆栈中,所以默认的堆栈大小可能不能满足要求,这里需要扩充堆栈,0x400改成0x1000! 8、生成文件! 四、测试代码可以看到cubemx帮我们把文件管理的特别有条理。 0、开始前的准备在main函数开始前添加这一段代码完成printf的重定向。
1、定义变量
其中fs为文件系统工作区; fil为文件对象结构的指针;
2、输入测试代码
这里完成的任务主要有:
串口输出的结果如下: 如果有问题,串口会输出一个错误编码,在程序中是retSD(return SD:SD卡的返回值) 变量,这个变量的具体含义在ff.h文件中有详细描述,可根据返回错误类型进行针对性解决。
部分具体的错误类型及原因
3、相关函数介绍f_mount:在FatFs模块上注册、注销一个工作区
参数: fs 工作区(文件系统对象)指针 path 注册/注销工作区的逻辑驱动器号 opt 注册或注销选项
f_open:创建/打开一个用于访问文件的文件对象
参数: fp 将被创建的文件对象结构的指针 path 文件名指针,指定将创建或打开的文件名 mode 访问类型和打开方法,由一下标准的一个组合指定的。
其实在我学习的过程中,绝大多数读写问题都是因为文件打开操作有问题。 比如说: 1、之前一直写不了第二次,就是写第二次的时候会把第一次覆盖掉,是因为我用了 2、写一直报错,错误代码是7, 等等。 f_close:关闭一个打开的文件
参数: fp 指向将被关闭的已打开的文件对象结构的指针
f_read:从一个打开的文件中读取数据
参数: fp 指向将被读取的已打开的文件对象结构的指针 buff 指向存储读取数据的缓冲区的指针 btr 要读取的字节数 br 指向返回已读取字节数的UINT变量的指针,返回为实际读取的字节数 f_write:写入数据到一个已打开的文件
参数: fp 指向将被写入的已打开的文件对象结构的指针 buff 指向存储写入数据的缓冲区的指针 btr 要写入的字节数 br 指向返回已写入字节数的UINT变量的指针,返回为实际写入的字节数。
|
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/28 2:44:37- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |