硬汉嵌入式论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: eric2013
收起左侧

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

  [复制链接]

0

主题

1

回帖

1

积分

新手上路

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

进中断的变量需要修饰成易变量 volatile,不然编译器不知道就会瞎几把优化.
回复

使用道具 举报

29

主题

102

回帖

189

积分

初级会员

积分
189
发表于 2020-8-12 19:18:09 | 显示全部楼层
我的板子使用H743 外接 W25Q01JV,   使用 安富莱的 QSPI  DMA 驱动 falsh程序, 调试不通,  在256系列上可以,
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2020-8-13 00:44:18 | 显示全部楼层
wgp2590 发表于 2020-8-12 19:18
我的板子使用H743 外接 W25Q01JV,   使用 安富莱的 QSPI  DMA 驱动 falsh程序, 调试不通,  在256系列上 ...

不同系列的命令略有区别,建议楼主核对下
回复

使用道具 举报

4

主题

141

回帖

153

积分

初级会员

积分
153
QQ
发表于 2020-8-13 09:01:16 | 显示全部楼层
硬汉哥,我之前测试 QSPI PSRAM 的时候发现频繁的小数据读写,速度会降低很多,你方便测试下 QSPI 的小数据频繁读写的情况吗?我想看看是 PSRAM 的问题还是 QSPI 的问题
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2020-8-13 09:33:59 | 显示全部楼层
qgyhd1234 发表于 2020-8-13 09:01
硬汉哥,我之前测试 QSPI PSRAM 的时候发现频繁的小数据读写,速度会降低很多,你方便测试下 QSPI 的小数据 ...

做例子的时候测试过,正常。
回复

使用道具 举报

16

主题

148

回帖

196

积分

初级会员

积分
196
发表于 2020-8-29 00:01:24 | 显示全部楼层
老哥 图片和字库怎么烧写进去呢 要开发安装的上位机软件吗
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2020-8-29 00:09:27 | 显示全部楼层
dyhfaily 发表于 2020-8-29 00:01
老哥 图片和字库怎么烧写进去呢 要开发安装的上位机软件吗

基于STM32H7驱动QSPI Flash的FatFS文件系统 + QSPI Flash虚拟U盘实现,读速度24.6MB/S(2019-03-28)
https://forum.anfulai.cn/forum.p ... 1634&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

175

回帖

211

积分

高级会员

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

硬汉兄,你这里说的FIFO开开会好不少是什么意思,指的那个FIFO?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2025-6-4 08:28:37 | 显示全部楼层
gnail092 发表于 2025-6-3 09:46
硬汉兄,你这里说的FIFO开开会好不少是什么意思,指的那个FIFO?

指的这个

STM32H7的SPI DMA配置时,SPI硬件FIFO,DMA突发设置等几个重要注意事项
https://forum.anfulai.cn/forum.p ... 2944&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

12

主题

175

回帖

211

积分

高级会员

积分
211
发表于 2025-6-4 12:39:45 | 显示全部楼层
eric2013 发表于 2025-6-4 08:28
指的这个

STM32H7的SPI DMA配置时,SPI硬件FIFO,DMA突发设置等几个重要注意事项

哦,F4的SPI貌似没有这个FIFO
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2025-6-5 07:31:36 | 显示全部楼层
gnail092 发表于 2025-6-4 12:39
哦,F4的SPI貌似没有这个FIFO

对,F4系列没有这个
回复

使用道具 举报

25

主题

209

回帖

284

积分

高级会员

积分
284
发表于 2025-9-8 17:19:43 | 显示全部楼层
eric2013 发表于 2019-3-7 01:54
注意读取时不要是03指令,这个指令限制最高50MHz

dma传输完成这里为什么不判断dma传输完成标志呢
        if (HAL_QSPI_Receive_DMA(&QSPIHandle, _pBuf) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }       
       
        /* 等接受完毕 */
        while(RxCplt == 0);
        RxCplt = 0;
回复

使用道具 举报

25

主题

209

回帖

284

积分

高级会员

