【正点原子STM32连载】第四十六章 SD卡实验 摘自【正点原子】APM32E103最小系统板使用指南

1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

第四十六章 SD卡实验

本章将介绍使用APM32E103驱动SD卡进行SD卡的识别、读写等操作。通过本章的学习,读者将学习到SD卡的使用。
本章分为如下几个小节:
46.1 硬件设计
46.2 程序设计
46.3 下载验证

46.1 硬件设计
46.1.1 例程功能

  1. 程序运行后,若初始化SD卡成功,则会通过串口输出SD卡的相关参数
  2. 按下KEY_0按键,可读取SD卡扇区0的数据,并通过串口显示
  3. 可通过USMART进行SD卡数据读写操作
  4. LED0闪烁,指示程序正在运行
    46.1.2 硬件资源
  5. LED
    LED0 - PB5
  6. 按键
    KEY0 - PE4
  7. USART1(PA9、PA10连接至板载USB转串口芯片上)
  8. 正点原子 2.8/3.5/4.3/7/10寸TFTLCD模块(仅限MCU屏,16位8080并口驱动)
  9. SD卡(SDIO驱动)
    46.1.3 原理图
    本章实验使用SDIO接口与SD卡进行连接,开发板板载了一个Micro SD卡座,用于连接SD卡,SD卡与MCU的连接原理图,如下图所示:
    在这里插入图片描述

图46.1.3.1 SD卡与MCU的连接原理图
46.2 程序设计
46.2.1 SD卡驱动
本章实验的SD卡驱动包含两个文件,分别为:sdio_sdcard.c和sdio_sdcard.h,SD卡的驱动涉及SD的通信协议,本章实验配套实验例程的SD卡驱动已经根据SD协议实现了SD卡的初始化和读写等操作,对具体实现过程感兴趣的读者,可结合SD的协议查看本章实验配套实验例程的SD卡驱动。
46.2.2 实验应用代码
本章实验的应用代码,如下所示:

/*** @brief       打印SD卡相关信息* @param       无* @retval      无*/
static void show_sdcard_info(void)
{switch(g_sd_card_info.CardType){case SDIO_STD_CAPACITY_SD_CARD_V1_1:{printf("Card Type: SDSC V1.1\r\n");break;}case SDIO_STD_CAPACITY_SD_CARD_V2_0:{printf("Card Type: SDSC V2.0\r\n");break;}case SDIO_HIGH_CAPACITY_SD_CARD:{printf("Card Type: SDHC V2.0\r\n");break;}case SDIO_MULTIMEDIA_CARD:{printf("Card Type: MMC Card\r\n");break;}}printf("Card ManufacturerID: %d\r\n", g_sd_card_info.SD_cid.ManufacturerID);printf("Card RCA: %d\r\n", g_sd_card_info.RCA);
printf("Card Capacity: %d MB\r\n", 
(uint32_t)(g_sd_card_info.CardCapacity >> 20));printf("Card BlockSize: %d\r\n\r\n", g_sd_card_info.CardBlockSize);
}int main(void)
{uint8_t t = 0;uint8_t key;uint8_t *buf;SD_ERROR_T error;uint32_t i;NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4);  /* 设置中断优先级分组为组4 */sys_apm32_clock_init(15);                         /* 配置系统时钟 */delay_init(120);                                  /* 初始化延时功能 */usart_init(115200);                               /* 初始化串口 */usmart_dev.init(120);                             /* 初始化USMART */led_init();                                       /* 初始化LED */key_init();                                       /* 初始化按键 */lcd_init();                                       /* 初始化LCD */my_mem_init(SRAMIN);                              /* 初始化内部SRAM内存池 */lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);lcd_show_string(30, 70, 200, 16, 16, "SD TEST", RED);lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);lcd_show_string(30, 110, 200, 16, 16, "KEY0:Read Sector 0", RED);while (sd_init() != SD_OK)                                                  /* 初始化SD卡 */{lcd_show_string(30, 150, 200, 16, 16, "SD Card Error!", RED);delay_ms(500);lcd_show_string(30, 150, 200, 16, 16, "Please Check! ", RED);delay_ms(500);LED0_TOGGLE();}show_sdcard_info();                               /* 打印SD卡相关信息 */lcd_show_string(30, 150, 200, 16, 16, "SD Card OK    ", BLUE);lcd_show_string(30, 170, 200, 16, 16, "SD Card Size:     MB", BLUE);
lcd_show_num(30+13*8, 170, g_sd_card_info.CardCapacity >> 20, 5, 16, BLUE);while (1){t++;key = key_scan(0);switch (key){case KEY0_PRES:{buf = (uint8_t *)mymalloc(SRAMIN, 512);/* 申请内存 */error = sd_read_disk(buf, 0, 1);       /* 读SD卡 */
/* 读取成功,显示读取到的数据 */if (error == SD_OK)                  {lcd_show_string(30, 190, 200, 16, 16, 
"USART1 Sending Data...", BLUE);printf("Sector 0 Data:\r\n");for (i=0; i<512; i++){printf("%d ", buf[i]);}printf("\r\nRead Done!\r\n");lcd_show_string(30, 190, 200, 16, 16, 
"USART1 Sent Data Done!", BLUE);}else{printf("Error: %d\r\n", error);}myfree(SRAMIN, buf);                   /* 释放内存 */break;}default:{break;}}if (t == 20){LED0_TOGGLE();t = 0;}delay_ms(10);}
}

