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 传输模式,如下面代码:

c 复制代码
#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

另外程序中做如下改动:

c 复制代码
#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+通讯速率不理想》文档。

相关推荐
FPGA小徐2 小时前
STM32五路气敏传感器阵列电路详解:从HHC1000分压到AD8606跟随器和ADC采样
stm32·单片机·嵌入式硬件
Horn Still Sounds4 小时前
IMX6ULL裸机|I2C通信协议 + ADC模数转换学习笔记
arm开发·笔记·单片机·嵌入式硬件
智感子4 小时前
无人值守称重:地磅系统架构与流程
嵌入式硬件
新晨单片机设计6 小时前
S011C-基于STM32智能灯光控制系统(光强、声音、人体)【Proteus仿真+Keil程序+原理图】
stm32·嵌入式硬件·proteus·智能灯光控制系统
无敌贵点大王6 小时前
RTThread学习记录13——关于要使用一个外设,RTThread与cubemx到底要怎么配合?
c语言·stm32·学习·rtthread
女神下凡8 小时前
芯参谋(26):DDR4_软件设计规范
arm开发·单片机·嵌入式硬件
zd8451015008 小时前
DSLogic逻辑分析仪连接失败
嵌入式硬件
国科安芯9 小时前
星载通信载荷信号处理中抗辐射微控制器的选型与适应性分析
人工智能·嵌入式硬件·mcu·信号处理·risc-v·抗辐射·空间信息
AOI小白新手上路10 小时前
韦东山 3-5 I.MX6ULL 的 LED 编程 · 学习笔记
arm开发·笔记·单片机·学习·架构·硬件架构
测试学习test11 小时前
SPI读取W25Q64硬件驱动(HAL库)
数据库·stm32·嵌入式硬件·算法