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+通讯速率不理想》文档。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/516592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python 字符串补齐

参考文献 https://blog.csdn.net/ViatorSun/article/details/130424704 今天遇到一个格式化字符串的问题 "123".ljust(8,"0")"123".rjust(8,"0")

苍穹外卖07(缓存菜品,SpringCache,缓存套餐,添加购物车菜品和套餐多下单,查看购物车,清除购物车,删除购物车中一个商品)

目录 一、缓存菜品 1 问题说明 2 实现思路 3 代码开发:修改DishServiceImpl 4 功能测试 二、SpringCache 1. 介绍 2. 使用语法 1 起步依赖 2 使用要求 3 常用注解 4 SpEL表达式(了解备用) 5 步骤小结 3.入门案例 1 准备环境 2 使用入门 1 引导类上加…

b站评论词频统计绘制词云图

一、评论爬取 在笔者之前的文章中,已经专门介绍了b站评论的爬取(传送门),这里只对b站评论的文本数据做展示。如下图所示: 二、分词、去停用词、词频统计 Python中的Jieba分词作为应用广泛的分词工具之一,其…

【面试经典150 | 动态规划】最长回文子串

文章目录 写在前面Tag题目来源解题方法方法一:动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对于本题涉及到的数据结构等内容进行…

【OJ】动规练习六

个人主页 : zxctscl 如有转载请先通知 题目 1. 413. 等差数列划分1.1 分析1.2 代码 2. 978. 最长湍流子数组2.1 分析2.2 代码 3. 139. 单词拆分3.1 分析3.2 代码 1. 413. 等差数列划分 1.1 分析 一、题目解析: 至少有三个元素才能构成等差数列&#xff…

【开发环境】Mac 安装 Visual Studio Code ( VSCode 简介 | 下载 VSCode | 安装 VSCode | 安装中文语言包 )

文章目录 一、Visual Studio Code 简介二、MAC 安装 Visual Studio Code1、下载 Visual Studio Code2、安装 Visual Studio Code3、安装中文语言包4、编辑 html 并运行 一、Visual Studio Code 简介 Visual Studio Code 简称 VSCode , 是 微软 开发的一款 轻量级 / 跨平台 的代…

前视声呐目标识别定位(五)-代码解析之修改声呐参数

前视声呐目标识别定位(一)-基础知识 前视声呐目标识别定位(二)-目标识别定位模块 前视声呐目标识别定位(三)-部署至机器人 前视声呐目标识别定位(四)-代码解析之启动识别模块 …

arm裸机-1、定时器pwm

时钟配置 我们使用s3c2440,主频12M,查看用户手册 通过锁相环抬升到400MHZ,分成三条通路,通过HHDIVN和PDIVN配置频率比,这个频率比配置手册已经给出。 配置MPLL主频400Mhz, 通过这个公式算出MPLL s、p、m都…

Redis从入门到精通(四)Redis实战(二)商户查询缓存

↑↑↑请在文章头部下载测试项目原代码↑↑↑ 文章目录 前言4.2 商户查询缓存4.2.1 缓存介绍4.2.2 查询商户信息的传统做法4.2.2.1 接口文档4.2.2.2 代码实现4.2.2.3 功能测试 4.2.3 查询商户信息添加Redis缓存4.2.3.1 逻辑分析4.2.3.2 代码实现4.2.3.3 功能测试 4.2.3 数据一致…

动力云客-B站(第一天)

一 项目技术选型及开发工具 前后端分离的项目(前端项目 后端项目) 前端:Html、CSS、JavaScript、Vue、Axios、Element Plus后端:Spring Boot、Spring Security、MyBatis、MySQL、Redis 相关组件:HiKariCP&#x…

【C++进阶】带你手撕红黑树(红与黑的爱恨厮杀)

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:c大冒险 总有光环在陨落,总有新星在闪烁 引言: 之前我们…

K8S- Deployment 的滚动更新 Rolling Update

滚动更新 这里的更新指的不是更新deployment 本身的属性(label/ replicas)等, 而是更新POD 的container 的版本 更新方法通常有两种 是直接update deployment配置, 注意只有update了template中的内容(与container相关) 才会触发更新用kubectl set ima…

【蓝桥杯】GCD与LCM

一.概述 最大公约数(GCD)和最小公倍数(Least Common Multiple,LCM) 在C中,可以使用 std::__gcd(a, b)来计算最大公约数 1.欧几里德算法/辗转相除法 int gcd(int a,int b){return b?gcd(b, a%b):a; } 2…

CATIA软件 焊点坐标(BiW Welding SpotPoint)导出txt文本的操作方法

通常我们客户给的工件是带焊点球的形式,且可导出焊点坐标。如下图所示的焊点位置标识及坐标,即是CATIA中Automotive BiW Fastening模块下的BiW Welding SpotPoint焊点定义。 遇到这样的形式,要导出焊点坐标txt文本,可按如下图片找…

ssm023实验室耗材管理系统设计与实现+jsp

实验室耗材管理系统的设计与实现 摘 要 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对实验室耗材信息管理混乱&#xff…

深入浅出 -- 系统架构之单体架构和微服务架构的区别

在软件开发中,架构设计是非常重要的一环。架构设计不仅决定了软件系统的性能、可维护性和扩展性,还直接关系到开发成本和项目进度。目前,主流的架构设计模式有两种,一种是单体架构,另一种是微服务架构。本文将详细介绍…

【C语言】从零开始:用C语言实现顺序表

欢迎来CILMY23的博客 本篇主题为 从零开始:用C语言实现顺序表 个人主页:CILMY23-CSDN博客 C语言专栏: http://t.csdnimg.cn/hQ5a9 Python系列专栏:http://t.csdnimg.cn/HqYo8 上一篇C语言博客: http://t.csdnimg.…

pwn学习笔记(7)--堆相关源码

相关源码: 1. chunk 相关源码: ​ 对于用户来说,只需要确保malloc()函数返回的内存不会发生溢出,并且在不用的时候使用free() 函数将其释放,以后也不再做任何操作即可。而对于glibc来说’它要在用户第一次调用malloc…

C语言数据结构初阶-顺序表

什么是数据结构 数据结构是由数据和结构两个词结合而来, 那么数据由是什么 就比如我们日常生活中的1,2,3,4,5,a,b,c,d,e文字信息图片等,这些就是数据 那么结构又是什么? 想像一下如…

Collection与数据结构 Stack与Queue(一): 栈与Stack

1. 栈 1.1 概念 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。 压栈&…