OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3941|回复: 4

F407 HAL USB SD 速度

[复制链接]

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2014-9-27
在线时间
54 小时
发表于 2018-7-16 11:20:00 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 第109位梁山好汗 于 2018-7-16 13:51 编辑

测试基于CubeMX生成的模板,想把USB数据转存到SD,可是将USB和SD连接到一起的速度太太低了。
这是我做的一些测试
测试条件:
STM32 F407 , hal, SDIO(24M), DMA
闪迪 16G Class10
       USBHS(USB3300)(MSC)
       WIN10,USB2.0/USB3.0

测试 一:
SD卡,多扇区连续访问(200k)
       写:6.9MB/S
       读:10.85MB/S

测试 二:
       USB
       写:10.6MB/S
       读:14.4MB/S

测试 三:USB + SD
       写:300KB/S
       读:700KB/S


调试时,我把
STORAGE_Read_HS(uint8_t lun, uint8_t *buf,uint32_t blk_addr, uint16_t blk_len)
STORAGE_Write_HS(uint8_t lun, uint8_t *buf,uint32_t blk_addr, uint16_t blk_len)
blk_len参数仿真查看,发现每次数据通讯都为 1 扇区,数据长度(512字节),怀疑是此处的时间开销,没有真正发挥 SDIO,DMA连续数据访问的优势。大家有遇到这种情况的吗?


int8_t STORAGE_Init_HS(uint8_t lun)
{
  /* USER CODE BEGIN 9 */
  return (USBD_OK);
  /* USER CODE END 9 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  block_num: .
  * @param  block_size: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
{
  /* USER CODE BEGIN 10 */

    HAL_SD_CardInfoTypeDef pCardInfo;

    HAL_SD_GetCardInfo(&hsd, &pCardInfo);

    *block_num  = pCardInfo.LogBlockNbr;
    *block_size = pCardInfo.LogBlockSize;

    return (USBD_OK);
  /* USER CODE END 10 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsReady_HS(uint8_t lun)
{
  /* USER CODE BEGIN 11 */

  if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
    return (USBD_OK);
  else
    return (USBD_FAIL);

  /* USER CODE END 11 */
}

/**
  * @brief  .
  * @param  lun: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_IsWriteProtected_HS(uint8_t lun)
{
  /* USER CODE BEGIN 12 */
  return (USBD_OK);
  /* USER CODE END 12 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  buf: .
  * @param  blk_addr: .
  * @param  blk_len: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 13 */

    int8_t ret = USBD_FAIL;

    if( HAL_SD_ReadBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
    {
        ret = USBD_OK;
    }

    if( USBD_OK == ret )
    {
        while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};

        while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
    }

    return ret;

  /* USER CODE END 13 */
}

/**
  * @brief  .
  * @param  lun: .
  * @param  buf: .
  * @param  blk_addr: .
  * @param  blk_len: .
  * @retval USBD_OK if all operations are OK else USBD_FAIL
  */
int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 14 */

    int8_t ret = USBD_FAIL;

    if( HAL_SD_WriteBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
    {
        ret = USBD_OK;
    }

    if( USBD_OK == ret )
    {
        while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};

        while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
    }

    return ret;

  /* USER CODE END 14 */
}

/**
  * @brief  .
  * @param  None
  * @retval .
  */
int8_t STORAGE_GetMaxLun_HS(void)
{
  /* USER CODE BEGIN 15 */
  return (STORAGE_LUN_NBR - 1);
  /* USER CODE END 15 */
}




最佳答案

查看完整内容[请看2#楼]

工程配置修改: 测试环境: WIN10 USB2.0/USB3.0 闪迪 class10 sdio(24M) dma USBFS(usb3300) 读取速度:7.8~8.0MB 写入速度:4.5~6.0MB
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2014-9-27
在线时间
54 小时
 楼主| 发表于 2018-7-16 11:20:01 | 显示全部楼层
本帖最后由 第109位梁山好汗 于 2018-7-20 15:29 编辑

工程配置修改:
111.jpg

222.jpg

测试环境:
WIN10 USB2.0/USB3.0
闪迪 class10 sdio(24M) dma USBFS(usb3300)

读取速度:7.8~8.0MB
写入速度:4.5~6.0MB

444.jpg 333.jpg
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-17 01:50:28 | 显示全部楼层
我感觉你这速度不低了啊
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

7

帖子

0

精华

初级会员

Rank: 2

积分
170
金钱
170
注册时间
2014-9-27
在线时间
54 小时
 楼主| 发表于 2018-7-17 16:29:44 | 显示全部楼层
正点原子 发表于 2018-7-17 01:50
我感觉你这速度不低了啊

@正点原子
原子哥,300k,700k,这个速度已经是比较快的速度了嘛?
那 usb3300 就浪费了

我单独测试SD,USB 两个部分的速度是满足需求的,可是连接到一块,这个速度。。。

测试的时候,发现 电脑 usb 主机每次访问的数据都是 1 扇区,应该是这个有太多的时间开销,没有进行连续的扇区访问。

我们想做写2M,读5M以上的设备,还有可以优化的地方嘛,或者方案不好
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2018-7-18 01:58:32 | 显示全部楼层
第109位梁山好汗 发表于 2018-7-17 16:29
@正点原子
原子哥,300k,700k,这个速度已经是比较快的速度了嘛?
那 usb3300 就浪费了

哦,你还加了3300啊。我以为你用USB FS呢。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-1 02:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表