OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 616|回复: 0

《M144Z-M3最小系统板使用指南——STM32F103版》第四十六章 SD卡实验

[复制链接]

1117

主题

1128

帖子

2

精华

超级版主

Rank: 8Rank: 8

积分
4667
金钱
4667
注册时间
2019-5-8
在线时间
1224 小时
发表于 2024-5-16 11:02:37 | 显示全部楼层 |阅读模式
本帖最后由 正点原子运营 于 2024-5-15 14:28 编辑

第四十六章 SD卡实验
1)实验平台:正点原子 M144Z-M3 STM32F103最小系统板

2) 章节摘自【正点原子】M144Z-M3最小系统板使用指南——STM32F103版

3)购买链接:https://detail.tmall.com/item.htm?&id=609293737870

4)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boar ... _mini_sysboard.html

5)正点原子官方B站:https://space.bilibili.com/394620890

6)正点原子STM32技术交流QQ群:725095144

155537c2odj87vz1z9vj6l.jpg

155537nfqovl2gg9faaol9.png

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

46.1 硬件设计
46.1.1 例程功能
1. LCD上显示SD卡信息
2. 按下WKUP按键可读取SD卡第0块的数据并通过串口显示
3. LED0闪烁,提示程序正在运行

46.1.2 硬件资源
1. LED
       LED0 - PB5
2. 正点原子2.8/3.5/4.3/7/10寸TFTLCD模块
3. 按键
       WKUP - PA0
4. USART1
       USART1_TX - PA9
       USART1_RX - PA10
5. SD
       SDIO_D0 - PC8
       SDIO_D1 - PC9
       SDIO_D2 - PC10
       SDIO_D3 - PC11
       SDIO_SCK - PC12
       SDIO_CMD - PD2

