STM32 Hal库SDIO在FATFS使用下的函数调用关系

STM32 Hal库SDIO在FATFS使用下的函数调用关系

本文并不将FATFS的相关接口操作,而是将HAL在使用FATFS通过SDIO外设管理SD卡时,内部函数的调用逻辑,有助于当我们使用CUBEMX生成FATFS读取SD卡的代码时无法运行时Debug。本文也会说明一些可能出现的bug用于参考。

主要对象和变量的说明

接口文件 sd_diskio.c

  • 文件sd_diskio.c 是CUBEMX自动生成的FATFS操作SD卡的接口函数文件,如果没有CubeMX生成的话,一般这个文件是需要我们自己写的。
  • 这个文件中有一个全局变量 SD_driver 这个全局变量是底层操作接口的函数集合,Diskio_drvTypeDef 类型。包含的操作函数接口有 SD_initializeSD_statesSD_reead SD_write SD_read SD_ioctl
  • 上面提到的接口函数都调用了BSP_ 开头的函数,这是CubeMX生成的底层直接操作SDIO的函数。

驱动器数组

  • 驱动器类型是 Disk_drvTypeDefff_gen_drv.c 文件中有这个类的一个全局变量 disk

C 复制代码
typedef struct
{ 
  uint8_t                 is_initialized[_VOLUMES];
  Diskio_drvTypeDef       *drv[_VOLUMES];
  uint8_t                 lun[_VOLUMES];
  __IO uint8_t            nbr;

}Disk_drvTypeDef;
  • 这个驱动集合中用多个数组来存放各个驱动器操作函数接口集合drv和对应的卷号lun。而在CubeMX中生成的MX_FATFS_Init 中就将 SD_Driver 这个SD卡的接口函数集合变量和卷号0绑定在一起。

函数调用关系图

上面的关系图很清楚的说明各个函数间的调用关系。有些需要注意的地方在下面说明:

  • MX_SDIO_SD_Init 只是对 hsd 这个结构体的部分成员作初始化,真正初始化SDIO的动作不在这儿。

    • 而且这里赋值的hsd.Init.BusWide 只是中间阶段测试读取一个块大小时参数,并不是最终的参数。所以,这里,这个参数一定要求是SDIO_BUS_WIDE_1B
    • 如果我们硬件最终设计的是1B/4B/8B的卡的话,直接在CubeMX设置就可以,它会在BSP_SD_init 最后使用HAL_SD_ConfigWideBusOperation设置对应运行的SDIO的数据位宽。
    • 这里赋值的hsd.Init.ClockDiv 是 最终运行时SDIO的运行速率。
  • 真正对SDIO进行初始化的地方是f_mount 函数调用时,通过数组索引到SD卡驱动接口函数集合 SD_Driver 再调用其中的 SD_initialize 实现SDIO底层硬件的初始化。

    所以需要注意,如果我们有任何对SD卡直接的操作,需要放在 f_mount 之后,因为在f_mount 之前,SDIO外设根本还没有开始初始化。

  • 由于SD卡在初始化的时候一开始需要以1B位宽低速进行读取和设置,所以 BSP_SD_Init 中使用了三次SDIO外设的初始化SDIO_Init,具体看上面的关系图即可。

相关推荐
崇山峻岭之间24 分钟前
单片机USB虚拟串口实验
单片机·嵌入式硬件
崇山峻岭之间37 分钟前
单片机USB U盘实验
单片机·嵌入式硬件
点灯小铭1 小时前
基于单片机的锅炉压力与温度监测报警系统设计
数据库·单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
环境倒逼我学习1 小时前
无人机地面站之第13章 Mission Planner 入门与界面总览
单片机·嵌入式硬件·无人机
大阳1231 小时前
ARM.8(ADC,SPI)
单片机·嵌入式硬件·adc·spi
hoiii1872 小时前
基于 STM32 的标准遥控器架构与源码
stm32·嵌入式硬件·架构
少年、潜行2 小时前
STM32 ISP 升级体验
stm32·嵌入式硬件·isp升级·系统编程区域
杨连江2 小时前
一种三模式可调气隙式双侧定子滑移可变磁通轴向永磁电机
单片机·嵌入式硬件
Aaron158811 小时前
无人机反制中AOA+TDOA联合定位技术与雷达探测定位技术的应用对比分析
arm开发·嵌入式硬件·fpga开发·硬件工程·无人机·信息与通信·信号处理
foundbug99912 小时前
STM32 睡眠模式测试程序
stm32·单片机·嵌入式硬件