板上有一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和热插拔引脚初始化之后,需要初始化FATFS fatfs的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上面,可以看到确实执行了文件的创建与写入操作
|