准备工作
本移植基于STM32HAL库,在开始移植之前准备好一个Cubemx、一个待移植的FATFS源码和一张文件格式为FAT32且大小小于等于32G的SD卡。本项目用的是正点原子的F103开发板。
源码下载:FatFs - Generic FAT Filesystem Module
移植开始
cubemx代码
此处配置为SD 1bit(正点原子的开发板有bug,配置为四线后用不了)。
主意,这里的SDIO读写速度计算公式如下
时钟树下此处的频率(36MHz/(4+2))除以用户自定义的分频系数+2才是真实输出的读写时钟频率,此处为8MHz。
Fatfs库移植
库文件导入以后 先打开diskio.c文件内先把diskio.c里的头文件引用全部移到.h里,并添加我们cubemx生成的sdio的头文件。
随后回去修改 diskio.c里的函数,具体修改后的效果如下图:
此处初始化由于在cubemx的代码中已经帮我们完成,此处就没必要重复初始化,我在这里实现的是打印SD卡有关的信息。
disk_ioctl因为没有用到,暂时不实现内部的功能。
这里SD卡的读写全是用阻塞方式进行的。
下一步,便是修改ffconfi.h里的配置项,分别打开两个,一个是允许文件名为长字符串,一个是运行同时挂载多少个设备。
改为1.
这里是支持挂载多少个设备1-10大家可以自行修改。
这里还有一个设置块大小的,如果是用到一些其他的存储ic的话,这里可以适当修改,由于SD卡一个块就是512byte所以这里也不用改。
修改完以后移植工作就完成了。接下来是挂载和测试。
测试
这是挂载的代码,特别提一嘴,这里的第二个变量“0:”很重要,这里的函数会把这个0给提取出来,并作为后续读写函数的pdrv参数传递下去。
此处我定义了DEV_SD为 0那么我f_mount的时候就应该为“0:”对应的,以读函数为例
这里的参数传递也为0,即我们可以通过0:这个0去索引我们对应的设备进行操作。所以挂载不能乱挂。
最后这是测试代码和测试结果,这里有一点不够完善的是,在我们mount以后没有给他unmount掉释放资源。