【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卡接口)

cpp 复制代码
#include "stm32f4xx_hal.h"

// SD卡句柄
SD_HandleTypeDef hsd;

// SD卡初始化
void SD_Init(void) {
  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 0;

  if (HAL_SD_Init(&hsd) != HAL_OK) {
    Error_Handler();
  }

  if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) {
    Error_Handler();
  }
}

// SD卡读取数据
void SD_ReadBlocks(uint32_t *pData, uint32_t startBlock, uint32_t numBlocks) {
  if (HAL_SD_ReadBlocks(&hsd, pData, startBlock, numBlocks, HAL_MAX_DELAY) != HAL_OK) {
    Error_Handler();
  }
}

// SD卡写入数据
void SD_WriteBlocks(uint32_t *pData, uint32_t startBlock, uint32_t numBlocks) {
  if (HAL_SD_WriteBlocks(&hsd, pData, startBlock, numBlocks, HAL_MAX_DELAY) != HAL_OK) {
    Error_Handler();
  }
}

// SD卡擦除块
void SD_EraseBlocks(uint32_t startBlock, uint32_t numBlocks) {
  if (HAL_SD_Erase(&hsd, startBlock, numBlocks) != HAL_OK) {
    Error_Handler();
  }
}

int main(void) {
  // 初始化HAL库
  HAL_Init();

  // 配置系统时钟
  SystemClock_Config();

  // 配置GPIO和SDIO
  MX_GPIO_Init();
  SD_Init();

  // 读取数据
  uint32_t readBuffer[512];
  SD_ReadBlocks(readBuffer, 0, 1);

  // 写入数据
  uint32_t writeBuffer[512];
  // 填充写入数据
  SD_WriteBlocks(writeBuffer, 0, 1);

  // 擦除块
  SD_EraseBlocks(0, 1);

  while (1) {
    // 主循环
  }
}

// 错误处理函数
void Error_Handler(void) {
  while (1) {
    // 发生错误时的处理
  }
}

// 系统时钟配置
void SystemClock_Config(void) {
  // 你的时钟配置代码
}

// GPIO初始化
void MX_GPIO_Init(void) {
  // 你的GPIO初始化代码
}

三、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实战

待完成

相关推荐
bubiyoushang8881 小时前
STM32F103C8T6+DM9051以太网功能实现方案
stm32·单片机·嵌入式硬件
IT_阿水1 小时前
基于STM32河流水质检测
stm32·单片机·嵌入式硬件
黑白园2 小时前
STM32定时器中断
stm32·单片机·嵌入式硬件
weixin_456808383 小时前
【沁恒蓝牙开发】ADC DMA定时采样、转化
单片机·嵌入式硬件
华普微HOPERF4 小时前
MCU+BLE射频+丰富外设,BLE SoC如何高效传输数据?
单片机·嵌入式硬件
振南的单片机世界4 小时前
时钟开关:不用的外设,把它的时钟关掉,省电!
stm32·单片机·嵌入式硬件
金色光环4 小时前
SCPI添加错误码
stm32·scpi
iCxhust5 小时前
将8088 BootLoader分拆烧写到8086 ROM中
stm32·单片机·嵌入式硬件·51单片机·微机原理
国科安芯5 小时前
商业航天电机控制领域抗辐射 MCU 芯片应用研究
网络·单片机·嵌入式硬件·安全性测试
charlie1145141916 小时前
嵌入式C++工程实践第20篇:GPIO 输入模式内部电路 —— 芯片是如何“听“到外部信号的
开发语言·c++·stm32·单片机