硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3940|回复: 3
收起左侧

[有问必答] STM32F407,USB(3300,MSC),SDIO,DMA,读写卡速度

[复制链接]

1

主题

0

回帖

5

积分

新手上路

积分
5
发表于 2018-7-18 09:17:04 | 显示全部楼层 |阅读模式
测试基于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连续数据访问的优势。大家有遇到这种情况的吗?
  1. <div class="blockcode"><blockquote>/**
  2.   * @brief  .
  3.   * @param  lun: .
  4.   * @retval USBD_OK if all operations are OK else USBD_FAIL
  5.   */
  6. int8_t STORAGE_Init_HS(uint8_t lun)
  7. {
  8.   /* USER CODE BEGIN 9 */
  9.   return (USBD_OK);
  10.   /* USER CODE END 9 */
  11. }

  12. /**
  13.   * @brief  .
  14.   * @param  lun: .
  15.   * @param  block_num: .
  16.   * @param  block_size: .
  17.   * @retval USBD_OK if all operations are OK else USBD_FAIL
  18.   */
  19. int8_t STORAGE_GetCapacity_HS(uint8_t lun, uint32_t *block_num, uint16_t *block_size)
  20. {
  21.   /* USER CODE BEGIN 10 */
  22.    
  23.     HAL_SD_CardInfoTypeDef pCardInfo;
  24.    
  25.     HAL_SD_GetCardInfo(&hsd, &pCardInfo);
  26.    
  27.     *block_num  = pCardInfo.LogBlockNbr;
  28.     *block_size = pCardInfo.LogBlockSize;
  29.    
  30.     return (USBD_OK);
  31.   /* USER CODE END 10 */
  32. }

  33. /**
  34.   * @brief  .
  35.   * @param  lun: .
  36.   * @retval USBD_OK if all operations are OK else USBD_FAIL
  37.   */
  38. int8_t STORAGE_IsReady_HS(uint8_t lun)
  39. {
  40.   /* USER CODE BEGIN 11 */

  41.   if(HAL_SD_GetCardState(&hsd) == HAL_SD_CARD_TRANSFER)
  42.     return (USBD_OK);
  43.   else
  44.     return (USBD_FAIL);

  45.   /* USER CODE END 11 */
  46. }

  47. /**
  48.   * @brief  .
  49.   * @param  lun: .
  50.   * @retval USBD_OK if all operations are OK else USBD_FAIL
  51.   */
  52. int8_t STORAGE_IsWriteProtected_HS(uint8_t lun)
  53. {
  54.   /* USER CODE BEGIN 12 */
  55.   return (USBD_OK);
  56.   /* USER CODE END 12 */
  57. }

  58. /**
  59.   * @brief  .
  60.   * @param  lun: .
  61.   * @param  buf: .
  62.   * @param  blk_addr: .
  63.   * @param  blk_len: .
  64.   * @retval USBD_OK if all operations are OK else USBD_FAIL
  65.   */
  66. int8_t STORAGE_Read_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
  67. {
  68.   /* USER CODE BEGIN 13 */
  69.    
  70.     int8_t ret = USBD_FAIL;

  71.     if( HAL_SD_ReadBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
  72.     {
  73.         ret = USBD_OK;
  74.     }
  75.    
  76.     if( USBD_OK == ret )
  77.     {
  78.         while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};
  79.         
  80.         while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
  81.     }
  82.    
  83.     return ret;
  84.   
  85.   /* USER CODE END 13 */
  86. }

  87. /**
  88.   * @brief  .
  89.   * @param  lun: .
  90.   * @param  buf: .
  91.   * @param  blk_addr: .
  92.   * @param  blk_len: .
  93.   * @retval USBD_OK if all operations are OK else USBD_FAIL
  94.   */
  95. int8_t STORAGE_Write_HS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
  96. {
  97.   /* USER CODE BEGIN 14 */
  98.    
  99.     int8_t ret = USBD_FAIL;

  100.     if( HAL_SD_WriteBlocks_DMA(&hsd, buf, blk_addr, blk_len) == HAL_OK )
  101.     {
  102.         ret = USBD_OK;
  103.     }
  104.    
  105.     if( USBD_OK == ret )
  106.     {
  107.         while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};
  108.         
  109.         while( HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER ){};
  110.     }

  111.     return ret;
  112.    
  113.   /* USER CODE END 14 */
  114. }

  115. /**
  116.   * @brief  .
  117.   * @param  None
  118.   * @retval .
  119.   */
  120. int8_t STORAGE_GetMaxLun_HS(void)
  121. {
  122.   /* USER CODE BEGIN 15 */
  123.   return (STORAGE_LUN_NBR - 1);
  124.   /* USER CODE END 15 */
  125. }
复制代码


回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2018-7-18 09:30:03 | 显示全部楼层
SDIO接口速度是瓶颈,你当前的是25MHz,4线方式,极限速度就12.5MB/S,实际也就10MB左右。
回复

使用道具 举报

0

主题

36

回帖

36

积分

新手上路

积分
36
发表于 2018-7-18 20:23:01 | 显示全部楼层
单纯的USB读写速度看起来也比较低,USB2.0 MSC 64k读写性能应该都能达到40MB/s吧,当然用HAL库对速度会有一些影响
回复

使用道具 举报

6

主题

33

回帖

51

积分

初级会员

积分
51
发表于 2018-7-28 14:25:09 | 显示全部楼层
楼主方便分享一下代码吗?谢谢了
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-8-17 20:49 , Processed in 0.036766 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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