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

编程知识 更新时间:2023-05-02 17:47:04

资源链接https://download.csdn/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,改天再试)

更多推荐

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

本文发布于:2023-04-27 17:52:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/67c82d1b2233524e531e9452856120f7.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:STM32CUBEMX   HAL   TF

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 107345文章数
  • 27080阅读数
  • 0评论数