linux下RP2350芯片rt-thread开发(六)玩转PSRAM——装进rt-thread
RP2350芯片通过XIP子系统访问外部QSPI存储器(QSPI Flash和QSPI PSRAM)。XIP子系统结构如下图:RP2350芯片通过XIP子系统实现了CPU对QSPI存储器的直接内存访问功能。具体实现细节请参阅RP2350 datasheet第4.4章节的说明。对于QSPI PSRAM,从XIP子系统结构图下往上看,QSPI PSRAM通过SCK、CSn[1]和SD[3:0]信号线接
一、前言
树莓派RP2350芯片新增了对QSPI PSRAM(QSPI接口的PSRAM)支持,相较于前代RP2040芯片实现了重要升级。PSRAM的密度高于传统SRAM,允许RP2350在有限芯片面积下实现更大内存容量。这对于运行复杂应用(如图形处理、多任务操作系统)至关重要,同时避免了DRAM的复杂刷新电路需求。支持PSRAM后,RP2350可更灵活地应用于智能家居、穿戴设备、工业控制等领域。开发者能选择成本更低的大容量内存方案,同时保持设计简洁性。本文介绍RP2350芯片在rt-thread下PSRAM的使用方法。
二、硬件方面的说明
2.1 QSPI PSRAM本身
2.1.1 QSPI PSRAM的工作原理
QSPI PSRAM结合了DRAM的高密度和SRAM的易用性,通过QSPI接口实现高效数据交换。
QSPI PSRAM存储器的核心是DRAM阵列,但通过内置刷新控制器模拟SRAM行为,无需外部刷新操作。内部结构包括:
- 存储阵列:DRAM单元构成,密度高但需要定期刷新。
- 刷新控制器:自动管理刷新周期,对用户透明。
- 接口逻辑:处理QSPI协议,转换外部命令为内部操作。
PSRAM芯片的外部通信接口——QSPI(Quad SPI)是一种高速串行通信接口,支持四线数据传输,它通过内部接口逻辑电路连接芯片内部的并行PSRAM(Pseudo SRAM)存储器。
标准QSPI PSRAM通常支持以下核心命令(具体以器件手册为准):
| 命令名称 | 操作码(Hex) | 功能描述 |
|---|---|---|
| READ | 0x03 | 标准读取数据 |
| FAST_READ | 0x0B | 带时钟延迟的快速读取 |
| WRITE | 0x02 | 写入数据 |
| EDIO | 0x3B | 进入/退出四线模式(部分型号支持) |
| RSTEN | 0x66 | 复位使能 |
| RESET | 0x99 | 执行硬件复位 |
| RDID | 0x9F | 读取器件ID |
由于QSPI PSRAM遵循统一的命令规范,外部控制程序能够通过这些标准指令识别和操作不同厂商的PSRAM芯片。
2.1.2 常见的QSPI PSRAM有哪些
APMemory系列:如APM1604(16Mb),APM1604(64Mb),支持1.8V/3.3V(由型号后缀区分);
乐鑫系列:如ESP-PSRAM64H(64Mb),支持3.3V;ESP-PSRAM64(64Mb),支持1.8V;
Lyontek系列:如LY68L6400(64Mb),支持3.3V
2.1.3 QSPI PSRAM关键参数
QSPI PSRAM参数有很多,比如容量、接口电平、QSPI接口时钟频率、时序特性、功耗等。
对软件开发者来说,QSPI PSRAM的关键参数是容量和QSPI接口时钟频率。
QSPI PSRAM的容量直接影响软件设计方案,并制约产品功能的实现程度。目前市面上的QSPI PSRAM容量在16Mb~128Mb范围内,容量64Mb及64Mb以内的芯片比较常见。
对于不跨页的内存访问,芯片支持的QSPI时钟频率通常为104MHz至133MHz,部分型号支持高达166MHz;对于跨页的内存访问,芯片支持的QSPI时钟频率会降至84MHz。软件开发者需要根据内存访问情况设置QSPI时钟频率。
2.2 RP2350芯片与QSPI PSRAM连接
2.2.1 RP2350芯片XIP子系统概述
RP2350芯片通过XIP子系统访问外部QSPI存储器(QSPI Flash和QSPI PSRAM)。XIP子系统结构如下图:
RP2350芯片通过XIP子系统实现了CPU对QSPI存储器的直接内存访问功能。具体实现细节请参阅RP2350 datasheet第4.4章节的说明。
对于QSPI PSRAM,从XIP子系统结构图下往上看,QSPI PSRAM通过SCK、CSn[1]和SD[3:0]信号线接入QSPI Memory Interface(QMI)模块。QMI模块负责封装QSPI PSRAM的数据读写与控制命令,将上层传输的数据转换为底层操作指令,从而实现对QSPI PSRAM操作细节的透明化处理。从逻辑上讲,QSPI PSRAM实现了并行PSRAM访问的串行化处理,而QMI模块则负责将这些串行数据重新转换为并行的内存空间。QMI的上层负责管理这块内存空间,具体包括:AHB模块确定这块内存空间在整个系统中的内存地址,而cache和Streaming FIFO(一般情况下PSRAM用不到)则通过AHB仲裁器控制访问时机。
XIP子系统的缓存机制确保PSRAM访问不会跨越页边界,理论上能使PSRAM能够以QSPI接口的最高速率运行。但实际QSPI接口速率受系统时钟影响,因为QMI输出的SCK速率是系统时钟的整数分频。RP2350的默认系统频率为150MHz。当PSRAM芯片支持166MHz通信速率时,QMI可以150MHz频率与其通信;若PSRAM芯片仅支持133MHz速率,则QMI将以75MHz频率进行通信。
2.2.2 RP2350芯片与QSPI PSRAM的引脚连接
RP2350的QSPI接口通常包含6个主要信号线,需与PSRAM对应引脚匹配:
- SCLK(时钟):连接PSRAM的CLK引脚,提供同步时钟信号。
- CSn[1](片选):连接PSRAM的CS#引脚,用于设备选择。
- SD0(数据线0):连接PSRAM的D0引脚,用于双向数据传输。
- SD1(数据线1):连接PSRAM的D1引脚。
- SD2(数据线2):连接PSRAM的D2引脚。
- SD3(数据线3):连接PSRAM的D3引脚。
此6个信号除CSn[1]外,都是特定功能引脚,无需特殊配置。CSn[1]为GPIO第二功能脚(F9),默认不使能QMI CS1n功能。只有GPIO0、GPIO8、GPIO19和GPIO47具有QMI CS1n功能。
2.2.3 实际板子情况
树莓派pico2不支持PSRAM,目前只有少数RP2350板子支持PSRAM。
我的板子上的PSRAM芯片是LY68L6400,容量64Mb(8MB),CSn[1]引脚使用GPIO19。
三、rt-thread下的PSRAM软件驱动
在软件层面,使用PSRAM只需完成初始化步骤。初始化完成后,直接访问内存地址空间0x11000000至0x11000000+PSRAM容量-1的范围即可实现对PSRAM的读写操作。
工程board/board.c文件用于初始化硬件,加入以下代码初始化PSRAM。
#include "rp2_psram.h"
#include "boards/pico_plus_rp2350.h"
int rt_psram_init()
{
psram_size = psram_init(PICO_PLUS_PSRAM_CS_PIN);
rt_kprintf("PSRAM size: %d\r\n", psram_size);
return 0;
}
INIT_DEVICE_EXPORT(rt_psram_init);
board目录下的rp2_psram.h和rp2_psram.c根据开源代码修改。开源代码基于官方sdk开发,rt-thread下需修改才能正常使用。源码可以从这里下载RP2350芯片PSRAM在rt-thread系统下的初始化程序
现在board目录是这样的。

