1. 引言 客户反应 STM32L4R9 同 QSPI Flash 通讯,测出来的读取速率为 10MB/s, 和理论值相差较大。3 D* Q$ m7 _2 B3 F: m2 r 2. 问题分析" |1 x( R; E( {5 p. k, L# H2 k i 按照客户的时钟配置和 STM32L4R9 的数据手册中的数据,OSPI 读数速率为 10MB/s 肯定存在问题。同时我们也可以在 AN4760 应用手册中看到如下说明: ) u- U+ U, v0 H- v* | % Y$ g7 S2 C2 o$ C' V! |0 s, s 在客户系统中,IO0~IO3 的 4 线通讯模式下信号波形如下图,可以看出每经过 8 个CLK 周期就有很长一段时间的延时。如果提高 CPU 的主频,这个延时会缩短,但客户测到最短的延时也有 200ns,并且一直存在: ) M' h7 f+ I2 U 3. 问题解决 # C+ y* v' s3 l 从客户测试波形上看,由于是 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; 0 _2 O6 A- {( V) {- E y1 ` STM32L4R9 是 Cortex-M4 内核,系统总线是 32bits 的,怀疑是在 32bit 总线上传输byte 数据会降低效率,造成延迟,于是修改代码如下: 示例代码在下面路径,需要使用附件中的 main.c 文件替换掉下面文件中的 main.c: \STM32Cube_FW_L4_Vxx\Projects\32L4R9IDISCOVERY\Examples\OSPI\OSPI_NOR_ReadWrite_DMA\EWARM 4 V2 s7 q o- s& O' q 另外程序中做如下改动:! T) X* z; n: D) S; H% q #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 的倍数,不足的需要补: [6 \( K& b7 r. J8 s7 t 5 u6 M" C+ x* j" L% @: n( \ 完整版请查看:附件 |
基于STM32L476+64M QSPI接口PSRAM(IPS6404L)开源分享(含源码)
基于STM32L4R9 的QuadSPI Flash 通讯速率不理想经验分享
STM32L4超低功耗功能概述
基于STM32L431RC Standby和RTC中断唤醒经验分享
基于STM32L431的睡眠模式经验分享
STM32L4、STM32L4+和STM32G4系列 微控制器上的专利代码读取保护
STM32L433在STOP模式USART不能工作的解决办法
【实测教程】基于STM32L4系列的实测教程分享合集
STM32L4系列MCU的五种振荡器和使用说明
【实测教程】STM32CubeMX-STM32L4之研究串口通信(printf)