本帖最后由 正点原子运营 于 2024-5-15 14:28 编辑
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
本章将介绍使用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的连接原理图,如下图所示: 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_sd_info(void)
- {
- HAL_SD_CardCIDTypeDef sd_card_cid = {0};
-
- HAL_SD_GetCardCID(&g_sd_handle, &sd_card_cid);
-
- printf( "Card Type: %s\r\n",
- (g_sd_card_info.CardType == CARD_SDSC) ?
- ((g_sd_card_info.CardVersion == CARD_V1_X) ? ("SDSC V1") :
- ((g_sd_card_info.CardVersion == CARD_V1_X) ? ("SDSC V2") :
- (""))) :
- ((g_sd_card_info.CardType == CARD_SDHC_SDXC) ? ("SDHC") :
- ((g_sd_card_info.CardType == CARD_SECURED) ? ("SECURE") :
- (""))));
- printf("CardManufacturerID:%d\r\n", sd_card_cid.ManufacturerID);
- printf("CardRCA:%d\r\n", g_sd_card_info.RelCardAdd);
- printf("LogBlockNbr:%d\r\n",g_sd_card_info.LogBlockNbr);
- printf("LogBlockSize:%d\r\n",g_sd_card_info.LogBlockSize);
- printf("CardCapacity:%d MB\r\n",
- (uint32_t)(((uint64_t)g_sd_card_info.LogBlockNbr *
- g_sd_card_info.LogBlockSize) >> 20));
- printf("CardBlockSize:%d\r\n\r\n", g_sd_card_info.BlockSize);
-
- lcd_show_string(30, 146, 200, 16, 16, "SD CardSize: MB", BLUE);
- lcd_show_num(30 + 13 * 8, 146,
- (uint32_t)(((uint64_t)g_sd_card_info.LogBlockNbr *
- g_sd_card_info.LogBlockSize) >> 20), 5, 16, BLUE);
- }
- static void sd_read_test(void)
- {
- uint8_t *buf;
- uint16_t index;
-
- buf= (uint8_t *)mymalloc(SRAMIN, g_sd_card_info.BlockSize);
- if (buf == NULL)
- {
- return;
- }
-
- /* 读取并打印SD卡第0个块的数据 */
- if (sd_read_disk(buf, 0, 1) == 0)
- {
- lcd_show_string(30, 170, 200, 16, 16, "USART1Sending Data...", BLUE);
- printf("Block 0 Data:\r\n");
- for (index=0; index<g_sd_card_info.BlockSize; index++)
- {
- printf("%02X ", buf[index]);
- }
- printf("\r\nData End\r\n");
- lcd_show_string(30, 170, 200, 16, 16, "USART1 SendData Over!", BLUE);
- }
- else
- {
- printf("SD read Failure!\r\n");
- lcd_show_string(30, 170, 200, 16, 16, "SD readFailure! ", BLUE);
- }
-
- myfree(SRAMIN, buf);
- }
- int main(void)
- {
- uint8_t t = 0;
- uint8_t key;
-
- HAL_Init(); /* 初始化HAL库 */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 配置时钟,72MHz */
- delay_init(72); /* 初始化延时 */
- usart_init(115200); /* 初始化串口 */
- led_init(); /* 初始化LED */
- key_init(); /* 初始化按键 */
- lcd_init(); /* 初始化LCD */
- my_mem_init(SRAMIN); /* 初始化内部SRAM内存池 */
-
- lcd_show_string(30, 50, 200, 16, 16, "STM32", RED);
- lcd_show_string(30, 70, 200, 16, 16, "SDTEST", RED);
- lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
-
- lcd_show_string(30, 110, 200, 16, 16, "WKUP: ReadBlock 0", RED);
-
- while (sd_init() != 0)
- {
- lcd_show_string(30, 130, 200, 16, 16, "SD CardError!", RED);
- delay_ms(500);
- lcd_show_string(30, 130, 200, 16, 16, "Please Check!", RED);
- delay_ms(500);
- LED0_TOGGLE();
- }
-
- lcd_show_string(30, 130, 200, 16, 16, "SD CardOK ", BLUE);
-
- /* 显示SD卡信息 */
- show_sd_info();
-
- while (1)
- {
- key = key_scan(0);
- if (key == WKUP_PRES)
- {
- /* 进行SD卡读测试 */
- sd_read_test();
- }
-
- if (++t == 20)
- {
- t = 0;
- LED0_TOGGLE();
- }
-
- delay_ms(10);
- }
- }
复制代码可以看到,本实验的应用代码中,通过初始化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字节数据。 |