硬汉嵌入式论坛

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

[SPI/QSPI] STM32H7驱动QSPI Flash的4线DMA模式,读速度48MB/S左右,还不错

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2019-3-7 01:41:02 | 显示全部楼层 |阅读模式
测试条件:
1、V7核心板上的QSPI Flash W25Q256JV。
2、QSPI时钟配置到100MHz。
3、QSPI配合MDMA。

有了这个速度,后面用QSPI Flash存储图片,字库什么的就比较方便了。
V7-029_QSPI读写例程(四线DMA方式,读每秒48MB).rar (4.63MB)


image.png








回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-7 01:54:23 | 显示全部楼层
注意读取时不要是03指令,这个指令限制最高50MHz



要使用这个里面的地址:

回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-7 07:45:09 | 显示全部楼层
可以的,弄个内存映射,再弄个下载算法,把字库和图片放里面,不用FATFS提高速度
回复

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-3-7 08:48:45 | 显示全部楼层
读写速度差别100倍啊!
回复

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-3-7 08:52:56 | 显示全部楼层
H7的驱动QSPI这里设置为100MHZ,读取数据速度基本达到最大值!H7驱动QSPI最大时钟可以设置多少?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-7 10:09:54 | 显示全部楼层
在水一方 发表于 2019-3-7 07:45
可以的,弄个内存映射,再弄个下载算法,把字库和图片放里面,不用FATFS提高速度

在RTOS环境下,使用MDMA方式,将其为低优先级任务的emWin提供图片和字库刷新也非常不错,降低CPU利用率。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-7 10:10:42 | 显示全部楼层
Tresordie 发表于 2019-3-7 08:48
读写速度差别100倍啊!

擦除整个芯片需要80-400秒,时间很长。
QQ截图20190307101327.jpg

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-7 10:16:05 | 显示全部楼层
Tresordie 发表于 2019-3-7 08:52
H7的驱动QSPI这里设置为100MHZ,读取数据速度基本达到最大值!H7驱动QSPI最大时钟可以设置多少?

100MHz。
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-3-7 10:55:28 | 显示全部楼层
基本满速了。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-3-7 11:09:39 | 显示全部楼层
eric2013 发表于 2019-3-7 10:10
擦除整个芯片需要80-400秒,时间很长。

使用 MX25Lxx 系列的芯片,扇区擦除大概是 22-28ms 之间,w25q 系列的,扇区擦除大概是 220-260ms 时间,其他的读取速度貌似基本都差不多
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-7 11:17:39 | 显示全部楼层
hpdell 发表于 2019-3-7 11:09
使用 MX25Lxx 系列的芯片,扇区擦除大概是 22-28ms 之间,w25q 系列的,扇区擦除大概是 220-260ms 时间, ...

这里我有搜集

【整理汇总】STM32H7可用的单线,双线,四线和八线SPI QSPI OctaFlash等涵盖各大厂商,含性能测评
http://www.armbbs.cn/forum.php?m ... 9669&fromuid=58
(出处: 安富莱电子论坛)
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-3-7 11:37:36 | 显示全部楼层
eric2013 发表于 2019-3-7 11:17
这里我有搜集

【整理汇总】STM32H7可用的单线,双线,四线和八线SPI QSPI OctaFlash等涵盖各大厂商, ...

非常全面啦,
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-7 20:29:05 | 显示全部楼层
为啥我使用4线模式读 不使用DMA,时钟30MHz的话,最快也就2.55MB/S。看来DMA用处不小
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-8 00:33:19 | 显示全部楼层
sanit 发表于 2019-3-7 20:29
为啥我使用4线模式读 不使用DMA,时钟30MHz的话,最快也就2.55MB/S。看来DMA用处不小

把FIFO开开会好不少,还是你上次的GD系列吗
另外命令要使用FAST类型的,一次命令,一批数据。
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-8 09:10:04 | 显示全部楼层
eric2013 发表于 2019-3-8 00:33
把FIFO开开会好不少,还是你上次的GD系列吗
另外命令要使用FAST类型的,一次命令,一批数据。

