【STM32】检测SD卡是否插入

【STM32】检测SD卡是否插入

  • 开发环境
  • 原理图
  • 确定引脚的高低电平
  • 中断方式检测插入
    • 配置引脚
    • 打开引脚的中断
    • 编写代码
      • 显示SD卡信息
      • 引脚中断回调函数
  • 实现的效果

开发环境

软件:STM32CubeIDE1.14.1
硬件:立创天空星STM32F407VE;SD卡

原理图

要确认TF卡槽的9脚SD_DECT (自行确认具体的引脚)是否连接了
比如下图的就连上了PD3
检测引脚连接了
下面的这个就没有连接,无法检测。这个板没有连接

确定引脚的高低电平

SD插入后引脚为低电平,没插入为高电平。如果不知道怎么检测,有如下方法
把PD3(检测引脚)设为输入模式,然后不断检测引脚的电平。插拔几次,看串口输出的电平即可确认。
知道SD卡检测引脚的电平后,就可以检测SD卡的状态了 。

  GPIO_PinState SD_insert/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){SD_insert = HAL_GPIO_ReadPin(SD_DECT_GPIO_Port, SD_DECT_Pin);printf("sd:%d\n", SD_insert);HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);HAL_Delay(1000);

在这里插入图片描述

中断方式检测插入

如果喜欢,可以轮询检测引脚的状态,也即上面提到的检测电平的方法,不过这样效率太低,可以改用中断的方式。

配置引脚

配置引脚为外部中断,选择上升下降沿触发外部中断,这样插入和拔出都能检测
配置为外部中断

打开引脚的中断

注意这个中断优先级应该比SDIO的中断要,不然拔出了还在进行SDIO操作,导致错误 。
NVIC

编写代码

显示SD卡信息

先写一个能显示SD卡信息的函数,在插入时显示卡的信息。

void SD_Getinfo(void)
{printf("SD_Getinfo\n");HAL_SD_CardStateTypeDef state = HAL_SD_GetCardState(&hsd);HAL_SD_CardCIDTypeDef SD_CardCID;if (state == HAL_SD_CARD_TRANSFER){HAL_SD_GetCardCID(&hsd, &SD_CardCID);printf("\nInitialize SD card sucessfully!\n");printf("SD card information\n");printf("CardType           :%ld\n", hsd.SdCard.CardType);printf("CardVersion        :%ld\n", hsd.SdCard.CardVersion);printf("Class              :%ld\n", hsd.SdCard.Class);printf("RelCardAdd         :%ld\n", hsd.SdCard.RelCardAdd);printf("BlockNbr           :%ld\n", hsd.SdCard.BlockNbr);printf("BlockSize          :%ld\n", hsd.SdCard.BlockSize);printf("LogBlockNbr        :%ld\n", hsd.SdCard.LogBlockNbr);printf("LogBlockSize       :%ld\n", hsd.SdCard.LogBlockSize);printf("ManufacturerID     :%d\n", SD_CardCID.ManufacturerID);}else{printf("SD card initialize failed.\n");}
}

引脚中断回调函数

开启中断后,需要编写GPIO中断回调函数。插入时调用 MX_SDIO_Init(); 初始化SDIO,然后显示SD卡的信息。
拔出时复位SDIO HAL_SD_DeInit(&hsd); 再显示会提示没有初始化。
由于插拔过程电平是不稳定的,类似按键的抖动,因此需要消抖
这里为了简单,直接用HAL延时。实际应用自行查找更好的消抖方法

void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{HAL_Delay(30);if (GPIO_Pin == SD_DECT_Pin){/* in = 0 */if (GPIO_PIN_RESET == HAL_GPIO_ReadPin(SD_DECT_GPIO_Port, SD_DECT_Pin)){printf("SD in\n");MX_SDIO_SD_Init();printf("SD init\n");SD_Getinfo();}/* out = 1 */else{printf("SD out\n");HAL_SD_DeInit(&hsd);printf("SD deinit\n");SD_Getinfo();}}
}

实现的效果

实现的效果

如果对你有帮助,点个赞吧 ^ ^!

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

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

相关文章

isscc2024 short course4 In-memory Computing Architectures

新兴的ML加速器方法:内存计算架构 1. 概述 内存计算(In-memory Computing)架构是一种新兴的机器学习加速器方法,通过将计算能力集成到存储器中,以减少数据移动的延迟和能耗,从而提高计算效率和性能。这种方…

服务器软件架构演进

服务器软件架构演进 背景介绍阶段一:单机部署阶段二:应用与数据分离部署阶段三:启用缓存优化阶段四:启用应用服务器集群阶段五:数据库读写分离阶段六:启用反向代理及CDN加速阶段七:启用分布式文…

ComfyUI简单介绍

🍓什么是ComfyUI ComfyUI是一个为Stable Diffusion专门设计的基于节点的图形用户界面,可以通过各种不同的节点快速搭建自己的绘图工作流程。 软件打开之后是长这个样子: 同时软件本身是github上的一个开源项目,开源地址为&#…

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第28课-avatar玩家3D形象

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第28课-avatar玩家3D形象 使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界…

零售EDI:Target DVS EDI项目案例

