chen000000009 发表于 2024-10-12 09:27

【STM32H7S78-DK测评】sdmmc外接SD卡并移植fatfs

板上有一SDMMC接口,此接口可以外接SD卡或者EMMC。说起SD卡,以前用STM32的时候,很多时候都是用SPI来接的,这种SDMMC接口以前只会出现在高端处理器上面,比如imx6这类SOC,现在MCU的外设也越来越强大了。 首先看原理图,sd卡槽的接线如下程序里面使用MX_SDMMC1_SD_Init函数配置SDMMC接口,实现如下这里面主要看hsd1.Init.ClockEdge参数的配置,这个值一般选择SDMMC_CLOCK_EDGE_FALLING 这个HAL_SD_Init会调用HAL_SD_MspInit,这里面实现时钟和引脚初始化时钟需要打开SDMMC的,还有GPIOC GPIOD的然后就是要计算SDMMC的工作频率,默认使用200M这个SDMMC时钟是向下兼容的,可以驱动比200M更慢的sd卡,但是最大只能到200M然后执行强制复位__HAL_RCC_SDMMC1_FORCE_RESET__HAL_RCC_SDMMC1_RELEASE_RESET如果SDMMC控制器挂死了,需要用这两个函数来使其恢复正常 如果外接的sd卡需要支持热插拔功能,则还需要配置热插拔引脚,从原理图上面可以看到热插拔引脚是PM14 这个就是用的普通GPIO中断来检测热插拔,中断处理函数里面会使用GPIO回调, 另外SD的SDMMC库似乎有个BUG,这个SDMMC的初始化函数,如果没有插SD卡,会卡住。所以使用SDMMC初始化函数时必须上电插着SD卡 完成SDMMC和热插拔引脚初始化之后,需要初始化FATFSfatfs的hardware相关api实现在sd_diskio.c里面,就是以下5个函数ST的SDK已经实现了,主要就是通过SDMMC来发送命令和数据。 完成这些初始化之后,就需要在main函数里面循环调用MX_FATFS_Process,这个函数会进行相关读写操作,实现如下这里的功能就是,如果识别到SD卡,则尝试挂在fat,挂载不上则执行mkfs操作挂载之后进入APPLICATION_RUNNING状态,执行FS_FileOperations操作,此函数实现如下主要功能是创建一个名为STM32.TXT的文件,并向其写入一串内容 另外这个MX_FATFS_Process,在卡被拔出后,会执行umount操作,这个卡被拔的检测实现在SD检测GPIO中断回调中完成,实现如下 下面来验证一下,编译此程序,并且插一个SD卡在卡槽里面,上电,烧录后运行等待个几秒,然后拔出sd卡,放到PC上面,可以看到确实执行了文件的创建与写入操作

Stahan 发表于 2024-10-13 19:58

还只做过spi的
页: [1]
查看完整版本: 【STM32H7S78-DK测评】sdmmc外接SD卡并移植fatfs