最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

stm32读写sd卡代码解析和调试总结

来源:博客园


(资料图片)

一 前言做程序员真是来不得半点偷懒,假如你对经常使用的代码不熟悉,早晚会让你付出沉重的代价。像认识自己的灵魂一样认识每行用到的代码,这才是一个合格的程序员,才不至于在出现问题的时候出现慌乱。二 stm32读写sd卡stm32读写sd卡的这部分代码量还是非常大的。它包含了两大部分,一部分是文件系统,另外一部分是底层的接口。笔者认为,hal层的代码相对简单一些,文件系统的代码逻辑比较复杂。想要在这里面定位一些问题,的确要对代码相当了解的。这部分不花点苦功夫是不行的。三 hal层代码解析hal层的代码重要关注两点,一个是接口的配置,代码如下,接口配置这块的确不复杂,可这块经常会出问题。一个容易出问题地方是接口能否被复用,另外一个容易出问题的地方是硬件的接口根本不通。这两点一定要在使用前做一些验证。
/**SDMMC1 GPIO Configuration    PC8     ------> SDMMC1_D0    PC9     ------> SDMMC1_D1    PC10     ------> SDMMC1_D2    PC11     ------> SDMMC1_D3    PC12     ------> SDMMC1_CK    PD2     ------> SDMMC1_CMD    */    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11                          |GPIO_PIN_12;    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;    GPIO_InitStruct.Pull = GPIO_PULLUP;    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;    GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);    GPIO_InitStruct.Pin = GPIO_PIN_2;    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;    GPIO_InitStruct.Pull = GPIO_PULLUP;    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;    GPIO_InitStruct.Alternate = GPIO_AF12_SDMMC1;    HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);

另外一个是DMA 的使用,sdio一般要用dma的,否则就凸显不出来速率了。这里的DMA链接一定要不能出错,注意的就是dma链接不能失败。

/* SDMMC1_TX Init */    hdma_sdmmc1_tx.Instance = DMA2_Channel5;    hdma_sdmmc1_tx.Init.Request = DMA_REQUEST_7;    hdma_sdmmc1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;    hdma_sdmmc1_tx.Init.PeriphInc = DMA_PINC_DISABLE;    hdma_sdmmc1_tx.Init.MemInc = DMA_MINC_ENABLE;    hdma_sdmmc1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;    hdma_sdmmc1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;    hdma_sdmmc1_tx.Init.Mode = DMA_NORMAL;    hdma_sdmmc1_tx.Init.Priority = DMA_PRIORITY_LOW;    if (HAL_DMA_Init(&hdma_sdmmc1_tx) != HAL_OK)    {      Error_Handler();    }    __HAL_LINKDMA(sdHandle,hdmatx,hdma_sdmmc1_tx);
四 文件系统文件系统是一个非常庞大的,不是一篇小文章能分析的透彻的。这里留在后面做一个总体的细致的分析吧。这里之给出容易出错的点,以及定位思路。这里是纯软件的东西,最笨的办法就是添加打印看返回值。比较聪明的办法就是先找和hal层的接口,一般出问题的地方就是接口部分。五 总结最近调试这部分,才发现很多不足之处。初始化失败该怎么分析?无法读写该怎么着手呢?通过这次的调试,算是有了一定的思路了吧。

关键词: 文件系统 办法就是 另外一个