46.1.3 原理图
本章实验使用SDIO接口与SD卡进行连接,开发板板载了一个Micro SD卡座,用于连接SD卡,SD卡与MCU的连接原理图,如下图所示:                             
3.png
图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 实验应用代码
本章实验的应用代码,如下所示:
  1. /**
  2. *@brief   显示SD卡信息
  3. *@param   无
  4. *@retval  无
  5. */
  6. static void show_sd_info(void)
  7. {
  8.    HAL_SD_CardCIDTypeDef sd_card_cid = {0};
  9.    
  10.    HAL_SD_GetCardCID(&g_sd_handle, &sd_card_cid);
  11.    
  12.    printf( "Card Type: %s\r\n",
  13.              (g_sd_card_info.CardType == CARD_SDSC) ?
  14.              ((g_sd_card_info.CardVersion == CARD_V1_X) ? ("SDSC V1") :
  15.              ((g_sd_card_info.CardVersion == CARD_V1_X) ? ("SDSC V2") :
  16.              (""))) :
  17.              ((g_sd_card_info.CardType == CARD_SDHC_SDXC) ? ("SDHC") :
  18.              ((g_sd_card_info.CardType == CARD_SECURED) ? ("SECURE") :
  19.              (""))));
  20.    printf("CardManufacturerID:%d\r\n", sd_card_cid.ManufacturerID);
  21.    printf("CardRCA:%d\r\n", g_sd_card_info.RelCardAdd);
  22.    printf("LogBlockNbr:%d\r\n",g_sd_card_info.LogBlockNbr);
  23.    printf("LogBlockSize:%d\r\n",g_sd_card_info.LogBlockSize);
  24.    printf("CardCapacity:%d MB\r\n",
  25.              (uint32_t)(((uint64_t)g_sd_card_info.LogBlockNbr *
  26.    g_sd_card_info.LogBlockSize) >> 20));
  27.    printf("CardBlockSize:%d\r\n\r\n", g_sd_card_info.BlockSize);
  28.    
  29.    lcd_show_string(30, 146, 200, 16, 16, "SD CardSize:     MB", BLUE);
  30.    lcd_show_num(30 + 13 * 8, 146,
  31.                  (uint32_t)(((uint64_t)g_sd_card_info.LogBlockNbr *
  32.                              g_sd_card_info.LogBlockSize) >> 20), 5, 16, BLUE);
  33. }

  34. static void sd_read_test(void)
  35. {
  36.     uint8_t *buf;
  37.     uint16_t index;
  38.    
  39.     buf= (uint8_t *)mymalloc(SRAMIN, g_sd_card_info.BlockSize);
  40.     if (buf == NULL)
  41.     {
  42.          return;
  43.     }
  44.    
  45.     /* 读取并打印SD卡第0个块的数据 */
  46.     if (sd_read_disk(buf, 0, 1) == 0)
  47.     {
  48.          lcd_show_string(30, 170, 200, 16, 16, "USART1Sending Data...", BLUE);
  49.          printf("Block 0 Data:\r\n");
  50.          for (index=0; index<g_sd_card_info.BlockSize; index++)
  51.          {
  52.              printf("%02X ", buf[index]);
  53.          }
  54.          printf("\r\nData End\r\n");
  55.          lcd_show_string(30, 170, 200, 16, 16, "USART1 SendData Over!", BLUE);
  56.     }
  57.     else
  58.     {
  59.          printf("SD read Failure!\r\n");
  60.          lcd_show_string(30, 170, 200, 16, 16, "SD readFailure!      ", BLUE);
  61.     }
  62.    
  63.    myfree(SRAMIN, buf);
  64. }

  65. int main(void)
  66. {
  67.     uint8_t t = 0;
  68.     uint8_t key;
  69.    
  70.    HAL_Init();                         /* 初始化HAL库 */
  71.    sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
  72.    delay_init(72);                     /* 初始化延时 */
  73.    usart_init(115200);                 /* 初始化串口 */
  74.    led_init();                         /* 初始化LED */
  75.    key_init();                         /* 初始化按键 */
  76.    lcd_init();                         /* 初始化LCD */
  77.    my_mem_init(SRAMIN);                /* 初始化内部SRAM内存池 */
  78.    
  79.    lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
  80.    lcd_show_string(30, 70, 200, 16, 16, "SDTEST", RED);
  81.    lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
  82.    
  83.    lcd_show_string(30, 110, 200, 16, 16, "WKUP: ReadBlock 0", RED);
  84.    
  85.     while (sd_init() != 0)
  86.     {
  87.          lcd_show_string(30, 130, 200, 16, 16, "SD CardError!", RED);
  88.          delay_ms(500);
  89.          lcd_show_string(30, 130, 200, 16, 16, "Please Check!", RED);
  90.          delay_ms(500);
  91.          LED0_TOGGLE();
  92.     }
  93.    
  94.    lcd_show_string(30, 130, 200, 16, 16, "SD CardOK    ", BLUE);
  95.    
  96.     /* 显示SD卡信息 */
  97.    show_sd_info();
  98.    
  99.     while (1)
  100.     {
  101.          key = key_scan(0);
  102.          if (key == WKUP_PRES)
  103.          {
  104.              /* 进行SD卡读测试 */
  105.              sd_read_test();
  106.          }
  107.          
  108.          if (++t == 20)
  109.          {
  110.              t = 0;
  111.              LED0_TOGGLE();
  112.          }
  113.          
  114.          delay_ms(10);
  115.     }
  116. }
复制代码
可以看到,本实验的应用代码中,通过初始化SD卡判断与SD卡的连接是否有误,SD卡初始化成功后便通过函数show_sd_info()打印SD卡的卡类型、容量等信息,同时也在LCD上显示了SD的容量信息,随后便不断地检测按键输入,若检测到WKUP按键被按下,则读取SD卡扇区0的512字节数据并通过串口输出至串口调试助手。

46.3 下载验证
在完成编译和烧录操作后,将准备好的SD卡插入开发板板载的SD卡卡座(请确保SD卡中没有有用的数据,或已做好备份),接着便能在LCD上看到SD卡的容量,以及串口调试助手显示了SD卡的卡类型、容量等信息,接着可以按下WKUP按键读取SD卡扇区0的512字节数据,可以通过串口调试助手查看读出的512字节数据。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 19:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表