STM32L4R9 的 QuadSPI Flash 通讯速率不理想

1. 引言

客户反应 STM32L4R9 同 QSPI Flash 通讯,测出来的读取速率为 10MB/s, 和理论值相差较大。

2. 问题分析

按照客户的时钟配置和 STM32L4R9 的数据手册中的数据,OSPI 读数速率为 10MB/s 肯定存在问题。同时我们也可以在 AN4760 应用手册中看到如下说明:

在这里插入图片描述
在这里插入图片描述

在客户系统中,IO0~IO3 的 4 线通讯模式下信号波形如下图,可以看出每经过 8 个CLK 周期就有很长一段时间的延时。如果提高 CPU 的主频,这个延时会缩短,但客户测到最短的延时也有 200ns,并且一直存在:

在这里插入图片描述

3. 问题解决

从客户测试波形上看,由于是 4 条数据线,因此 8 个 clock 正好是 4bytes,也就是32bits 数据。怀疑 STM32L4R9 QSPI 在 DMA 通讯中,读到一个 word(32bits)数据后需要在内部做一定的数据处理,造成时间延迟。

分析代码发现,DMA 设置的是 byte 传输模式,如下面代码:

#define BUFFERSIZE (COUNTOF(aTxBuffer) - 1)
hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; 
hdma.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; 

STM32L4R9 是 Cortex-M4 内核,系统总线是 32bits 的,怀疑是在 32bit 总线上传输byte 数据会降低效率,造成延迟,于是修改代码如下:
示例代码在下面路径,需要使用附件中的 main.c 文件替换掉下面文件中的 main.c:

…\STM32Cube_FW_L4_Vxx\Projects\32L4R9IDISCOVERY\Examples\OSPI\OSPI_
NOR_ReadWrite_DMA\EWARM

另外程序中做如下改动:

#define BUFFERSIZE 1024 // (COUNTOF(aTxBuffer) - 1)
hdma.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; 
hdma.Init.MemDataAlignment = DMA_PDATAALIGN_WORD; 

配置时请留意 OSPIHandle.Init.FifoThreshold = 4; //也需要 4 的倍数。

修改代码后进行测试,代码读 4096bytes 的图像(1026 words),发现每个 word 数据中间的延迟已经没有了。之前速度提不上去的问题是 DMA byte 设置引起,因为STM32L4R9 是 32bits 系统,使用 8bits 传输会降低效率,需要改为 DMA 32bits 配置就OK 了。

图形数据传输的总字节数也要设置为 4 的倍数,不足的需要补齐。
在这里插入图片描述
在这里插入图片描述
DMA 改为 word 设置后数据传输时没有延迟。

4. 小结

对 32 位系统来说,使用 byte 的数据传输在一些情况下会降低效率,建议对 32bits 系统使用 32bits 的数据传输方式。


本文档参考ST官方的《【应用笔记】LAT1180+STM32L4R9+的+QuadSPI+Flash+通讯速率不理想》文档。

  • 8
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Keil5是一款ST公司推出的嵌入式开发环境,适用于开发STM32系列单片机的软件。STM32标准库是ST公司提供的一套软件库,其中包含了许多关于STM32单片机的驱动程序和示例代码。 外部SPI Flash是一种外部存储器芯片,可以通过SPI总线与STM32单片机进行通信,实现数据的读写功能。要在Keil5中进行外部SPI Flash的下载算法制作,首先需要了解SPI总线的通信协议以及外部Flash的规格和接口。 在Keil5中,可以通过编写C语言代码的方式实现外部SPI Flash的下载算法。首先,需要定义与SPI Flash通信相关的寄存器地址、命令等参数。然后,可以使用SPI总线的驱动函数来初始化SPI接口,并按照SPI Flash的通信协议进行数据的读写操作。 具体而言,可以按照以下步骤进行外部SPI Flash的下载算法制作: 1. 定义SPI Flash的相关参数,如芯片选择引脚、SPI总线的时钟速度等。 2. 初始化SPI总线,包括设置IO口模式、配置SPI时钟等。 3. 配置SPI Flash的命令、地址和数据长度。 4. 发送写使能命令,允许对SPI Flash进行写入操作。 5. 发送写命令和地址,将数据写入SPI Flash。 6. 发送读命令和地址,从SPI Flash读取数据。 7. 关闭SPI总线。 通过以上步骤,可以实现对外部SPI Flash的下载算法制作。然后,可以将制作好的下载算法加入Keil5的工程中,通过编译和下载程序到STM32单片机上,从而实现外部SPI Flash的数据读写功能。这样,可以充分利用外部存储器扩展STM32单片机的存储容量,提高系统的性能和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值