基于STM32的SDIO读写SD卡的设计与实现

news2024/11/20 12:37:51

基于STM32微控制器的SDIO(Secure Digital Input Output)读写SD卡的设计和实现,可以分为硬件设计和软件实现两个部分。下面将对这两个部分进行详细说明。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

硬件设计:
1. 硬件连接:

   将SDIO引脚连接到STM32微控制器的相应引脚,包括数据线(D0-D3)、命令线(CMD)、时钟线(CLK)、以及SDIO上拉电阻。
   此外,还需要添加一个外部上拉电阻连接到SDIO的DAT0线上,并且将SD卡的电源引脚连接到适当的电源线上。

2. 电源电压与信号电平:
   通过SD卡供电引脚将电源电压连接到适当的电源线上,并确保电源电压在规格范围内(通常为3.3V)。
   SDIO接口使用的信号电平也是3.3V逻辑电平,所以需要外部电平转换电路(如电压级移位器)将STM32微控制器的信号电平与SD卡的信号电平匹配。

3. 时钟设置:
   在STM32的RCC寄存器中,配置SDIO时钟源和分频因子,以确定SDIO的时钟频率。

4. 初始化SDIO:
   在STM32的相应寄存器中,配置SDIO的工作模式、数据传输宽度等参数。

软件实现:
以下是SD卡读写的基本步骤:

1. 初始化SDIO:
   配置SDIO控制器,并使能SDIO时钟。

2. 插入SD卡:
   检测SD卡的插入状态,如果插入则继续执行,否则等待SD卡插入。

3. 设置SD卡总线宽度:
   根据需要,选择SD卡的数据总线宽度为4位或者1位。

4. 初始化SD卡:
   执行SD卡初始化命令(CMD0),发送SD卡底层版本命令(CMD8)等,并检测SD卡的回应。

5. 设置SD卡的工作模式:
   选择SD卡工作模式(SD卡或者SDHC卡),并设置扇区大小。

6. 发送读取命令:
   执行SD卡读取命令(CMD17)。

7. 读取数据:
   通过SDIO接口读取SD卡中的数据。

8. 发送写入命令:
   执行SD卡写入命令(CMD24)。

9. 写入数据:
   通过SDIO接口将数据写入SD卡。

代码实现示例(基于STM32Cube库):

```c
#include "stm32xxxx.h"

// 初始化SDIO控制器和SD卡
void SDIO_Init() {
  // SDIO配置
  ...
}

// 发送SD卡命令
void SD_SendCommand(uint8_t cmd, uint32_t argument) {
  // 发送命令
  SDIO->ARG = argument;
  SDIO->CMD = cmd | SDMMC_CMD_CMDEN;
  
  // 等待响应
  while (SDIO->STA & SDMMC_STA_CMDACT);
  while (!(SDIO->STA & (SDMMC_STA_CMDSENT | SDMMC_STA_CTIMEOUT | SDMMC_STA_CCRCFAIL)));
}

// 读取数据块
void SD_ReadBlock(uint32_t sector, uint8_t* buffer) {
  // 设置读取命令
  SD_SendCommand(CMD17, sector);
  
  // 等待数据传输完成
  while (SDIO->STA & SDMMC_STA_RXACT);
  while (!(SDIO->STA & (SDMMC_STA_RXFIFOHF | SDMMC_STA_DATAEND | SDMMC_STA_DCRCFAIL | SDMMC_STA_DTIMEOUT)));
  
  // 读取数据
  for (uint32_t i = 0; i < 512; i+=4) {
    *(uint32_t*)(buffer+i) = SDIO->FIFO;
  }
}

// 写入数据块
void SD_WriteBlock(uint32_t sector, const uint8_t* buffer) {
  // 设置写入命令
  SD_SendCommand(CMD24, sector);
  
  // 等待数据传输完成
  while (SDIO->STA & SDMMC_STA_TXACT);
  while (!(SDIO->STA & (SDMMC_STA_TXFIFOHE | SDMMC_STA_DATAEND | SDMMC_STA_DCRCFAIL | SDMMC_STA_DTIMEOUT)));
  
  // 写入数据
  for (uint32_t i = 0; i < 512; i+=4) {
    SDIO->FIFO = *(uint32_t*)(buffer+i);
  }
}

int main() {
  // 初始化SDIO控制器
  SDIO_Init();
  
  // 读取数据块
  uint8_t buffer[512];
  SD_ReadBlock(0, buffer);
  
  // 写入数据块
  const uint8_t data[512] = {0xFF};
  SD_WriteBlock(0, data);
  
  while (1) {}
}
```

