admin管理员组

文章数量:1545267

资源链接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,改天再试)

本文标签: STM32CubeMXHALTF