(资料图片)
/**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层的接口,一般出问题的地方就是接口部分。五 总结最近调试这部分,才发现很多不足之处。初始化失败该怎么分析?无法读写该怎么着手呢?通过这次的调试,算是有了一定的思路了吧。