以上是基于STM32的SDIO读写SD卡的设计与实现的一个简单示例,具体实现可以根据实际需求进行适当的调整和优化。

✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进

❤欢迎关注我的知乎:对error视而不见

代码获取、问题探讨及文章转载可私信。

 ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。

🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇

点击领取更多详细资料

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

模拟量两线制4-20mA隔离变送器全家桶

定义&#xff1a;是指输入与输出的两根线的模拟量测量信号的设备&#xff0c;该设备的优点是无需要工作电源&#xff0c;产品在安装过程中节约了现场布线的成本&#xff0c;用电量成本 模拟量两线制4-20mA隔离变送器全家桶 小体积模拟量两线制4-20mA隔离变送器系列型号&#xf…

Linux篇:线程

一、线程概念&#xff1a;是进程内的一个执行分支&#xff0c;线程的执行粒度要比进程要细。 1、Linux中线程该如何理解&#xff1a; ①在Linux中&#xff0c;线程在进程“内部”执行&#xff0c;线程在进程的地址空间中进行。任何执行流要执行&#xff0c;都要有资源&#xf…

【MQ02】基础简单消息队列应用

基础简单消息队列应用 在上一课中&#xff0c;我们已经学习到了什么是消息队列&#xff0c;有哪些消息队列&#xff0c;以及我们会用到哪个消息队列。今天&#xff0c;就直接进入主题&#xff0c;学习第一种&#xff0c;最简单&#xff0c;但也是最常用&#xff0c;最好用的消息…

【书籍分享 • 第一期】基于GPT-3、ChatGPT、GPT-4等Transformer架构的自然语言处理

文章目录 一、内容简介二、前言2.1 Transformer 模型标志着AI 新时代的开始2.2 Transformer 架构具有革命性和颠覆性2.3 Google BERT 和OpenAI GPT-3 等Transformer 模型将AI 提升到另一个层次2.4 本书将带给你的“芝士”2.5 本书面向的读者 三、本书内容简介3.1 第一章3.2 第二…

看了《如果奔跑是我的人生》,你有感触么?

♥ 为方便您进行讨论和分享&#xff0c;同时也为能带给您不一样的参与感。请您在阅读本文之前&#xff0c;点击一下“关注”&#xff0c;非常感谢您的支持&#xff01; 文 |猴哥聊娱乐 编 辑|徐 婷 校 对|侯欢庭 亲爱的&#xff0c;你知道吗&#xff1f;今年的国产剧市场好像…

[SpingBoot] 3个扩展点

初始化器ApplicationContextInitializer监听器ApplicationListenerRunner: Runner的一般应用场景就是资源释放清理或者做注册中心, 因为执行到Runner的时候项目已经启动完毕了, 这个时候可以注册进注册中心。 文章目录 1.初始化器ApplicationContextInitializer2.监听器Applica…

JVM-字节码文件的组成

Java虚拟机的组成 Java虚拟机主要分为以下几个组成部分&#xff1a; 类加载子系统&#xff1a;核心组件类加载器&#xff0c;负责将字节码文件中的内容加载到内存中。 运行时数据区&#xff1a;JVM管理的内存&#xff0c;创建出来的对象、类的信息等等内容都会放在这块区域中。…

面了中邮消金算法岗、开水团数据挖掘岗,做个系统性总结

最近技术群的同学&#xff0c;分享了面试数据挖掘/算法岗(实习)的经验。 今天整理后分享给大家&#xff0c;如果你对这块面试感兴趣&#xff0c;可以文末加入我们的面试、技术群 1、中邮消费金融AI算法工程师 面试官是nlp方向的&#xff0c;主要是问nlp相关 首先自我介绍 …

