使用STM32CubeIDE测试SD卡问题总结

文章讨论了在STM32F407ZGT6上使用SDIO时遇到的挂载问题,特别是检查函数返回错误4。解决了配置错误(必须启用DMA)以及未正确使用DMA传输的问题,通过修改初始化函数和调整DMA设置,最终实现读写成功。
摘要由CSDN通过智能技术生成

测试环境:stm32f407zgt6

出现的问题:

  1. ff.c 文件第3050行 FMT = check_fs(fs, bsect); 返回 4
  2. 可以读,但写错误。

测试过程:

其他导致挂载失败的原因:

  • 未修改 void MX_SDIO_SD_Init(void) 函数,参考野火例程,修改后如下:
void MX_SDIO_SD_Init(void)
{

  /* USER CODE BEGIN SDIO_Init 0 */

  /* USER CODE END SDIO_Init 0 */

  /* USER CODE BEGIN SDIO_Init 1 */

  /* USER CODE END SDIO_Init 1 */
  hsd.Instance = SDIO;
  hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
  hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
  hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
  hsd.Init.BusWide = SDIO_BUS_WIDE_1B;
  hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE;
  hsd.Init.ClockDiv = 4;
  /* USER CODE BEGIN SDIO_Init 2 */

  /* USER CODE END SDIO_Init 2 */

}

野火HAL库例程 ClockDiv 等于 1就能成功,我这里至少要大于等于3才能成功

  • 问题2:

    虽然在cube中开启的SDIO DMA,不过在工程中并没用到,在 DRESULT SD_write(BYTE lun, const BYTE *buff, DWORD sector, UINT count) 函数中,用的还是BSP_SD_WriteBlocks,没有用到DMA传输,更改为BSP_SD_WriteBlocks_DMA,再次进行测试,读写成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值