可以看到,本实验的应用代码中,通过初始化SD卡判断与SD卡的连接是否有误,SD卡初始化成功后便通过函数show_sdcard_info()打印SD卡的卡类型、容量等信息,同时也在LCD上显示了SD的容量信息,随后便不断地检测按键输入,若检测到KEY0按键被按下,则读取SD卡扇区0的512字节数据并通过串口输出至串口调试助手。
46.3 下载验证
在完成编译和烧录操作后,将准备好的SD卡插入开发板板载的SD卡卡座(请确保SD卡中没有有用的数据,或已做好备份),接着便能在LCD上看到SD卡的容量,以及串口调试助手显示了SD卡的卡类型、容量等信息,接着可以按下KEY0按键读取SD卡扇区0的512字节数据,可以通过串口调试助手查看读出的512字节数据,同时也可通过USMART对SD卡进行读写操作。

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

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

相关文章

异步编程,到底有什么用?

关键词&#xff1a;高性能、架构设计、异步思想、场景落地 文章导读 场景切入 先来看一个日常生活快递寄件场景&#xff0c;从寄件人&#xff08;寄件&#xff09;到收件人&#xff08;收件&#xff09;&#xff0c;全流程如下 当你准备寄送一个包裹时&#xff0c;通常你可以…

Qt|制作简单的不规则窗体

通常我们用到的对话框基本上都是规则的&#xff0c;在有些特殊情况下&#xff0c;也会使用到不规则窗口&#xff0c;那么该如何实现不规则窗体呢&#xff1f; 在MFC框架下很难实现&#xff0c;应该说是难的都想放弃&#xff0c;但是&#xff0c;Qt框架下提供了一个叫做setMask…

Python+PyQt5+C Hw信息检测

UI主界面&#xff1a; C源代码&#xff1a; /* I/O port access* Copyright (C) 2009 Red Hat Inc.** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License as published by* the Free Software Fo…

kingbase控制文件重建

背景&#xff1a; 测试版本&#xff1a;V008R006C005B0023 sys_control文件在数据目录的global下 若sys_control文件损坏或被删&#xff0c;会导致库无法启动 处理方式&#xff1a; 所在目录为数据目录 1、尝试dryrun touch global/sys_control sys_resetwal -l 00000001…

用Audio2Face导出Unity面部动画

开始之前说句话&#xff0c;新年前最后一篇文章了 一定别轻易保存任何内容&#xff0c;尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上&#xff0c;还要经历特殊Blender&#xff0c;自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

2024年第九届信号与图像处理国际会议(ICSIP 2024)

2024第九届信号与图像处理国际会议&#xff08;ICSIP 2024&#xff09;将于2024年7月12-14日在中国南京召开。ICSIP每年召开一次&#xff0c;在过去的七年中吸引了1200多名与会者&#xff0c;是展示信号和图像处理领域最新进展的领先国际会议之一。本次将汇集来自亚太国家、北美…

#10外部网页跳转vue3+SpringMVC解码GBK编码的参数

目录 1、背景 2、失败尝试之iconv-lite 2.1、安装和使用 2.2、遇到的问题 2.3、解决方案(vite-plugin-node-polyfills) 2.4、测试 3、成功尝试 3.1、前端参数读取方式 3.2、后端解码 1、背景 外部jsp页面中编码方式为GBK&#xff0c;跳转到vue页面时如果使用decodeURI…

C#,入门教程(33)——万能的数据接送者json

上一篇&#xff1a; C#&#xff0c;入门教程(32)——程序运行时的调试技巧与逻辑错误探针技术与源代码https://blog.csdn.net/beijinghorn/article/details/126014885 作为21世纪的编程者&#xff0c;无论你是前端还是后端&#xff0c;都逃不过“json”。 一、什么是 json&…

中耳分析时,鼓室图有哪几种分型?

做中耳分析时&#xff0c;鼓室图有哪几种分型&#xff1f; 目前&#xff0c;临床上最常用的鼓室图分型法是由Jerger提出的&#xff0c;主要分为A型、As型、Ad型、B型和C型五种类型。 A型 正常成人的鼓室图峰补偿静态声导纳值为0.3&#xff5e;1.6 mmho&#xff08;Silman等报…

【Linux】环境基础开发工具的使用之gcc详解(二)

前言&#xff1a;上一篇文章中我们讲解了Linux下的vim和yum的工具的使用&#xff0c;今天我们将在上一次的基础上进一步的讲解开放工具的时候。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:Linux的深度刨析 &#x1f448; &#x1f4a…

Jmeter学习系列之五:基础线程组(Thread Group)

前言 线程组是一系列线程的集合,每一个线程代表着一个正在使用应用程序的用户。在 jmeter 中,每个线程意味着模拟一个真实用户向服务器发起请求。 在 jmeter 中,线程组组件运行用户设置线程数量、初始化方式等等配置。 例如,如果你设置线程数为 100,那么 jmeter 将创建…

【python接口自动化】- PyMySQL数据连接

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…