STM32 SDIO接口配置与使用方法详解

STM32的SDIO(Secure Digital Input Output)接口是一种用于SD卡和MMC卡的高速数据传输接口,通过SDIO接口可以实现对SD卡和MMC卡的读写操作。在本文中,我们将详细介绍STM32 SDIO接口的配置和使用方法,并附上相关的代码示例。

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

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

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

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

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

点击领取更多详细资料

1. STM32 SDIO接口简介

STM32的SDIO接口使用了全双工的模式,支持高速的SDIO 4.0标准。SDIO接口可以通过DMA传输来提高数据传输速度和减少CPU负担,同时还支持自动地处理多个数据块的传输。

2. STM32 SDIO接口配置方法

在使用STM32 SDIO接口之前,需要进行相应的配置以实现对SD卡的读写操作。以下是配置STM32 SDIO接口的步骤:

2.1 SDIO时钟配置

首先,需要配置SDIO的时钟,包括SDIO模块的和时钟源的配置。

2.2 GPIO配置

然后,我们需要配置相应的GPIO引脚为SDIO功能,并将引脚设置为推挽输出模式。

2.3 SDIO控制器配置

接下来,需要对SDIO控制器进行配置,包括时钟分频、数据线宽度、传输速度等。

2.4 DMA配置

为了提高数据传输效率,可以配置DMA传输来进行SDIO的数据读写操作。

2.5 SD卡初始化

最后,需要对SD卡进行初始化,包括发送卡初始化序列以使其进入正常工作状态。

以下是一个示例代码,演示了如何配置STM32的SDIO接口:

```c
#include "stm32f4xx.h"void SDIO_GPIO_Configuration(void)
{// 启用SDIO时钟RCC->AHB1ENR |= RCC_AHB1ENR_SDIOEN;// 配置SDIO引脚为复用功能GPIOB->MODER &= ~(GPIO_MODER_MODE7 | GPIO_MODER_MODE8 | GPIO_MODER_MODE9 | GPIO_MODER_MODE10);GPIOB->MODER |= (GPIO_MODER_MODE7_1 | GPIO_MODER_MODE8_1 | GPIO_MODER_MODE9_1 | GPIO_MODER_MODE10_1);// 配置IO引脚为AF12(SDIO功能)GPIOB->AFR[0] &= ~(GPIO_AFRL_AFSEL7_Msk | GPIO_AFRL_AFSEL8_Msk | GPIO_AFRL_AFSEL9_Msk | GPIO_AFRL_AFSEL10_Msk);GPIOB->AFR[0] |= (0xC << GPIO_AFRL_AFSEL7_Pos) | (0xC << GPIO_AFRL_AFSEL8_Pos) |(0xC << GPIO_AFRL_AFSEL9_Pos) | (0xC << GPIO_AFRL_AFSEL10_Pos);// 配置IO引脚为推挽输出GPIOB->OTYPER &= ~(GPIO_OTYPER_OT7 | GPIO_OTYPER_OT8 | GPIO_OTYPER_OT9 | GPIO_OTYPER_OT10);// 配置IO引脚速度GPIOB->OSPEEDR |= (GPIO_OSPEEDER_OSPEEDR7 | GPIO_OSPEEDER_OSPEEDR8 |GPIO_OSPEEDER_OSPEEDR9 | GPIO_OSPEEDER_OSPEEDR10);
}void SDIO_Init(void)
{// 启用SDIO时钟RCC->AHB2ENR |= RCC_AHB2ENR_SDIOEN;// 关闭SDIOSDIO->POWER &= ~SDIO_POWER_PWRCTRL_Msk;// 等待SDIO停止while (SDIO->POWER & SDIO_POWER_PWRCTRL_Msk);// SDIO时钟初始化和配置SDIO->CLKCR |= SDIO_CLKCR_HWFC_EN;SDIO->CLKCR |= (0x76 << SDIO_CLKCR_CLKDIV_Pos) |(0x2 << SDIO_CLKCR_CLKEN_Pos) |(0x1 << SDIO_CLKCR_PWRSAV_Pos);// 数据线宽度配置SDIO->CLKCR |= SDIO_CLKCR_WIDBUS_1;// DMA处理SDIO->DCTRL |= SDIO_DCTRL_DMAEN;// 使能SDIOSDIO->POWER |= SDIO_POWER_PWRCTRL_Msk;
}void SDIO_DMA_Init(void)
{// 启用DMA2时钟RCC->AHB1ENR |= RCC_AHB1ENR_DMA2EN;// 配置DMA2的Stream3和Stream6DMA2_Stream3->CR &= ~DMA_SxCR_EN; // 关闭DMA2 Stream3DMA2_Stream3->CR |= (0x4 << DMA_SxCR_CHSEL_Pos); // 选择DMA2 Stream3通道4DMA2_Stream3->PAR = (uint32_t)&(SDIO->FIFO); // 设置外设地址为SDIO_FIFO寄存器地址DMA2_Stream3->M0AR = (uint32_t)buffer; // 设置内存地址,此处为内存buffer的地址DMA2_Stream3->NDTR = sizeof(buffer) / 4; // 设置传输数据大小(单位为32位)DMA2_Stream3->CR |= DMA_SxCR_MINC; // 使能内存地址自增模式DMA2_Stream6->CR &= ~DMA_SxCR_EN; // 关闭DMA2 Stream6DMA2_Stream6->CR |= (0x4 << DMA_SxCR_CHSEL_Pos); // 选择DMA2 Stream6通道4DMA2_Stream6->PAR = (uint32_t)&(SDIO->FIFO); // 设置外设地址为SDIO_FIFO寄存器地址DMA2_Stream6->M0AR = (uint32_t)buffer; // 设置内存地址,此处为内存buffer的地址DMA2_Stream6->NDTR = sizeof(buffer) / 4; // 设置传输数据大小(单位为32位)DMA2_Stream6->CR |= DMA_SxCR_MINC; // 使能内存地址自增模式
}void SDIO_StartTransfer(void)
{// 启动DMA传输DMA2_Stream3->CR |= DMA_SxCR_EN;DMA2_Stream6->CR |= DMA_SxCR_EN;// 启动SDIO数据传输SDIO->DCTRL |= SDIO_DCTRL_DTEN;
}int main(void)
{// 初始化库和系统时钟// 配置SDIO引脚SDIO_GPIO_Configuration();// 配置SDIOSDIO_Init();// 配置DMASDIO_DMA_Init();// 启动传输SDIO_Transfer_Start();while (1){// 主循环中其他任务}
}
```

