STM32使用SD卡遇到的问题

文章讲述了在STM32F103ZET6开发板上使用HAL库和FatFS文件系统操作SD卡的过程,包括普通HAL库的读写、DMA方式优化及遇到的问题,如F1系列不支持4bitSD模式,以及FatFS工作缓冲区配置问题。此外,还提及了结合FreeRTOS系统的使用挑战。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

最近在学习SD卡的使用方面遇到的一些问题,在这里记录一下这些问题。

本次实验采用STM32F103ZET6主芯片的开发板,使用HAL库开发。

在学习SD卡时,一般的学习思路就是先使用普通HAL库进行开发,然后再使用FatFS文件系统,最后结合FreeRTOS系统使用。

普通HAL库开发

使用库开发操作比较简单,只是简单的利用库中函数实现对SD卡中的某些部分进行书写和读取等简单操作。

这部分需要在CobeMX中打开SDIO的接口和选择SD的模式(这里只能打开1bit模式,不能使用4bit,我使用4bit时,代码书写完成烧录进开发板中LCD无法显示,应该是F1系列不支持4路操作。)。完成后就是直接使用库函数中自带的一些读写函数进行操作,这种方式的局限性也非常大。不能生成对应的文件和文档。

SDIO还有另外一种读写方式,这种方式就是以DMA方式读写SD卡,DMA的好处就是在进行SD的操作时可以减少处理器的负荷,提高运行效率。这个在配置时需要在SDIO页面中的DMA Settings一栏加入DMA操作,但是F1系列的MPU对SD卡只有一个通道可以使用:

 

可以看到,只有在DMA2的通道4才可以用作SD的操作。

到这里博主在网上并未搜索到使用F1系列操作的例程。我自己试着操作,但是只能使用DMA写入操作,并不能读取,读取只能是普通的轮询方式。在stm32参考手册中官方操作也是只能进行写入操作。所以到这里最好就使用轮询方式读写。

FatFS读写SD卡

使用文件系统读写SD卡,这里也有两种方式:轮询方式和DMA方式。这里不再对DMA方式解说。

在使用FatFS时需要先和之前一样打开SDIO的模式(1bit),完成后再在FatFS中选择SD卡。如果不先打开SDIO,在FatFS中无法选择SD Card。

选择完成后,这部分文件系统会自动帮我们生成sd_diskio.c/.h文件,并完成这些函数的书写。其中包括驱动器初始化函数:SD_initialize();驱动器IO控制函数:SD _ioctl();获取驱动器状态函数:SD_status();读取扇区数据函数:SD _read();将数据写入扇区函数:SD _write()。这些函数可以在后期时直接使用。

完成后进行代码的书写,在完成这部分书写后,烧录总是发现f_open()这个函数调用有问题,通过追踪发现,这个函数的返回值是17:FR_NOT_ENOUGH_CORE LFN。这个问题是工作缓冲区无法分配。这是因为开始在CobeMX配置时FatFS中USE_LFN一栏没有配置正确。这就需要在ff.c中将_USE_LFN修改为3,就是自动分配工作缓冲区。

FatFS结合FreeRTOS系统使用

这一块想使用FreeRTOS使用,必须先开启SDIO的DMA模式,这块因为F1的DMA有问题,我也就没有研究这块的内容。

最后附上我使用Fatfs读写SD卡的文件:链接: https://pan.baidu.com/s/1G-zbOltuNGBmoQTO4wXtPQ?pwd=1234 提取码: 1234

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值