设计模式:简介及基本原则

简介 设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问&#xff0c;设计模式于己于他人于系统都是多赢的&#xff0c;设计模式使代码编制真正工程化&#xff…

基于springboot校园台球厅人员与设备管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括校园台球厅人员与设备管理系统的网络应用&#xff0c;在外国管理系统已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。校园台球厅人员与设备管理系统具…

基于springboot+vue的医院管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 研究背景…

[RootersCTF2019]I_<3_Flask

打开界面&#xff0c;根据题目应该是个flask模板注入&#xff0c;但是参数不知道是什么&#xff0c;偷看了一手别人的wp&#xff0c;学到了一个工具Arjun 找到一个参数name&#xff0c;测试一下 模板注入成功 先看一下有没有os._wrap_close类 放到notepad里面排下序 132直接用…

鸿蒙开发基础案列001

1、开发需求 案例app一打开是“Hello world” 界面&#xff0c;开发者点击“Hello world”变成“Hello ArkUI”’ 2、源代码 Entry Component struct Hello {State person_name: string Worldbuild() {Row() {Column() {Text(Hello this.person_name).fontSize(50).fontWei…

牛客周赛 Round 30 解题报告 | 珂学家 | 树形DP + 期望DP

前言 整体评价 D是一道数学题&#xff0c;E是一道经典的入门树形DP&#xff0c;F题是一道期望DP&#xff0c;记忆化的方式更加简单一些。 ABC虽然偏简单&#xff0c;但是都是构造形态的&#xff0c;好像有CF风格了。 欢迎关注 珂朵莉 牛客周赛专栏 珂朵莉 牛客小白月赛专栏…

【Docker】数据持久化 挂载

Docker的镜像是只读的&#xff0c;但是容器是可写的&#xff0c;我们可以将数据写入到容器&#xff0c;不过一旦容器删除数据将会丢 失&#xff0c;那么有什么办法能将数据进行持久化存储呢&#xff1f; ——在宿主机上开辟一块地方&#xff0c;存储内容和docker容器的存储内…

C++中的 auto

一、auto的引入 随着程序越来越复杂&#xff0c;程序中使用的类型也越来越复杂。 例如std::map<std::string, std::string>::iterator是一个类型&#xff0c;但是该类型太长了&#xff0c;容易写错。 用auto声明的变量可以自动推导出变量的类型 二、auto的使用细则 1…

RabbitMQ快速上手

首先他的需求实在什么地方。我美哟明显的感受到。 它给我的最大感受就是脱裤子放屁——多此一举&#xff0c;的感觉。 他将信息发送给服务端中间件。在由MQ服务器发送消息。 服务器会监听消息。 但是它不仅仅局限于削峰填谷和稳定发送信息的功能&#xff0c;它还有其他重要…

Java中的Map和Set

在Java中Map和Set分别是两个不同的接口 对于Set来说&#xff0c;Set上面还有Collection这个接口&#xff0c;而对于Map来说&#xff0c;上面就没有接口了 在这两个接口下面分别实现了一个有序的接口&#xff0c;sortmap和sortset&#xff0c;而在这个接口下面又分别有两个实现…

第4章 python深度学习——(波斯美女)

第4章 机器学习基础 本章包括以下内容&#xff1a; 除分类和回归之外的机器学习形式 评估机器学习模型的规范流程 为深度学习准备数据 特征工程 解决过拟合 处理机器学习问题的通用工作流程 学完第 3 章的三个实例&#xff0c;你应该已经知道如何用神经网络解决分类问题和回归…

【GitHub项目推荐--常见的国内镜像】【转载】

由于国内网络原因&#xff0c;下载依赖包或者软件&#xff0c;对于不少互联网从业者来说&#xff0c;都有不小的挑战&#xff0c;时间浪费在这上边&#xff0c;实在可惜。这个项目介绍了常见依赖&#xff0c;软件的国内镜像&#xff0c;助力大家畅爽编码。 这是一个归纳梳理类…