开发环境:Window 7 32bit
开发工具:Keil uVision4
硬件:stm32f103vct6
目录
前言:已经有段时间没有写博客了,可能是事有点多(是我懒...额),最近又想来写一些;这次做的是stm32和SD卡的应用。SD卡的使用都很普遍,但是在单片机上的应用却少;我们知道单片机的处理速度有限,在大文件、大数据面前,根本是发挥不了作用的。但是因为SD卡价格优惠性价比很高,而在某些场合需要常年工作的单片机,可用它来记录单片机收集的数据;同时也可以通过SD卡给单片机更新自身程序(iap升级)等。接下来要做的是,利用stm32通过spi外设,驱动SD卡;当然如果要从SD卡上读取、写入文件,还需要移植文件系统,我选的是Fatfs(一个免费开源的文件系统)。
下载fatfs系统源码:
官网地址:http://elm-chan.org/fsw/ff/00index_e.html,拉到下面点击 Previous Releases,选择0.11a版本点击下载。
下载解压后,有两个文件夹,doc文件夹是帮助文档,src里面是是源码。
doc里面很多资料,详细介绍了fatfs系统的架构和使用说明,一些接口函数不明白怎么使用的话可以在里面找到说明。下面介绍src文件:
option文件夹:可选的的扩展功能,比如支持中文。我这次没有用到它。
00history:版本记录。官网每发布一次版本都会记录更改或者添加了那些功能,里面还有日期,可以看到它进化的历程。
00readme:这个文件里面就是做着我现在做的事情,说明每个文件的作用。
diskio.c: 这个是接口层文件,与芯片外设相关,里面有些函数需要我们实现,需要我们修改。
diskio.h:头文件里面声明的函数是让ff.c文件调用的,不需要我们修改。
ff.c:fatfs模块源码,核心东西,需要一定的代码能力才能看懂,不需要我们修改。
ff.h:fatfs模块应用接口,不需要我们修改。
ffconf.h关键参数配置,配置一些宏的值, 不同的值满足不同的需求,需要我们修改。
integer.h数据类型定义,与编译器有关,一般不需要修改。
接下我们要做两个事情,修改diskio.c文件和ffconf.h文件。
先说一下ffconf.h的配置,我只是改了下面两个宏:
#define _VOLUMES 5 //支持的逻辑设备数
#define _FS_NORTC 0 //暂时不加入RTC,先关闭, 不然编译报错;因为打开的话要实现get_fattime()来获取RCT时间
关于其他的宏暂时不改动,每个宏所起的作用在源码里有详细的英文说明,可以了解一下。
再说一下diskio.c文件,里面共有5个函数分别是:
/*
功能:设备初始化函数
参数:pdrc是设备号,fatfs系统可以同时挂载多个设备(SD卡、MMC等)
*/
DSTATUS disk_initialize (BYTE pdrv);
/*获取设备状态*/
DSTATUS disk_status (BYTE pdrv);
/*
功能:从设备读取若干个扇区的数据
buff: 读取的数据存放的地址
sector:扇区地址
count:所读取的扇区总个数
*/
DRESULT disk_read (BYTE pdrv, BYTE* buff, DWORD sector, UINT count);
/*
功能:往设备写入若干个扇区的数据
buff: 写入的数据地址
sector:扇区地址
count:所写的扇区总个数
*/
DRESULT disk_write (BYTE pdrv, const BYTE* buff, DWORD sector, UINT count);
/*
功能:设备控制,或获取设备的参数
pdrv:设备号
cmd:命令
buff:发送/接收缓冲区指针
*/
DRESULT disk_ioctl (BYTE pdrv, BYTE cmd, void* buff);
上面提到的扇区可能大家会有疑问,不同的设备,扇区大小不一样。SD卡每个扇区是512字节,型号W25Q128FV的spi Flash芯片每个扇区是4096字节。如果我用的是这个Flash芯片,那么在ffconf.c里面的_MAX_SS就要改大才能兼容。可见fatfs可兼容不同的扇区大小的设备。由上面参数可见读、写都是以扇区为单位,一个设备根据容量的不同,会分成若干个扇区。
再者,上面的每一个函数都有pdrv参数,为了兼容多个或者不同的设备,在上面每个函数里面会有一个switch分支,来区别具体要操作哪个设备,我只使用一个SD卡,所以只需要增加一个分支即可。
对于stm32来说,在提供的库函数就有spi外设的使用接口函数,非常方便,但这仅仅是数据的收发;想要从SD卡中读取信息,读/写扇区数据,还需要了解SD卡的通讯协议(通讯协议有几个版本网上有公开资料,可自行选择了解)。在stm32的标准库跟fatfs系统之间还需要一个中间层。它的作用是根据通讯协议提供的命令参数,从SD卡里获取设备型号、容量、设备状态、读/写扇区等操作,这也是这次讲解的重点。
diskio.c文件具体的改动这里不细说,直接看我的源码,接下来就要开始动手了(我怕我再啰嗦的话可能就留不住人了)。