以传统方式使用SD卡,除了要实现SDIO或SPI的驱动,一般还需要再移植个类似FatFS过来,才能方便的使用文件系统。而且在移植的过程中,还要考虑SD卡的版本、速度等问题,保证驱动程序的正确性,然后再去实现FatFS所要求的接口,短时间内不一定能实现的了。现在这些问题已经不再是问题了,因为这些工作Keil已经帮我们做好了,还是只要点几下鼠标就完成了,可以把时间和精力全部放在逻辑业务的处理上,同时代码简洁易读,方便维护。下面来看一下实现SD卡文件系统工程的建立方法。
此工程同样从三部分考虑:选择Keil中间件、设置必要的选项参数、实现自己的功能。
***********************************************************************************************
同样,板级支持(Board Support),专门针对某种板子提供的驱动。为了可以在任意的STM32F7开发板上使用,这项选不选随意。
1.CMSIS部分,操作系统相关,有了系统好办事,而且包括了网络硬件的驱动,所以此项必选。
CORE是核心部分,不能少
Keil RTX是操作系统,可以开线程
另外还要加一项MCI,MCI的全称是“Memory Card Interface”,不用解释了吧。
2.STM32F7的硬件层驱动部分,可以选择Classic,也可以用STM32CubeMX。如果选了STM32CubeMX,就要使用这个软件来生成配置代码再放到MDK里。Classic足够了,是MDK自带的。
其中Startup必选,这个是启动文件
其他的,如Common、Cortex都需要选上。这个图不全,下面还有PWR、RCC都需要选上。当然多选了没有关系,少选的话这个配置窗体会实时显示依赖关系,依赖项没有选上会用橘黄色标识,提示应该选择。
3.File System,最重要的一部分。这里没有使用FatFS,而是使用了MDK自带的MDK-Pro,可以适用于MDK支持的各种MCU,不用改动任何代码。
其中Drive里,至少选择一种存储介质。使用SD卡的话就是“Memory Card”了。
************************************************************************************************
第二步,配置各种选项和参数。展开工程树,所有带有黄钥匙的文件都是不需要更改的,所以略过不看,只看各种配置文件。
1.RTX_Conf_CM.c,操作系统相关的配置。双击该文件后代码在右边显示,但是直接看代码可没那么好看,所以用MDK提供的功能:Configuration Wizard配置精灵就方便多了。
这里面改动的不多,主要是“RTOS Kernel Timer input clock frequency”,STM32F7是216MHz,改成216000000,216后面6个0,别写错了。
另外“Defualt Thread stack size”和“Main Thread stack size”要改大一些,400和800。普通小程序无所谓用默认的就行了,但是一旦用了某些协议栈或图形界面之类的,默认的就不够了,如果不改会在运行时进入osError,然后就完蛋了。
2.RTE_Device.h,和TCP工程不一样了,这次要选择SDMMC,然后更改为对应的引脚,还是参考手册吧。
3.FS_Config.c和FS_Config_MC_0.h,这两个文件里的东西一般用默认的就行了,除非有特殊要求,根据实际情况修改,这里不做改动。
************************************************************************************************
所有的配置项完成,接下来该写程序了。大部分功能已经完成,代码量相对少了很多,节省了不少时间。
系统时钟配置、MPU设置和Cache设置的代码和TCP工程完全一样,直接拷贝过来,图中略过。
程序入口点,这里我开了个主线程,没什么用,习惯罢了。SD工程更简单,主循环里什么都不要了。
开始写自己的代码,也就是SD操作的各种功能。为了代码清晰,我用类封装了一个,虽然对于一个SD的操作比C没有什么特别的地方,甚至代码稍微多了一些,但是如果对多个SD或SD、Nand等混合使用的时候优势就明显了,一个实例对应一个设备,比C的代码就好写多了。
看到断点的那三行代码了吗,只要对类实例化一下,就可以调用类中的方法了。
开始运行,实例化M0:后,获取文件系统和总容量,然后再创建一个文件夹。
运行到断点处,看变量的内容,变量FS得到文件系统类型,Capacity获得容量。
FS的值是0x04,0x04是什么呢?这里有定义:
一个枚举类型,4就是FAT32格式了。
Capacity的值是0x1D62DFE00,十进制就是7888305664字节,/ 1024 / 1024 / 1024,就是7.34GB,容量也正确。
把SD卡插到电脑上
刚刚创建的文件夹就在这里,功能完成。
最后强调一下,使用Keil的MDK-Pro功能,就不能选择MicroLib了,自己斟酌吧。
工程附件: