一、进行操作前的准备。
- 确保使用官方例程能够判断SD是否有效的,即能够正常的被识别和读写
官方例程如下:
如果你好奇,为什么我知道sd需要用到例程。关于这个问题,请看下面。
打开官方的硬件电路文件:
在文档中搜索"TF CARD",这里这个代表SD卡。出现如下图:
图中说错了一个地方,“去找SPI的例程”,改为去找SDIOC的例程。
2. 确保使用官方例程能够正常的读写W25Q64.
官方例程如下:
- 确保使用官方例程能够实现连接usb可以看见电脑上有SD卡的U盘。
二、将SD卡,W25Q64、FatFs的相关文件导入工程。
2.1. 导入SD卡的相关文件并配置
1.1、打开上面说的sd卡的官方例程:
确保,能够出现官方描述的现象:
如果没有出现,可以尝试使用读卡器,在电脑上将sd卡格式为Fat32或Fat格式,再次尝试。如果还是不成功,直接换卡尝试。当然不排除开发板故障的问题,但一般发生概率小。
1.2、接下来进行把例程移植到你的工程中
在例程进行如下操作:
把上图中所涉及到的除了main.c文件以外的所有文件添加到自己工程里面去。
1.3、接下来,添加头文件路径。例程里面涉及的头文件路径:
1.4、当然因为这里使用到了sdioc,所以需要使能sdioc的功能。这里打开例程的配置文件:
可以看到例程已经使能LL_SDIOC_ENABLE。那么你的工程也需要使能这个。
1.5、接下来根据例程导入相应的头文件到自己的工程中
1.6、接下来移植例程里面的main.c里面的代码到你的工程里面。
移植完成后,编译运行。一般而言都没有问题,如果有问题。那么请检查,是否是配置文件缺少了某些使能,或是有些问题没有添加到工程里面,或是缺少头文件。
2.2. 导入W25Q64的相关文件并配置
如果你仔细看了sd相关文件的添加和导入,和相关的使能等操作。那么这个部分的添加也非常简单。
第一步:还是先说说该怎么找例程吧。
打开官方的硬件电路。
第二步:向自己的工程里面添加例程里面的文件
main.c文件和Readme不需要。
第三步:根据例程向自己的工程添加缺少的头文件路径
第四步:根据例程的hc32的配置文件中的使能配置,去配置你自己工程里面的使能配置。
第五步:导入相关根据例程,导入相关头文件到自己的工程中
第六步:移植例程里面main.c里面的相关代码到自己工程里面
移植完成后,编译运行。一般而言都没有问题,如果有问题。那么请检查,是否是配置文件缺少了某些使能,或是有些问题没有添加到工程里面,或是缺少头文件。
2.3. 导入FatFs的相关文件并配置
声明:我这里使用的是FatFs的版本是
工程中使用到的文件如下:
配置FatFs头文件路径如下:
第一步:配置ffconf.h文件
2.3.1如果你只使用SD卡的话配置如下:
-
FF_VOLUMES这个我配置为1,因为只用到了一个存储设备。SD卡。
-
FF_MAX_SS这个对于SD卡这种设备,一般都是配置为512(一个扇区大小)。当然为了跟家准确,有所使用的SD的手册最好。
-
FF_CODE_PAGE配置为936。当然如果你的不需要支持中文,或者想减少内存的使用,可以配置437.
- FF_USE_LFN配置为1.
- FF_FS_NORTC配置为1:关闭时间配置,不然又得要实现文件系统的里面的时间函数,麻烦。
2.3.2如果你只使用W25Q64的话配置如下:
FF_VOLUMES这个我配置为1,因为只用到了一个存储设备。W25Q64。
-
FF_MAX_SS这个对于W25Q64卡这种设备,是4096(代表扇区的最大值)。为什么是4096?请看下面的W25Q64的手册截图。
-
FF_CODE_PAGE配置为936。当然如果你的不需要支持中文,或者想减少内存的使用,可以配置437.
- FF_USE_LFN配置为1.
- FF_FS_NORTC配置为1:关闭时间配置,不然又得要实现文件系统的里面的时间函数,麻烦。
2.3.3、最后配置diskio.c文件:这里将存储设备为SD卡和W25Q64的放在一起说。懒得写见谅。
第一步:导入头文件
第二步:定义宏
如下图把源代码中宏定义注释掉,因为用不到。我这里使用了两种设备,一个W25q64Q64,一个SD卡,所以就定义两个宏。当然,我的ffconf.h文件里面的FF_VOLUMES配置的是2.
你根据前面ffconf.h文件里面的FF_VOLUMES配置为1,所以这里就定义一个宏(命名随意)。或者说你打算使用几个存储设备,这里的宏和ffconf.h文件里面的FF_VOLUMES配置就对应的配置为几。
可能你会问定义这个宏有什么用?
好问题。请看下图
FatFs文件系统的打开文件使用的f_open()函数,函数里面的第二个参数就是文件的路径.图中**"0:"写了数字后冒号是必须要的**,也可以写为**“1:”**。那么代表什么意思呢?
根据我在diskio.c文件里面宏定义,0代表的是W25Q64,1代表SD卡。所以"0:123.456.txt"代表W25Q64里面的123456.txt文件。
第三步:配置disk_status函数
第四步:配置disk_initialize函数
第五步:配置disk_read函数
第六步:配置disk_write函数
第七步:配置disk_ioctl函数
w25q64:
SD卡:
有人会说,不是说sd卡不需要配置disk_ioctl函数吗?
确实,我记得也看到这样的一句话,但是忘记在哪看到的了。只记得说的是如果下面的两个配置为一样的值的话,就不需要配置disk_ioctl函数。但是,经过我测试不配置这个函数,我的程序不行。
关于是否当SD卡是否需要配置disk_ioctl,我觉得,既然不确定,就配上。
第八步:定义全局变量,挂载文件系统,创建一个文件同时写入数据
第九步:将开发板连接电脑通过U盘的方式查看SD卡或W25Q64里面的文件
我这里的是把W25q64和W25q64通过HC32F4A0的usb连接电脑,虚拟成U盘来查看文件的。这样方便,且简单。
如果你也想把SD卡或W25Q64虚拟通过USB虚拟成U盘的话。但不知道该怎么办的话,别急有官方例程,如图下图。
上图中的例程是将SD卡虚拟成U盘在电脑中使用,如果你不是使用SD卡,而是使用W25Q64的话,只需要修改例程中的这个文件
把usb_dev_msc_msd.c文件里面的有关的sd卡的操作全部换成W25Q64相关的即可。
- 下面是我的修改截图
第十步:查看结果
结果如下图:
以上就是我的所有的配置和我所知道的一些细节,希望对看文章的各位有帮助。
如果上面类容有侵权上面的,请联系删除。