对,我使用的是GD系列的。比W25Q的支持的速度要快啊。
我知道速度慢的一个原因就是,我没有使用“Continuous Read Mode”模式。而且是一次读取4096字节,循环读取4096次测的速度。所以会低点。


3.jpg
1.jpg
2.jpg
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-8 09:26:01 | 显示全部楼层
sanit 发表于 2019-3-8 09:10
对,我使用的是GD系列的。比W25Q的支持的速度要快啊。
我知道速度慢的一个原因就是,我没有使用“Contin ...

是的,循环读也非常的占用时间。
回复

使用道具 举报

36

主题

1445

回帖

1553

积分

至尊会员

积分
1553
发表于 2019-3-11 23:13:42 | 显示全部楼层
eric2013 发表于 2019-3-8 09:26
是的,循环读也非常的占用时间。

使用DMA模式读,30MHZ下,四线模式读是9+MB/S,跟理论上15MB/S差的还是有点远啊。理论速度没计算错吧老大?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-12 02:53:47 | 显示全部楼层
sanit 发表于 2019-3-11 23:13
使用DMA模式读,30MHZ下,四线模式读是9+MB/S,跟理论上15MB/S差的还是有点远啊。理论速度没计算错吧老大 ...

是的,还有提升的余地。
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-12 16:02:31 | 显示全部楼层
有没有试过 W25Q256JV-DTR ,
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-12 16:03:28 | 显示全部楼层
在水一方 发表于 2019-3-12 16:02
有没有试过 W25Q256JV-DTR ,

支持双边沿时钟的这款?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-12 16:11:36 | 显示全部楼层
回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-12 16:16:30 | 显示全部楼层
eric2013 发表于 2019-3-12 16:11
http://www.winbond.com.tw/hq/product/code-storage-flash-memory/serial-nor-flash/?__locale=zh&selecte ...

恩,我刚才去云汉 查了下没有
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-3-12 16:29:52 | 显示全部楼层
在水一方 发表于 2019-3-12 16:16
恩,我刚才去云汉 查了下没有

这款不好,内存模式貌似不支持XIP,连续读速度跟不支持DTR的没区别
256JV-DTR

QQ截图20190312162635.jpg


256JV
QQ截图20190312162856.jpg





回复

使用道具 举报

32

主题

262

回帖

363

积分

高级会员

积分
363
发表于 2019-3-12 16:49:12 | 显示全部楼层
明白了,谢谢指导
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-20 11:21:48 | 显示全部楼层
你好,我的 qspi 芯片,使用 1线模式,中断方式,貌似读取速度可以到达 GB 级别啊,有些不敢想啊
这几个模式都是采用 1线模式读写,即
1位指令
1位地址
1位数据


读写数据总大小 16MB
一、使用 SPI 中断模式
QSPI_EraseSector: EraseSector Time: 91282ms
QSPI Write Flash OK
Data Len: 16777216Byte, Write Time: 17755ms, Write Speed: 944KB/s
Data Len: 16777216Byte, Read Time: 1ms, Read Speed: 16777216 KB/s
QSPI RW OK !


二、中断 + dma
QSPI_EraseSector: EraseSector Time: 93500ms
QSPI Write Flash OK
Data Len: 16777216Byte, Write Time: 17757ms, Write Speed: 944KB/s
Data Len: 16777216Byte, Read Time: 1343ms, Read Speed: 12492 KB/s
QSPI RW OK !


三、 使用 SPI 查询模式
QSPI_EraseSector: EraseSector Time: 89542ms
QSPI Write Flash OK
Data Len: 16777216Byte, Write Time: 18616ms, Write Speed: 901KB/s
Data Len: 16777216Byte, Read Time: 2688ms, Read Speed: 6241 KB/s
QSPI RW OK !




四 读写测试函数
#include "malloc_conf.h"
#define  QSPI_RW_TEST_SIZE   1024*1024*16