Target塔吉特是美国一家巨型折扣零售百货集团,与全球供应商建立长远深入的合作关系,目前国内越来越多的零售产品供应商计划入驻Target。完成入驻资格审查之后,Target会向供应商提出EDI对接邀请,企业需要根据指示完成供应商EDI信息…

windows 控制面板卸载程序在注册表中位置

计算机\HKEY_LOCAL_MACHINE或者HKEY_CURRENT_USER\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\荐片高清影音 HKEY_CURRENT_USER 控制面板注册表只有当前用户可见 HKEY_LOCAL_MACHINE 控制面板注册表所有用户可见

【STM32踩坑】HAL固件库版本过高导致烧录后无法运行问题

问题引入 目前STM32CUBEMX已经更新到了6.11版本,对应的固件库也一直在更新; 以STM32F1库为例,目前最新的库对应版本为1.8.5 但是我们会发现,如果直接使用1.8.5版本的固件库生成HAL源码后,烧录是可以烧录,但…

leetcode栈和队列的相关题、有效的括号、用队列实现栈、用栈实现队列、设计循环队列等介绍

文章目录 前言一、有效的括号二、用队列实现栈三、 用栈实现队列四、设计循环队列总结 前言 leetcode栈和队列的相关题、有效的括号、用队列实现栈、用栈实现队列、设计循环队列等介绍 一、有效的括号 leetcode有效的括号 // 动态增长的栈 typedef char STDataType; typedef…

香港优才计划需要什么条件?一文给你说清2024优才政策、申请利弊及获批攻略

香港优才计划申请,竞争正逐渐加剧,在正式递交申请前,客观评估自身申请条件,找准个人履历中与香港人才引进的契合点,并在申请材料中详细表明,更有助于获批。 在申请之前,我们必须明白一个事实&a…

Hack The Box-BoardLight

总体思路 子域名收集->默认密码->信息泄露->CVE-2022-37706 信息收集&端口利用 nmap -sSVC boardlight.htb发现22和80端口开放,先看80端口网站信息 四处查看后,发现没有有效信息,对其进行目录扫描和子域名扫描 dirsearch -u…

【吊打面试官系列】Java高并发篇 - 线程的调度策略?

大家好,我是锋哥。今天分享关于 【线程的调度策略?】面试题,希望对大家有帮助; 线程的调度策略? 线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行: 1、线程体…

ROS for LabVIEW:实现LabVIEW与ROS的无缝集成

ROS for LabVIEW是由Tufts大学开发的一套VI集合,旨在实现LabVIEW与ROS(Robot Operating System)的无缝集成。ROS是一个灵活的机器人软件框架,而LabVIEW则是一种强大的图形化编程工具。这个工具包的推出使得LabVIEW用户能够直接与R…

时隔1年,我终于弄懂了Java 中的 AOP操作

1. AOP概述 2. AOP快速入门 依赖&#xff1a; <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId><version>${spring-boot.version}</version></dependency> 示例:记…

如何使用 Re-Ranking 改进大模型 RAG 检索

基于大型语言模型&#xff08;LLMs&#xff09;的聊天机器人可以通过检索增强生成&#xff08;RAG&#xff09;提供外部知识来改进。 这种外部知识可以减少错误答案&#xff08;幻觉&#xff09;&#xff0c;并且使模型能够访问其训练数据中未包含的信息。 通过RAG&#xff0…

Go程序出问题了?有pprof!

什么情况下会关注程序的问题&#xff1f; 一是没事儿的时候 二是真有问题的时候 哈哈哈&#xff0c;今天我们就来一起了解一下Go程序的排查工具&#xff0c;可以说即简单又优雅&#xff0c;它就是pprof。 在 Go 中&#xff0c;pprof 工具提供了一种强大而灵活的机制来分析 …

Pytorch深度学习实践笔记11(b站刘二大人)

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 《PyTorch深度学习实践》完结合集_哔哩哔哩_bilibi…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点&#xff0c;它…

虚拟化知识学习

虚拟化知识学习 关键概念和术语的简要介绍 虚拟化的基本概念 虚拟机 (VM)&#xff1a;一个虚拟机是一个模拟计算机系统的环境。它运行在物理硬件之上&#xff0c;但与物理硬件隔离&#xff0c;提供类似于物理计算机的功能。 虚拟化技术&#xff1a;这是指使用软件来创建虚拟版…

【Java reentrantlock源码解读】

今天学习一下Java中lock的实现方式aqs 直接上图这是lock方法的实现类、分为公平锁和非公平锁两种。 先看非公平的实现方法、很暴力有木有&#xff0c;上来直接CAS&#xff08;抢占锁的方法&#xff0c;是一个原子操作&#xff0c;没有学过的同学自行百度哦&#xff09;&#…

MagicaCloth2中文文档

提示&#xff1a;经搬运者测试&#xff0c;在ecs1.0中运行最为良好 如何安装 英语日语 目录 [隐藏] 1 如何安装2 样本运行测试3 可以删除示例文件夹4 如何更新5 发生错误时该怎么办6 如何卸载7 如何检查版本 如何安装 MagicaCloth2 需要 Unity 2021.3.16 &#xff08;LTS&…