一、SD卡介绍
1.SD简介
2.SD卡存储容量等级
3.FAT文件系统的使用
4.SD卡速度等级
5.SD卡驱动方式
1.SDIO&&SD
1)SDIO接口通信线:CLK/CMD/DAT0-3(数据传输线4根)
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.参数配置
2.DMA设置
SDIO 外设支持生成 DMA 请求,使用 DMA 传输可以提高数据传输效率,因此在 SDIO 的控制代码中,可以把它设置为 DMA 传输模式或轮询模式,ST 标准库提供 SDIO 示例中针对这两个模式做了区分处理。
应用中一般都使用DMA 传输模式。
3.配置NVIC
3.参考代码(SDIO作为SD卡接口)
#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库解读
路向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的不同
1.stm32f1xx_ll_sdmmc.c
1.SDIO_PowerState_ON
2.stm32f1xx_hal_sd.c
1.HAL_SD_Init
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文件系统介绍
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发现与查找
2、bug解决
(1)研究DMA,尝试修改HAL库源码解决,不推荐。
(2)绕开DMA,使用阻塞读写函数来实现SD读写–》HAL_SD_WriteBlocks【删除DMA模块】
六、在SD例程中添加FAT32实战
待完成
原文地址:https://blog.csdn.net/m0_63077733/article/details/134525139
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_4815.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!