OpenEdv-开源电子网

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

STM32 读写SD卡的速度

[复制链接]

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
发表于 2012-8-11 14:20:43 | 显示全部楼层 |阅读模式
    请问论坛里面有没有做过SD看读写项目的。读和写的极限速度能达到多少呢?我之前在STM32F103的板子上面做过测试,写的速度能达到3.2M,读的速度没有测试。但是如果达到3.2M写的速度的时候,会有不稳定的情况出现,找不到原因。希望论坛高手指点。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

5

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2013-3-29
在线时间
5 小时
发表于 2013-4-8 09:14:35 | 显示全部楼层
楼主 我这个速度好慢呀 能不能把你的源码借我看看呀 楼主真厉害 写的速度那么快
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-4-8 10:11:38 | 显示全部楼层
回复【楼主位】Sya_inn:
---------------------------------
3.2M
我见过的最快的速度了,楼主怎么做到的?
SDIO吧?SPI横竖都达不到3.2M的速度,SPI速度最高18M,最大速度就18/8=2.25M。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
 楼主| 发表于 2013-11-7 04:23:26 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
恩 对的。SDIO,后面发现5,6M的速度都可以做上去。之前碰到的问题基本上都是底层硬件驱动带来的,在这个上面可是浪费了不少时间,从文件系统一直把问题找下去,囧了。
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
 楼主| 发表于 2013-11-7 04:25:27 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
现在碰到个问题:
STM32 SPI采用DMA通道,开启DMA通道通道接收完成中断来接收数据。
但是如果前面数据没有及时处理,后面数据覆盖上去,就造成后面DMA通道的接收完成中断都进不去了。
不知道这个具体原因出在哪里,麻烦原子哥解答一下。
回复 支持 反对

使用道具 举报

7

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
107
金钱
107
注册时间
2013-9-16
在线时间
0 小时
发表于 2013-11-7 08:36:25 | 显示全部楼层
楼主共享下 sdio的程序吧?!
一天又过去了
回复 支持 反对

使用道具 举报

8

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
92
金钱
92
注册时间
2012-10-31
在线时间
0 小时
发表于 2013-11-7 08:59:21 | 显示全部楼层
哇     楼主的速度真快。。。。      我写的速度大概200Kb/s    读会快很多                 你的也是一样,写如果达到这么快,读会更快。。。。    楼主能分享一下,怎么做成这么快的吗
回复 支持 反对

使用道具 举报

7

主题

29

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2012-8-11
在线时间
0 小时
 楼主| 发表于 2013-11-10 05:23:43 | 显示全部楼层
回复【6楼】chinayeren:
---------------------------------
我用的就是开发板提供的例程。应该网上很容易能下载到的。采用的SDIO,所以速度会比较快
回复 支持 反对

使用道具 举报

3

主题

36

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1348
金钱
1348
注册时间
2013-1-11
在线时间
135 小时
发表于 2015-12-28 16:59:38 | 显示全部楼层
楼主是用的4还是8位模式?
回复 支持 反对

使用道具 举报

49

主题

341

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
5265
金钱
5265
注册时间
2012-8-25
在线时间
1025 小时
发表于 2015-12-28 17:22:47 | 显示全部楼层
不稳定正常,有sdio带crc检测的,我是如果crc出错要重写或者重读,这样可以很高脉冲写,也不能太高,否则一直出错。香浓定理可以保证让他按最高速度读写
回复 支持 反对

使用道具 举报

21

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2015-10-26
在线时间
32 小时
发表于 2015-12-28 17:46:32 | 显示全部楼层
请问怎么测速的啊
我本自由身,谁敢高高在上
回复 支持 反对

使用道具 举报

1

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2013-10-8
在线时间
24 小时
发表于 2015-12-28 22:19:06 | 显示全部楼层
SD2.0的SDIO模式不用cmd6改变模式的话理论最大12.5M/S,改为高速模式就25M/S,SD3.0的话理论最大208MHZ...
回复 支持 反对

使用道具 举报

19

主题

176

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1105
金钱
1105
注册时间
2015-10-27
在线时间
206 小时
发表于 2015-12-29 09:18:17 | 显示全部楼层
牛逼。我407的板子,SDHC卡,才能达到写300K/S,读1兆多,3.2M简直逆天了
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-11-7
在线时间
6 小时
发表于 2016-11-15 20:09:34 | 显示全部楼层
dop101 发表于 2015-12-29 09:18
牛逼。我407的板子,SDHC卡,才能达到写300K/S,读1兆多,3.2M简直逆天了

我也是用407进行SDHC的数据存储,速度大概是200KB/S,但是现在纠结的是每次数据存储了两分钟,就出现FIFO满了,然后数据丢失,我主要是实现数据的实时存储,所以必须是每秒建立一个文件,但是数据丢失现象比较频繁,用的也是原子的驱动
回复 支持 反对

使用道具 举报

6

主题

47

帖子

0

精华

初级会员

Rank: 2

积分
162
金钱
162
注册时间
2020-3-13
在线时间
32 小时
发表于 2020-8-31 08:55:24 | 显示全部楼层
dop101 发表于 2015-12-29 09:18
牛逼。我407的板子,SDHC卡,才能达到写300K/S,读1兆多,3.2M简直逆天了

您好,可以指导下不?您这个读速度 怎么达到1兆多的啊?
回复 支持 反对

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2020-10-22
在线时间
15 小时
发表于 2021-3-9 12:01:37 | 显示全部楼层
429  做   usb读卡器   USBFS    使用sdio   读TF卡    355KB  - 700KB    这是电脑显示的速度   写入        355K  很稳定

int8_t STORAGE_Read_FS(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len)
{
  /* USER CODE BEGIN 6 */
        #ifdef SD_CARD_READ
        int8_t ret = -1;
  uint32_t timeout = 100000;

  BSP_SD_ReadBlocks((uint32_t *)buf, blk_addr, blk_len, SD_DATATIMEOUT);
  while(BSP_SD_GetCardState() != SD_TRANSFER_OK)
  {
                if (timeout-- == 0)
                {
                        return ret;
                }
  }
  ret = 0;

  return ret;
#endif
#ifdef SD_CARD_READ_DMA
       
       
       
        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;

#endif

       
  //return (USBD_OK);
  /* 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 */
       
        #ifdef SD_CARD_WRITE
        int8_t ret = -1;
  uint32_t timeout = 100000;

  BSP_SD_WriteBlocks((uint32_t *)buf, blk_addr, blk_len, SD_DATATIMEOUT);
  while(BSP_SD_GetCardState() != SD_TRANSFER_OK)
  {
        if (timeout-- == 0)
        {
          return ret;
        }
  }
  ret = 0;

  return ret;
#endif
#ifdef SD_CARD_WRITE_DMA

        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;


#endif


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

DMA 和普通模式  速度差是一样   
感觉那里不对
回复 支持 反对

使用道具 举报

4

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
70
金钱
70
注册时间
2020-10-22
在线时间
15 小时
发表于 2021-3-9 12:10:33 | 显示全部楼层
// while(HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY){};      
这个注释了是因为程序会卡到这    有了解的吗



回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-12 06:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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