在这个示例代码中,我们首先调用`SDIO_GPIO_Configuration`函数来进行SDIO引脚的配置操作。然后,我们调用`SDIO_Init`函数来初始化和配置SDIO接口,包括时钟分频、数据线宽度和DMA处理。接下来,我们调用`SDIO_DMA_Init`函数来初始化和配置DMA传输。最后,我们调用`SDIO_StartTransfer`函数来启动SDIO和DMA传输。

通过以上的配置,我们可以实现对SD卡的读写操作,利用SDIO接口和DMA传输,在数据传输中提供高效率和低CPU负载的特性。通过合理配置和使用,可以充分利用STM32 SDIO接口的性能,提供高速的SD卡读写功能。

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

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

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

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

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

点击领取更多详细资料

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

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

相关文章

动态规划算法题刷题笔记

首先看动态规划的三要素&#xff1a;重叠子问题、最优子结构和状态转移方程。 重叠子问题&#xff1a;存在大量的重复计算 最优子结构&#xff1a; 状态转移方程&#xff1a;当前状态转移成以前的状态 动态规划的解题步骤主要有&#xff1a; 确定 dp 数组以及下标的含义状…

苍穹外卖-前端部分(持续更新中)

d 第二种&#xff1a;cmd中输入 vue ui进入图形化界面选择npm,vue2进行创建 先将创建的Vue框架导入Vsocde开发工具 然后ctrshiftp 输入npm 点击serve将项目启动 下这种写法跨域会报错&#xff1a; 解决方法&#xff1a; \ 注意 这种用法&#xff1a;&#xff08;不是单引号…

Android Handler完全解读

一&#xff0c;概述 Handler在Android中比较基础&#xff0c;本文笔者将对此机制做一个完全解读。读者可简单参考上述类图与时序图&#xff0c;便于后续理解。 二&#xff0c;源码解读 1&#xff0c;主线程伊始 众所周知&#xff0c;通过Zygote的fork方式&#xff0c;新创建…

远程方法调用Remote Method Invocation

网络编程包含不同的编程范式&#xff0c;主要有以下两种&#xff1a; 1. 套接字编程&#xff08;Sockets Programming&#xff09; 这种方式首先需要设计一个协议。协议是指在网络通信中&#xff0c;客户端和服务器如何进行数据交换的规则和标准。 在确定了协议之后&a…

SSH客户端 Termius for Mac 中文激活版

Termius for Mac是一款强大的终端和SSH客户端&#xff0c;为开发人员、系统管理员和网络工程师提供了全面的远程访问和管理工具。 软件下载&#xff1a;Termius for Mac 中文激活版下载 无论您是在使用Mac、Windows还是Linux系统&#xff0c;Termius都能提供出色的功能和用户体…

静态代理IP该如何助力Facebook多账号注册运营?

在Facebook运营中&#xff0c;充分利用静态代理IP是多账号运营的关键一环。通过合理运用静态代理IP&#xff0c;不仅可以提高账号安全性&#xff0c;还能有效应对Facebook的算法和限制。以下是这些关键点&#xff0c;可以帮助你了解如何运用静态代理IP进行Facebook多账号运营&a…

基于springboo校园社团信息管理系统

摘要 随着高校规模的扩大和学生社团活动的日益丰富多彩&#xff0c;校园社团信息管理成为一个备受关注的问题。为了更有效地组织、管理和推动校园社团的发展&#xff0c;本文设计并实现了一套基于Spring Boot的校园社团信息管理系统。本系统以实现社团信息的集中管理和高效运营…

