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_initialize 、 SD_states、 SD_reead、 SD_write、 SD_read、 SD_ioctl 。
  • 上面提到的接口函数都调用了BSP_ 开头的函数,这是CubeMX生成的底层直接操作SDIO的函数。

驱动器数组

  • 驱动器类型是 Disk_drvTypeDef 在 ff_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,具体看上面的关系图即可。

相关推荐
沐欣工作室_lvyiyi9 分钟前
基于STM32的人体健康检测设计(论文+源码)
stm32·单片机·嵌入式硬件
艾络迅Acceleronix15 分钟前
气象监测:STM32+EG800Z AT + 艾络迅平台实战|气压/光照/雨量采集全流程
stm32·单片机·嵌入式硬件·mcu·物联网·1024程序员节
深圳老胡17 分钟前
FDC2212 + STM32G030 液面探测:IIC 读数跳动导致下探深度不一致的排查与解决
笔记·stm32·单片机·代码规范·1024程序员节
硅基造物主22 分钟前
STM32 从 0 到 1 做智能家居(一):先想清楚要做什么
stm32·mqtt·嵌入式·智能家居·hal库·esp-12f
xiangw@GZ26 分钟前
两线 JTAG(cJTAG / IEEE 1149.7)技术专题
单片机·嵌入式硬件
comyccccc40 分钟前
晶振区禁铺铜,三大保险丝护航电路安全学习笔记
单片机·嵌入式硬件
女神下凡1 小时前
芯参谋(71):全桥电机驱动电路设计指南
arm开发·stm32·单片机·嵌入式硬件·硬件工程·设计规范·1024程序员节
李永奉1 小时前
杰理可视化SDK开发-【BUG】AC7006F8芯片开启一拖二和双麦DNS通话算法后,大概率通话时蓝牙自动断连,RAM空间爆了问题处理
单片机·嵌入式硬件·mcu·物联网·电脑·bug
小向是个Der1 小时前
P02_你的变量住在哪里_教学文档
经验分享·笔记·stm32·单片机
深圳老胡2 小时前
液面探测功能的硬件方案对比:原理、优缺点与选型建议
笔记·单片机