天天看点

stm32F407 + FreeRTOS + FAT 文件系统移植

FreeRTOS 版本: FreeRTOSv10.2.1

HAL 版本:  Keil.STM32F4xx_DFP_HAL.2.13.0

版本无所谓,只是记录下。

文件目录 :FreeRTOSv10.2.1_191129\FreeRTOS-Labs\Source\FreeRTOS-Plus-FAT 整个拷贝到工程。

stm32F407 + FreeRTOS + FAT 文件系统移植

所需C文件:1.上图  ff_xx.c, (ff_locking.org 删除不需要)。 2.\portable\common\ff_ramdisk.c。

3.\portable\STM32F4xx\ff_sddisk.c 和 stm32f4xx_hal_sd.c(使用提供的 hal sd库文件,替换工程hal_sd文件,版本不同函数会不同,所以用提供的就行)。

添加头文件目录:\include 、\portable\common、\portable\STM32F4xx。(inlcude目录下)

文件添加完编译会提示:

stm32F407 + FreeRTOS + FAT 文件系统移植

所以跟TCP移植一样,官方提供FreeRTOSFATConfigDefaults.h默认配置,新建FreeRTOSFATConfig.h 添加自己的配置。

这些配置在官网介绍,都需要添加:

https://www.freertos.org/FreeRTOS-Plus/FreeRTOS_Plus_FAT/Embedded_File_System_Configuration.html

详细配置见链接

(FreeRTOSFATConfig.h)     https://blog.csdn.net/wy212670/article/details/106859340

配置文件完编译:

会报错  ff_old_config_defines.h 文件 , 既然是old,不需要。去include目录删除,同时在ff_headers.h中删除头文件引用, 

stm32F407 + FreeRTOS + FAT 文件系统移植

编译:(麻烦开始!!!)报很多错和警告。一个个修改。

stm32F407 + FreeRTOS + FAT 文件系统移植

双击定位到 ff_stdio.h

stm32F407 + FreeRTOS + FAT 文件系统移植

configNUM_THREAD_LOCAL_STORAGE_POINTERS   5  大于3就行。

编译:

stm32F407 + FreeRTOS + FAT 文件系统移植

把ff_dev_support.c文件屏蔽不编译。

编译:很多结构体未定义。

stm32F407 + FreeRTOS + FAT 文件系统移植

主要是头文件引用问题,ff_sddisk.c 和 stm32f4xx_hal_sd.c 最好都引用  #include "stm32f4xx_hal_sd.h",

然后在ff_headers.h 中引用 #include "stm32f4xx_hal.h",这样就没问题了。

编译:

就剩7个错误。

stm32F407 + FreeRTOS + FAT 文件系统移植

主要是SD模块函数开关没打开,在stm32f4xx_hal_sd.c 打开 HAL_SD_MODULE_ENABLED

stm32F407 + FreeRTOS + FAT 文件系统移植

在FreeRTOSFATConfig.h中 定义就行了,#define HAL_SD_MODULE_ENABLED。

编译:

又是一堆警告和错误,不过都很明显,主要是调用了 stm32f4xx_ll_sdmmc.c MMC库文件函数名和参数不同。

stm32F407 + FreeRTOS + FAT 文件系统移植

把stm32f4xx_hal_sd.c 中 SDIO_ConfigData 函数名 全部替换成 SDIO_ConfigData。

stm32F407 + FreeRTOS + FAT 文件系统移植

把 SDIO_GetResponse(SDIO_RESPx)函数多加一个参数 SDIO_GetResponse(hsd->Instance, SDIO_RESPx),全部替换。

编译:

就剩一个错了。

stm32F407 + FreeRTOS + FAT 文件系统移植

在ff_sddisk.c   回调函数用不到,实现一个空函数就行

stm32F407 + FreeRTOS + FAT 文件系统移植

编译没有错了!!!

就可以测试了,插上SD卡 , 打开串口。

在main.c调用 FF_SDDiskInit("/"); 

如果打印初始化失败,主要是SD卡 检测不到卡。

stm32F407 + FreeRTOS + FAT 文件系统移植

可以屏蔽代码,ff_sddisk.c 中 prvSDMMCInit(),

stm32F407 + FreeRTOS + FAT 文件系统移植

(不一定要屏蔽,自己检查代码和SD卡cd检查引脚,根据PCB,没用到CD线,就可以屏蔽)

需要注意的是初始化SD卡 FF_SDDiskInit()-> prvSDMMCInit( 0 )->vGPIO_SD_Init() 函数中

根据开发板SD卡 数据线是四线还是三线 初始化,我的是4线,打开 BUS_4BITS。

还有在配置文件中 ,文件名长度要尽量小,我设置200最后ff_open() molloc卡死,改成50。

#define ffconfigMAX_FILENAME                                        (49+1)

stm32F407 + FreeRTOS + FAT 文件系统移植

最后编译,

stm32F407 + FreeRTOS + FAT 文件系统移植

证明初始化成功,能读取卡信息,能挂载。能否读写还需要写代码测试。

读写测试:

ff_mkdir("/wy") 创建文件夹。

ff_fopen( pcFileName, "w" )打开文件流(ff_fopen()未创建文件会自动创建文件)。

ff_fwrite( pcRAMBuffer, fsRAM_BUFFER_SIZE, 1, pxFile )读取文件,具体参考官方介绍。

代码:https://blog.csdn.net/wy212670/article/details/106941394

stm32F407 + FreeRTOS + FAT 文件系统移植
stm32F407 + FreeRTOS + FAT 文件系统移植
stm32F407 + FreeRTOS + FAT 文件系统移植

创建文件夹成功,创建文件写入成功,读取文件成功。

继续阅读