修改board目录下SConscript文件,加入rp2_psarm.c才能完整编译。

编译的固件烧入板子启动后,能看到板上PSRAM的容量信息。

四、PSRAM性能评估与测试
4.1 PSRAM性能评估
由于RP2350芯片系统频率为150MHz,大于LY68L6400芯片支持的最大QSPI频率133MHz,RP2350芯片QSPI控制器的输出频率只能通过系统频率2分频——75MHz,来实现最快的LY68L6400芯片读写。
则,LY68L6400 QSPI通信带宽:75Mx4T/s =300MT/s≈286Mb/s=35.75MB/s。
根据二八定律,理想情况下,PSRAM读写应该能达到35.75MB/s的80%,即28.6MB/s。实际是这样吗?
4.2 PSRAM性能实测
PSRAM性能测试使用rt-thread自带的MemoryPerf工具。
下图是4KB数据读写性能。

这也太快了吧!!读写带宽怎么超过了QSPI总线带宽?因为XIP系统里有个16KB的cache,4KB数据的读写全在cache里完成了。实际测了个cache性能。
下图是64KB数据读写性能。

这次读性能就正常了,最大28.6MB/s。PSRAM写性能由于PSRAM内部机制的原因本身就比读性能低不少,一般只有读性能的40%左右,这里测得最大9.6MB/s,还算正常。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)