Android studio布局详解

文章目录 一、Android studio布局详解二、Android studio六大布局案例三、优缺点四、热门文章 一、Android studio布局详解 Android Studio是一种用于开发Android应用程序的集成开发环境&#xff08;IDE&#xff09;,用于设计和编辑Android应用程序的用户界面布局。在Android …

使用dockers-compose搭建开源监控和可视化工具

简介 Prometheus 和 Grafana 是两个常用的开源监控和可视化工具。 Prometheus 是一个用于存储和查询时间序列数据的系统。它提供了用于监控和报警的数据收集、存储、查询和图形化展示能力。Prometheus 使用拉模型&#xff08;pull model&#xff09;&#xff0c;通过 HTTP 协议…

工具学习——使用OpenSmile提取音频特征

文章目录 OpenSmile介绍下载和安装提取特征格式转换特征提取尝试一正常使用手段常见的特征 使用Gnuplot可视化特征安装使用 总结 OpenSmile介绍 openSMILE&#xff08;open-source Speech and Music Interpretation by Large-space Extraction&#xff09;是一个开源工具包&am…

使用vue-print-nb打印el-table问题总结

css样式添加媒体查询 media print {} 样式只有在打印的时候才会生效 1、解决单选框复选框打印时选中消失的问题 media print {// 解决单选框复选框打印时选中消失的问题::v-deep .el-radio__input,::v-deep .el-checkbox__input {-webkit-print-color-adjust: exact;-moz-pri…

直流电机驱动(马达)

文章目录 一、介绍直流电机介绍电机驱动电路大功率器件直接驱动H桥驱动集成电路线路图 PWM介绍产生PWM的方法 二、实例1.呼吸灯案例2.直流电机调速 一、介绍直流电机 介绍 电机驱动电路 点击的负载较大&#xff0c;直接接在单片机I/O口上无法驱动&#xff0c;所以需要驱动电路…

Vite学习指南

那本课程都适合哪些人群呢&#xff1f; 想要学习前端工程化&#xff0c;在新项目中投入使用 Vite 构建工具的朋友 Webpack 转战到 Vite 的小伙伴 前端架构师们&#xff0c;可以充实自己的工具箱 当然如果你没有项目相关开发经验&#xff0c;也可以从本课程中受益&#xff0…

支付宝开通GPT4.0,最新经验分享

ChatGPT是由OpenAI开发的一种生成式对话模型&#xff0c;具有生成对话响应的能力。它是以GPT&#xff08;Generative Pre-trained Transformer&#xff09;为基础进行训练的&#xff0c;GPT是一种基于Transformer架构的预训练语言模型&#xff0c;被广泛用于各种自然语言处理任…

vue 样式隔离原理

日常写单文件组件时&#xff0c;会在style添加scoped属性&#xff0c;如<style scoped>&#xff0c;目的是为了隔离组件与组件之间的样式&#xff0c;如下面的例子&#xff1a; <template><p class"foo">这是foo</p><p class"bar&q…

C#从网址上读取json数据

需求&#xff1a;从客户给的网址中读取json格式的数据。 找了好多资料&#xff0c;都不太好使&#xff0c;看到了一篇很有帮助的文章。以下大部分内容和这篇找到的文章近似。太不容易了&#xff0c;同时也感谢这篇文章的作者心所欲。 https://www.cnblogs.com/zoujinhua/p/10…

数字图像处理(实践篇)三十四 OpenCV-Python绘制椭圆

目录 一 涉及的函数 二 实践 一 涉及的函数 cv2.ellipse(img,center,axes,angle,start_angle,end_angle,color,thickness) 参数: ①<

Future模式先给您提货单

Future模式是一种设计模式&#xff0c;用于在处理耗时操作时提高程序的响应性。 角色介绍: Main类: 负责向Host发出请求并获取数据的类。 Host类: 负责向请求返回FutureData的实例的类&#xff0c;起到调度的作用。 Data接口: 表示访问数据的方法的接口&#xff0c;由FutureD…

读书笔记--人类简史内容梳理和阅读感悟1

继未来简史阅读感悟后&#xff0c;一直没空梳理人类简史内容感悟&#xff0c;其实人类简史写的非常专业&#xff0c;也是人类学、基因学、生态学等跨学科的畅销书。最近终于有时间整理《人类简史》内容和总结了&#xff0c;《人类简史》是以色列历史学家尤瓦尔赫拉利&#xff0…

openGauss学习笔记-209 openGauss 数据库运维-常见故障定位案例-共享内存泄露问题

文章目录 openGauss学习笔记-209 openGauss 数据库运维-常见故障定位案例-共享内存泄露问题209.1 共享内存泄露问题209.1.1 问题现象209.1.2 原因分析209.1.3 处理方法 openGauss学习笔记-209 openGauss 数据库运维-常见故障定位案例-共享内存泄露问题 209.1 共享内存泄露问题…