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

#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和SDIOMX_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实战

待完成

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/200806.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeWhisperer 一款好玩的 AI 插件

忙里抽闲,今天试了试 CodeWhisperer 这款插件,我是在 IDEA 中做的测试,下面是我的一些使用感想: 安装 CodeWhisperer 插件:在 IntelliJ IDEA 中,可以通过插件管理器安装 CodeWhisperer 插件,然…

基于Cortex®-M4F的TM4C123GH6NMRT7R 32位MCU,LM74900QRGERQ1、LM74930QRGERQ1汽车类理想二极管

一、TM4C123GH6NMRT7R IC MCU 32BIT 256KB FLASH 157BGA Tiva™C系列微控制器为设计人员提供了基于ARMCortex™-M的高性能架构,该架构具有广泛的集成功能以及强大的软件和开发工具生态系统。以性能和灵活性为目标,Tiva™C系列架构提供了一个具有FPU的80…

汽车托运汽车会产生公里数吗?

汽车托运,顾名思义就是把汽车放在板车上进行托运,既然是被托运,那为什么还会产生公里数呢?是被司机私用了吗?还是被当成租赁工具租借出去了呢? 其实不然,回到托运流程里,特别是大板车,我们的线路有很多需…

Redis(事务和持久化)(很重要!)

事务的定义: Redis中的事务是指一组命令的集合,这些命令可以在一个原子操作中执行。在Redis中,可以使用MULTI命令开始一个事务,然后使用EXEC命令来执行事务中的所有命令,或者使用DISCARD命令来取消事务。事务可以确保…

ERP对接淘宝/天猫/京东/拼多多商品详情数据API接口

引言 今天,我们时代变化非常快,传统行业做法,已经无法完全适应时代的发展。互联网的发展,造成了一股网购热。京东,天猫,淘宝,易购……网购,给我们生活带来了方便,消费者…

亚马逊第二个大语言模型 Olympus 即将上线

据外媒爆料,亚马逊正在训练他的第二个大语言模型——Olympus,很有可能在今年12月份上线。亚马逊计划将Olympus接入在线零售商店、Echo等设备上的Alexa语音助手,并为AWS平台提供新的功能。据说这个大语言模型规模达到2万亿(2000B&a…

排序算法--冒泡排序

实现逻辑 ① 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 ②对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 ③针对所有的元素重复以上的步骤,除了最后一个。 ④…

java+springboot+bootstrap校园闲置物品拍卖交易平台_ngad7-

根据日常实际需要,一方面需要在系统中实现基础信息的管理,同时还需要结合实际情况的需要,提供校园闲置物品交易管理功能,方便校园闲置物品交易管理工作的展开,综合考虑,本套系统应该满足如下要求&#xff1…

Navicat DML 操作

在表格种插入 列信息 -- 修改数据 update 表名 set 列名 值1, 列名值2,[where 条件]; -- 注意:如果update语句没有加where 表里对应行的全部信息都会被改; -- 删除数据 delecte from 表名 [where 条件]; 未删除前: 执行删除后为: DQL - 条…

Apache Hive源码阅读环境搭建

前置软件: JDK 1.8 Maven 3.3.9 1 下载源码 # 下载源码 git clone https://github.com/apache/hive.gitcd hive# 查看标签 git tag# 切换到要阅读的指定版本的tag git checkout rel/release-2.1.02 编译源码 mvn clean install -DskipTests执行报错 日志如下 E…

Java精品项目源码基于SpringBoot的樱花短视频平台(v66)

Java精品项目源码基于SpringBoot的樱花短视频平台(v66) 大家好,小辰今天给大家介绍一个樱花短视频平台,演示视频公众号(小辰哥的Java)对号查询观看即可 文章目录 Java精品项目源码基于SpringBoot的樱花短视频平台(v66)难度指数&…

基础课8——中文分词

中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个…

[vxe-table] expandAll:true 当table数据更新后无法展开,只有第一次能展开才能生效的问题

:tree-config"{rowField: id,parentField: parentId,expandAll: true,reserve: true, }" :row-config"{ keyField: id, isHover: true }"参考: vxe tree expandAll:true当table数据更新后无法展开,只有第一次能展开才能…

go-zero微服务的使用

一、入门案例 1、使用goland创建一个工程 2、新建一个user.proto syntax "proto3";package user; // 这个地方表示生成的go的包名叫user option go_package "./user";message UserInfoRequest {int64 userId 1; }message UserInfoResponse {int64 user…

SwiftUI 如何动态开始和停止播放永久重复(repeatForever)动画

0. 功能需求 在 SwiftUI 丰富多彩的动画世界中,我们有时希望可以随意开始和停止永久循环(repeatForever)的动画,不过这时往往会产生错误的动画“叠加”效果。 从上图可以看到:虽然我们希望密码输入框背景只在用户输入密码时才发生闪烁,但顶部的密码输入框随着不断输入其…

Speech | openSMILE语音特征提取工具

官方地址:openSMILE 3.0 - audEERING 使用指导:openSMILE — openSMILE Documentation (audeering.github.io) openSMILE 简介 openSMILE是一款以命令行形式运行的工具,通过配置config文件来提取音频特征。主要应用于语音识别、情感计算、音…

专业课140+总分420+东南大学920专业综合考研,信息学院通信专业考研分享

专业课140总分420东南大学920专业综合考研,信息学院通信专业考研分享 我是三月开始系统考研备战,寒假先看的高数全书,奈何在家效率极其低下,才草草看了前三四章。回校后学习的比较认真,每天大概保持10个小时左右&…

中间件安全:Apache Tomcat 弱口令.(反弹 shell 拿到服务器的最高控制权.)

中间件安全:Apache Tomcat 弱口令. Tomcat 是 Apache 软件基金会(Apache Software Foundation)的 Jakarta 项目中的一个核心项目,由 Apache、Sun 和其他一些公司及个人共同开发而成。 通过弱口令登录后台,部署 war 包…

使用Arrays.asList与不使用的区别

在写算法的时候,遇到了有的题解使用的是Arrays.asList,也有的是直接新建一个List集合将元素加进去的。 看了一下算法的时间,两者居然相差了9秒。 算法原地址: 力扣(LeetCode)官网 - 全球极客挚爱的技术成长…

手机运行内存大揭秘:探索你手机的超级大脑!

你有没有想过,为什么有些手机看起来外形相似,但运行速度却有如天壤之别?答案就在手机的运行内存里!今天,我们就一起揭开手机运行内存的神秘面纱,探索你手机的超级大脑! 01 运行内存究竟是干什么…