【STM32】检测SD卡是否插入

news2024/9/21 10:32:13

【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.coloradmin.cn/o/1703914.html

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

相关文章

对未知程序所创建的带有折叠书签的 PDF 文件书签层级全展开导致丢失的一种解决方法

对需要经常查阅、或连续长时间阅读的带有折叠书签的 PDF 文档展开书签层级,提高阅览导航快捷是非常有必要的。 下面是两种常用书签层级全展开的方法 1、 FreePic2Pdf 1 - 2 - 3 - 4 - 5 - 6,先提取后回挂 2、PdgCntEditor 载入后,直接保存…

雷军-2022.8小米创业思考-8-和用户交朋友,非粉丝经济;性价比是最大的诚意;新媒体,直播离用户更近;用真诚打动朋友,脸皮厚点!

第八章 和用户交朋友 2005年,为了进一步推动金山的互联网转型,让金山的同事更好地理解互联网的精髓,我推动了一场向谷歌学习的运动,其中一个小要求就是要能背诵“谷歌十诫”。 十诫的第一条就令人印象深刻:以用户为中…

开发中的常用快捷键

开发中的常用快捷键 文章目录 开发中的常用快捷键一、window11快捷键二、WebStrom 快捷键三、IDEA快捷键四、vscode快捷键五、eclipse快捷键项目备注 一、window11快捷键 快捷切屏 、来回切屏alttab 二、WebStrom 快捷键 常规快捷键和idea差不多 ttab生成vue模版 htab生成ht…

衍生品赛道的 UniSwap:SynFutures 或将成为行业领军者

经过一个周期的发展,DeFi 已经成为基于区块链构建的最成功的去中心化应用,并彻底改变了加密市场的格局。加密货币交易开始逐步从链下转移到链上,并从最初简单的 Swap 到涵盖借贷、Staking、衍生品交易等广泛的生态系统。 在 DeFi 领域&#x…

Go程序出问题了?有pprof!

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

看潮成长日程表用户手册(上)

看潮成长日程表用户手册(上) 一、特色功能1、以每周日程表为主要形式2、全时管控的时间管理3、持续的日程管理4、分期间时间表5、按日排程,按周输出6、夏季作息时间处理7、年度假日处理8、休息日处理9、弹性日程10、完成记录11、多种输出形式…

Java 泛型 <? super T> 中 super 怎么 理解?与 extends 有何不同?

作者:zhang siege 链接:https://www.zhihu.com/question/20400700/answer/91106397 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 首先,泛型的出现时为了安全,所有与…

ai发展会不会带来企业的员工垄断呢

写代码写累了,写点个人不成熟的想法,作为记录 随着gpt-4o发布,可以预计的是,AI逐渐能够通过各种外接设备和传感器和真实世界实时交互。那么未来一个接上摄像头,键盘,音响,可移动身体的的AI还会…

改进rust代码的35种具体方法-类型(十九)-避免使用反射

上一篇文章 从其他语言来到Rust的程序员通常习惯于将反思作为工具箱中的工具。他们可能会浪费很多时间试图在Rust中实现基于反射的设计,却发现他们所尝试的事情只能做得不好,如果有的话。这个项目希望通过描述Rust在反思方面做什么和不做什么&#xff0c…

VS QT 里头文件的<>和““的区别

今天在跑项目的时候遇到这么个问题,在添加api宏定义的时候,不加显示无法识别的外部错误,加了显示找不到文件。反正就是怎么都是错的,但是我检查了CmakeLists、模块所在文件夹、项目路径都是没有问题的。非常奇怪。 然后就开始尝试…

Stable Diffusion WebUI能运行但无法调试,一直报错:TypeError: ‘Task‘ object is not callable

Stable Diffusion WebUI正常运行模式(Run)能运行,但是调试模式(Debug)无法运行,一直报错:TypeError: ‘Task‘ object is not callable ⚙️1.软件环境⚙️🔍2.问题描述&#x1f50d…

【vue/uniapp】ucharts 可以横向拖动查看数据(当图表数据过多时),避免叠加

效果参考: 实现: 需要在 opts 中配置:enableScroll: true 和 ontouch:true;在 opts 的 xAxis 中配置:itemCount: 5(值可以自定义,如图,为默认展示几个); …

theharvester一键收集域名信息(KALI工具系列十)

目录 1、KALI LINUX简介 2、theharvester工具简介 3、在KALI中使用theharvester 3.1 用搜索引擎扫描 3.2 扫描并输出结果 3.3 扫描某域名下的所有账号 3.4 使用所有的搜索引擎扫描 4、总结 1、KALI LINUX简介 Kali Linux 是一个功能强大、多才多艺的 Linux 发行版&…

vue koa post 请求代理失败问题总结

场景是在使用 koa 写接口时,客户端发送 post 请求,服务端会报下面这个错误,导致接口未能访问成功: 前端接口一直 Pending 状态, 解决方案:走的是本地 mock 数据,未访问服务端的接口 总结&#x…

AWR中的电磁仿真算法---特点与运用场景

AWR中的电磁仿真算法—特点与运用场景 在使用AWR软件进行射频电路、芯片设计时,发现其中有非常多的仿真器选项,这些电磁仿真器有什么特点呢?在此简单分析介绍。 算法名称运用场景特点AXIEM算法微带线、带状线、MMIC矩量法运算,…

自用升级centos7.2的默认Python 2.7.5为python3.8

wget https://www.python.org/ftp/python/3.8.8/Python-3.8.8.tgztar zxvf Python-3.8.8.tgz 进入刚刚解压后的目录 ./configure --prefix/data/soft/python3按照上面截图所属,需要安装gcc 安装报错需要安装 sudo yum install zlib1g-dev make -j4 make install -…

芯品荟 | 理疗仪屏驱案例分享

PART ONE 市场简介 - Market Profile - 理疗仪(Physiotherapy instrument)是物理治疗仪器的简称,是将物理因子作用于人体,使之产生好转的设备,适用于家庭、办公室等场所。 红外理疗仪能发挥作用,主要靠…

OTA在线旅行社系统架构:连接世界的科技纽带

随着互联网的快速发展和人们对旅行需求的不断增长,OTA(Online Travel Agency)在线旅行社成为了现代旅行业中的重要一环。OTA系统架构的设计和实现将对旅行行业产生深远影响。本文将探讨OTA在线旅行社系统架构的重要性和关键组成部分&#xff…

走进波士顿科学公司,艾威张老师为其分享项目管理方法,提升员工项目管理能力!

2024年5月22日下午,艾威培训公司应邀为波士顿科学公司PMO部门举办了一场特别的项目管理在线知识分享。本次分享由艾威培训项目管理讲师张老师主讲,主题为“一小时读懂项目管理”。此次活动旨在帮助波士顿科学公司的员工更好地理解项目管理的基本概念和实…

5.29高通技术分享抢先看 | 2024高通边缘智能创新应用大赛公开课

火力全开!2024高通边缘智能创新应用大赛首期公开课将在5月29日晚上8点炫酷启动! 届时,来自大赛主办方高通技术公司的产品市场总监李骏捷和高级资深工程师李万俊将于云端聚首,带来一场关于边缘智能的前沿技术对话。 各位参赛者及…