• 【STM32】TF卡&&FTA32文件系统


    一、SD卡介绍

    1.SD简介

    本质:NandFlash+控制芯片

    2.SD卡存储容量等级

    3.FAT文件系统的使用

    4.SD卡速度等级

    5.SD卡驱动方式

    1.SDIO&&SD

    1)SDIO接口通信线:CLK/CMD/DAT0-3(数据传输线4根)

    2)SPI接口通信线:CS/CLK/MOSI/MISO(数据传输线2根)

    3)因为SDIO的传输数据线比SPI传输数据线多,所以SDIO的传输速度比SPI还快

    2.SDIO引脚

     3.TF卡(Micro SD)

    比SD卡少一个电源引脚VSS2

    6.SDMMC

    7.SDMMC,TF(mirco card),SD

    二、SD卡

    1.原理图分析

    2.CubeMX设置

    【精选】STM32CubeMX学习笔记(26)——SDIO接口使用(读写SD卡)_stm32 读写sd卡_Leung_ManWah的博客-CSDN博客

    1.参数配置

     SD 4 bits Wide bus 四线SD模式

    2.DMA设置

    SDIO 外设支持生成 DMA 请求,使用 DMA 传输可以提高数据传输效率,因此在 SDIO 的控制代码中,可以把它设置为 DMA 传输模式或轮询模式,ST 标准库提供 SDIO 示例中针对这两个模式做了区分处理。应用中一般都使用DMA 传输模式。

    点击 DMA Settings 添加 SDIO 对应 DMA2 的通道4。DMA模式选择循环模式,方向选为内存到外设。

    3.配置NVIC

    3.参考代码(SDIO作为SD卡接口)

    1. #include "stm32f4xx_hal.h"
    2. // SD卡句柄
    3. SD_HandleTypeDef hsd;
    4. // SD卡初始化
    5. void SD_Init(void) {
    6. hsd.Instance = SDIO;
    7. hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
    8. hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
    9. hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
    10. hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
    11. hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
    12. hsd.Init.ClockDiv = 0;
    13. if (HAL_SD_Init(&hsd) != HAL_OK) {
    14. Error_Handler();
    15. }
    16. if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) {
    17. Error_Handler();
    18. }
    19. }
    20. // SD卡读取数据
    21. void SD_ReadBlocks(uint32_t *pData, uint32_t startBlock, uint32_t numBlocks) {
    22. if (HAL_SD_ReadBlocks(&hsd, pData, startBlock, numBlocks, HAL_MAX_DELAY) != HAL_OK) {
    23. Error_Handler();
    24. }
    25. }
    26. // SD卡写入数据
    27. void SD_WriteBlocks(uint32_t *pData, uint32_t startBlock, uint32_t numBlocks) {
    28. if (HAL_SD_WriteBlocks(&hsd, pData, startBlock, numBlocks, HAL_MAX_DELAY) != HAL_OK) {
    29. Error_Handler();
    30. }
    31. }
    32. // SD卡擦除块
    33. void SD_EraseBlocks(uint32_t startBlock, uint32_t numBlocks) {
    34. if (HAL_SD_Erase(&hsd, startBlock, numBlocks) != HAL_OK) {
    35. Error_Handler();
    36. }
    37. }
    38. int main(void) {
    39. // 初始化HAL库
    40. HAL_Init();
    41. // 配置系统时钟
    42. SystemClock_Config();
    43. // 配置GPIO和SDIO
    44. MX_GPIO_Init();
    45. SD_Init();
    46. // 读取数据
    47. uint32_t readBuffer[512];
    48. SD_ReadBlocks(readBuffer, 0, 1);
    49. // 写入数据
    50. uint32_t writeBuffer[512];
    51. // 填充写入数据
    52. SD_WriteBlocks(writeBuffer, 0, 1);
    53. // 擦除块
    54. SD_EraseBlocks(0, 1);
    55. while (1) {
    56. // 主循环
    57. }
    58. }
    59. // 错误处理函数
    60. void Error_Handler(void) {
    61. while (1) {
    62. // 发生错误时的处理
    63. }
    64. }
    65. // 系统时钟配置
    66. void SystemClock_Config(void) {
    67. // 你的时钟配置代码
    68. }
    69. // GPIO初始化
    70. void MX_GPIO_Init(void) {
    71. // 你的GPIO初始化代码
    72. }

    三、SD卡的HAL库/LL库解读

    SD卡在HAL库的函数调用流程:

    路向1:HAL_SD_Init(hal_sd.c)--->HAL_SD_InitCard(hal_sd.c)-->SDIO_PowerState_ON(ll_sdmmc.c)--->这个只是单纯的使能sd卡

    路线2:HAL_SD_Init(hal_sd.c)--->HAL_SD_InitCard(hal_sd.c)-->SD_InitCard(hal_sd.c)--->结束

    0.sdmmc.c与sd.c的不同

    sd.c中调用的寄存器底层实际上是调用sdmmc.c中的函数

    1.stm32f1xx_ll_sdmmc.c

    底层操作寄存器的(硬件控制)

    1.SDIO_PowerState_ON

    2.stm32f1xx_hal_sd.c

    1.HAL_SD_Init

    在这个函数中调用了【HAL_SD_InitCard】

    2.HAL_SD_InitCard

    这个函数包含以下功能:

    1)SDIO_PowerState_ON():打开SDIO开关

    2)SD_InitCard()【在hal库中】:这个是真正开始使能SDIO,初始化成功

    3.SD_InitCard

    在【HAL_SD_InitCard】中被调用

    四、FAT32文件系统简介

     1、文件系统究竟是什么

    (1)参考项目驱动创新学习训练营中《基于X210的裸机时钟温度显示器》第2季课程
    (2)文件系统(仓库管理员)是一套用来管理存储设备的软件
    (3)文件系统给用户提供用文件访问存储的机制,比扇区式访问舒服

    2、FAT32文件系统介绍

    (1)网络搜索FAT32文件系统

    FAT32指的是文件分配表是采用32位二进制数记录管理的磁盘文件管理方式,因FAT类文件系统的核心是文件分配表,命名由此得来。


    (2)官网  http://elm-chan.org/fsw/ff/00index_e.html


    (3)CubeMX工具包中middleware里包含了FAT32文件系统

    3、FAT32文件系统的开发方式

    (1)传统开发:自己到官网下载源码,自己移植,自己使用。
    (2)CubeMX式开发:直接勾选,默认对接HAL库,少量移植即可使用。

    五、HAL库的SD和DMA实例BUG

    1、bug发现与查找

    (1)bug发现:f_mount(挂载)不成功,单步追查发现是MBR扇区(扇区0-->目录)读取不对


    (2)bug验证:去掉FAT32,原工程中读写异常【应该是STM32中MDA的问题】

    2、bug解决

    (1)研究DMA,尝试修改HAL库源码解决,不推荐。
    (2)绕开DMA,使用阻塞读写函数来实现SD读写--》HAL_SD_WriteBlocks【删除DMA模块】

    六、在SD例程中添加FAT32实战

    待完成

  • 相关阅读:
    Spring——AOP原理及流程详解
    教育部:每所学校贷款项目总投资原则上不低于2000万
    记一次 HTTPS 抓包分析和 SNI 的思考
    盛水最多的容器
    Web前端:6个最佳在线跨浏览器测试工具(免费和付费)
    [JS Framework] 当前运行的基座不包含原生插件[XXX],请在manifest中配置该插件,重新制作包括该原生插件的自定义运行基座
    RTC 时间、闹钟
    IP地址的分类,五分类编制CIDR以及子网的划分和子网掩码
    JAVA基础——【笔记】14.集合
    C# CEFSharp WPF开发桌面程序实现“同一网站多开”
  • 原文地址:https://blog.csdn.net/m0_63077733/article/details/134525139