使用STM32CUBEMX 新HAL库TF卡模拟U盘不能格式化问题

资源链接https://download.csdn.net/download/ffmydream/19061557

单片机型号F767,CUBEMX版本V5.01,HAL库版本1.14.0,开发软件True Studio 

不得不说,基础很重要,按照网上之前的教程,照葫芦画瓢,但是新的HAL已经改动了,陆陆续续调了一个星期,WIN7下U盘盘符是有了,但是始终不能格式化,用这个板子测试CDC和HID都没有问题,一直静不下心来阅读USB协议和SD卡的相关协议,后来还是在论坛找到了原因。
其实把usbd_storage_if.c里HAL_SD_ReadBlocks和HAL_SD_WriteBlocks后续SD卡状态判断改下就行了,while(HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_READY ),之前一直以为卡就绪是HAL_SD_CARD_READY ,问题就出在这里,改成HAL_SD_CARD_TRANSFER就可以了。


int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */

      int8_t ret = -1;
      uint32_t timeout = 100000;

      HAL_SD_ReadBlocks(&hsd1, (uint32_t *)buf,  blk_addr, blk_len, 100000000);
      while(HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER )
      {
        if (timeout-- == 0)
        {
          return ret;
        }
      }
      ret = 0;
      return ret;
  /* USER CODE END 6 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 7 */
      int8_t ret = -1;
      uint32_t timeout = 100000;

      HAL_SD_WriteBlocks(&hsd1, (uint32_t *)buf,  blk_addr, blk_len, 100000000);
      while(HAL_SD_GetCardState(&hsd1) != HAL_SD_CARD_TRANSFER )
      {
        if (timeout-- == 0)
        {
          return ret;
        }
      }
      ret = 0;
      return ret;
  /* USER CODE END 7 */
}

没有使用DMA,速度有点慢。

 

使用DMA之后,速度明显提升(我用的是USB_FS,不是HS,改天再试)

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值