void QSPI_ReadWriteDemo(void)
{
        uint32_t i, EarseCnt =0;
        uint32_t iTime1, iTime2;
        uint32_t uiAddrBase = 8531;  //起始扇区地址,
        uint8_t  j =0;
        uint8_t  * QSPI_tx_buff =  (uint8_t  *)mymalloc(SDRAMEX, QSPI_RW_TEST_SIZE );       
  uint8_t  * QSPI_rx_buff =  (uint8_t  *)mymalloc(SDRAMEX, QSPI_RW_TEST_SIZE );
       
        EarseCnt = QSPI_RW_TEST_SIZE / 4096;
        if((QSPI_RW_TEST_SIZE % 4096) != 0)
                EarseCnt += 1;
       
       
        /* 填充测试缓冲区 */
        for (i = 0; i < QSPI_RW_TEST_SIZE; i++)
        {
                QSPI_tx_buff[i] = j++;
        }
       
        iTime1 = bsp_GetRunTime();        /* 记下开始时间 */
        for(i=0; i<EarseCnt; i++)
        {
                QSPI_EraseSector(uiAddrBase + i);  //擦除第一个 4096byte 扇区
        }
        iTime2 = bsp_GetRunTime();        /* 记下结束时间 */
        QSPI_Printf("QSPI_EraseSector: EraseSector Time: %dms\r\n",  (iTime2 - iTime1));
       
       
        iTime1 = bsp_GetRunTime();        /* 记下开始时间 */
        QSPI_WriteBuff(QSPI_tx_buff, uiAddrBase*4096, QSPI_RW_TEST_SIZE);
        iTime2 = bsp_GetRunTime();        /* 记下结束时间 */
        QSPI_Printf("QSPI Write Flash OK \r\n");
       
        /* 打印读速度 */
        QSPI_Printf("Data Len: %dByte, Write Time: %dms, Write Speed: %dKB/s\r\n", QSPI_RW_TEST_SIZE, iTime2 - iTime1, (uint32_t)(QSPI_RW_TEST_SIZE) / ((iTime2 - iTime1)));
       
        // ------------------------------------------------------------------------------------
       
        for (i = 0; i < QSPI_RW_TEST_SIZE; i++)
        {
                QSPI_rx_buff[i] = 0;   //数据清 0
        }
       
        iTime1 = bsp_GetRunTime();        /* 记下开始时间 */
        QSPI_ReadBuff(QSPI_rx_buff, uiAddrBase*4096, QSPI_RW_TEST_SIZE);
        iTime2 = bsp_GetRunTime();        /* 记下结束时间 */
        /* 打印读速度 */
        QSPI_Printf("Data Len: %dByte, Read Time: %dms, Read Speed: %d KB/s\r\n", QSPI_RW_TEST_SIZE, iTime2 - iTime1, (uint32_t)(QSPI_RW_TEST_SIZE) / ((iTime2 - iTime1)));
       
        if(Buffercmp_8(QSPI_rx_buff, QSPI_tx_buff, QSPI_RW_TEST_SIZE) == 0)
        {
                QSPI_Printf("QSPI RW OK !\r\n");
        }
        else
                QSPI_Printf("QSPI RW Error ?\r\n");
       
}





回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-4-20 11:30:07 | 显示全部楼层
hpdell 发表于 2019-4-20 11:21
你好,我的 qspi 芯片,使用 1线模式,中断方式,貌似读取速度可以到达 GB 级别啊,有些不敢想啊
这几个模 ...

QQ截图20190420112924.jpg
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-20 11:32:22 | 显示全部楼层
本帖最后由 hpdell 于 2019-4-20 11:47 编辑

我三种方式的读写都是使用这个函数啊

而且读写数据量也都是 16MB,我还是怕搞错了,我还特意测试了几遍,结果都是一样的
而且 中断模式下,读取数据,刷的一下就完成了
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-4-20 11:34:56 | 显示全部楼层
hpdell 发表于 2019-4-20 11:32
我三种方式的读写都是使用这个函数啊

而且读写数据量也都是 16MB,我还是怕搞错了,我还特意测试了几 ...

肯定错了,简单算下就知道了。

QSPI时钟就按照200MHz算,1线方式,就算1个时钟周期1个数据,也才25MB/S,支持DDR的话,也就才50MB/S
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-20 11:48:33 | 显示全部楼层
byccc 发表于 2019-4-20 11:34
肯定错了,简单算下就知道了。