积分
284
发表于 2025-9-8 17:20:06 | 显示全部楼层
dma传输完成这里为什么不判断dma传输完成标志呢
        if (HAL_QSPI_Receive_DMA(&QSPIHandle, _pBuf) != HAL_OK)
        {
                Error_Handler(__FILE__, __LINE__);
        }      
      
        /* 等接受完毕 */
        while(RxCplt == 0);
        RxCplt = 0;
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2025-9-9 10:47:34 | 显示全部楼层
yuanzhongda 发表于 2025-9-8 17:20
dma传输完成这里为什么不判断dma传输完成标志呢
        if (HAL_QSPI_Receive_DMA(&QSPIHandle, _pBuf) ! ...

这个
  while(RxCplt == 0);

就是
回复

使用道具 举报

5

主题

16

回帖

31

积分

新手上路

积分
31
发表于 2025-11-23 19:58:58 | 显示全部楼层
       
        /* 配置MDMA时钟 */
        QSPI_MDMA_CLK_ENABLE();

        hmdma.Instance = MDMA_Channel1;                         /* 使用MDMA的通道1 */
        hmdma.Init.Request = MDMA_REQUEST_QUADSPI_FIFO_TH;      /* QSPI的FIFO阀值触发中断 */
        hmdma.Init.TransferTriggerMode = MDMA_BUFFER_TRANSFER;  /* 使用MDMA的buffer传输 */
        hmdma.Init.Priority = MDMA_PRIORITY_HIGH;               /* 优先级高 */
        hmdma.Init.Endianness = MDMA_LITTLE_ENDIANNESS_PRESERVE;/* 小端格式 */
        hmdma.Init.SourceInc = MDMA_SRC_INC_BYTE;               /* 源地址字节递增 */
        hmdma.Init.DestinationInc = MDMA_DEST_INC_DISABLE;      /* 目的地址无效自增 */
        hmdma.Init.SourceDataSize = MDMA_SRC_DATASIZE_BYTE;     /* 源地址数据宽度字节 */
        hmdma.Init.DestDataSize = MDMA_DEST_DATASIZE_BYTE;      /* 目的地址数据宽度字节 */
        hmdma.Init.DataAlignment = MDMA_DATAALIGN_PACKENABLE;   /* 小端,右对齐 */
        hmdma.Init.BufferTransferLength = 128;                  /* 每次传输128个字节 */
        hmdma.Init.SourceBurst = MDMA_SOURCE_BURST_SINGLE;      /* 源数据单次传输 */
        hmdma.Init.DestBurst = MDMA_DEST_BURST_SINGLE;          /* 目的数据单次传输 */
       
        hmdma.Init.SourceBlockAddressOffset = 0;                /* 用于block传输,buffer传输用不到 */
        hmdma.Init.DestBlockAddressOffset = 0;                  /* 用于block传输,buffer传输用不到 */

        /* 关联MDMA句柄到QSPI句柄里面  */
        __HAL_LINKDMA(hqspi, hmdma, hmdma);

        /* 先复位,然后配置MDMA */
        HAL_MDMA_DeInit(&hmdma);  
        HAL_MDMA_Init(&hmdma);

        /* 使能MDMA中断,并配置优先级 */
        HAL_NVIC_SetPriority(MDMA_IRQn, 0x02, 0);
        HAL_NVIC_EnableIRQ(MDMA_IRQn);
}  
大佬,为什FiFo 32 加Fifo阈值触发MDMA呢?那还没有读写的时候Fifo不就是满足条件触发MDMA了?而且一次不是传输一个字节(就是一个QSPI_DR 数据)吗,为什么配置为传输长度128?
回复

使用道具 举报

1万

主题

7万

回帖

12万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
120428
QQ
 楼主| 发表于 2025-11-24 09:31:38 | 显示全部楼层
AnFuLai#stm32 发表于 2025-11-23 19:58
/* 配置MDMA时钟 */
        QSPI_MDMA_CLK_ENABLE();

1、这个不会
2、通过FIFO缓冲加速传输效率
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-10 07:57 , Processed in 0.056053 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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