【举报再看养成习惯,噢 不对,点赞再看养成习惯。感谢支持】
本次实验内容:读取STM32开发板上的SD卡中的内容。
实验平台:野火STM32 F103指南者开发板
软件:STM32CubeMX 6.0.1版本、Keil Ver:5.25.2.0
=============================分割线==================================
要使用SD卡,就要用到SDIO适配器:那么先来看两个时钟的配置(下图中有两处SDIO时钟)
SDIO(上面的72M的):又叫SDIO_CLK,主要负责数据通道、命令通道、控制单元,和SD卡通信。
下面的(HCLK/2)的SDIO(36M的):主要负责适配器的寄存器和FIFO缓存,和AHB总线连接。
所以我们配置SD卡的时钟时使用的是72M的那个,SDIO_CLK。
分频的配置我参考了野火的文档,分频数配置为178。但是后来实际测试不按照这个也行....可能是卡的问题吧。
=============================分割线==================================
废话少说直接上图:看CubeMX中如何配置SD卡。
下面的分频,本来应该是178的,后来我设置成5测试一下会不会出问题。
FATFS文件系统的配置之上上面两点,其他的默认即可。
================================分割线=================================
生成代码:
代码生成后,在main函数的初始化中加入下面程序来测试是否读取成功:
int SDTest(void){
// 挂载文件系统
retSD = f_mount(&SDFatFS, SDPath, 1);
if(retSD)
{
SEGGER_RTT_printf(0,"mount error : %d \r\n",retSD);
return -1;
}
else
{
SEGGER_RTT_printf(0,"mount sucess!!! \r\n");
}
HAL_SD_CardCIDTypeDef CID;
HAL_StatusTypeDef s1 = HAL_SD_GetCardCID(&hsd, &CID);
HAL_SD_CardCSDTypeDef CSD;
HAL_StatusTypeDef s2 = HAL_SD_GetCardCSD(&hsd, &CSD);
HAL_SD_CardStatusTypeDef status;
HAL_StatusTypeDef s3 = HAL_SD_GetCardStatus(&hsd, &status);
HAL_SD_CardInfoTypeDef cardInfo;
HAL_StatusTypeDef s4 = HAL_SD_GetCardInfo(&hsd, &cardInfo);
uint32_t fCardSize = 1.0*cardInfo.BlockNbr*cardInfo.BlockSize/1024/1024;
SEGGER_RTT_printf(0,"BlockNum=%d BlockSize=%d \r\n",cardInfo.BlockNbr,cardInfo.BlockSize);
SEGGER_RTT_printf(0,"Card Size:%d M\r\n", fCardSize);
return 1;
}
打印结果:卡大小为128M。基本符合。
我看网上很多说还要添加两句话,
但是我看了一下,当前版本的CubeMX不需要调用这里,CubeMX生成的初始化程序中已经帮我们调用过这两个函数了,是在MX_FATFS_Init();函数中实现的。
参考文章:
- https://blog.csdn.net/chenjk10/article/details/105205401
- https://blog.csdn.net/elikang/article/details/80736726?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-3.control
- https://www.icxbk.com/ask/detail/23641.html