QSPI时钟就按照200MHz算,1线方式,就算1个时钟周期1个数据,也才25MB/ ...

这个具体的原因我目前也不怎么清楚哇,貌似有些诡异的狠辣
回复

使用道具 举报

28

主题

274

回帖

358

积分

高级会员

积分
358
发表于 2019-4-20 12:46:28 | 显示全部楼层
学习中 看样得买个 开发板了
回复

使用道具 举报

19

主题

326

回帖

383

积分

高级会员

积分
383
发表于 2019-4-20 12:46:38 | 显示全部楼层
byccc 发表于 2019-4-20 11:34
肯定错了,简单算下就知道了。

QSPI时钟就按照200MHz算,1线方式,就算1个时钟周期1个数据,也才25MB/ ...

QSPI为四线数据,如果是200MHz时钟,那数据应该是800Mbit/s,也就是100MB/s
回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-4-20 12:55:54 | 显示全部楼层
laofa 发表于 2019-4-20 12:46
QSPI为四线数据,如果是200MHz时钟,那数据应该是800Mbit/s,也就是100MB/s

是的,怎么搞,也上不了GB
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-24 22:03:22 | 显示全部楼层
本帖最后由 hpdell 于 2019-4-24 22:05 编辑
byccc 发表于 2019-4-20 12:55
是的,怎么搞,也上不了GB

目前实际测试是 16MB/1ms 就读取完成了啊
如果使用 dma + 中断的话,貌似 是 30MB/s
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-4-26 00:29:06 | 显示全部楼层
hpdell 发表于 2019-4-24 22:03
目前实际测试是 16MB/1ms 就读取完成了啊
如果使用 dma + 中断的话,貌似 是 30MB/s

这个速度就正常了。
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-26 12:16:40 | 显示全部楼层
eric2013 发表于 2019-4-26 00:29
这个速度就正常了。

是啊,但是不知道为何 单独 中断 读取数据会那么的牛逼,目前也还是没有搞清楚啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-4-26 14:36:39 | 显示全部楼层
hpdell 发表于 2019-4-26 12:16
是啊,但是不知道为何 单独 中断 读取数据会那么的牛逼,目前也还是没有搞清楚啊

16MB用了1ms???

刚注意你的单位,这个完全异常了。
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-26 15:07:10 | 显示全部楼层
本帖最后由 hpdell 于 2019-4-26 15:12 编辑
eric2013 发表于 2019-4-26 14:36
16MB用了1ms???

刚注意你的单位,这个完全异常了。

是啊,但是我测试 了好几遍,最少测试不少于 20次,结果都是一样的,感觉很 牛逼的样子,要是有这个速度,吧程序放在这个里面跑,那效果也是杠杠的,可惜呀,没有搞懂是 怎么回事 啊 ?

使用查询法,或者 中断+dma 的方法,貌似读取的速度基本算是正常的,就唯独 这个单独使用 中断 法 就飞一般的快,快到让你害怕哟 ?
qspi 的时钟使用系统默认的时钟,我也没有单独设置 qspi 的时钟频率
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-4-26 15:12:46 | 显示全部楼层
hpdell 发表于 2019-4-26 15:07
是啊,但是我测试 了好几遍,最少测试不少于 20次,结果都是一样的,感觉很 牛逼的样子,要是有这个速度 ...

电脑内存条的速度都没你这个快,你这个可是将近16GB/S
回复

使用道具 举报

610

主题

3054

回帖

4904

积分

至尊会员

积分
4904
发表于 2019-4-26 15:13:29 | 显示全部楼层
eric2013 发表于 2019-4-26 15:12
电脑内存条的速度都没你这个快,你这个可是将近16GB/S

是啊,你感觉快的 害怕不 ??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
 楼主| 发表于 2019-4-26 15:16:53 | 显示全部楼层
hpdell 发表于 2019-4-26 15:13
是啊,你感觉快的 害怕不 ??

确实吓人,可以用示波器测试下你的时钟速度。这样就可以确定问题了
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 16:29 , Processed in 0.314682 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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