PSRAM

PSRAM是一种兼具DRAM和SRAM优点的存储器,提供SRAM的易用性和DRAM的成本效益。相比于 SRAM,PSRAM 速度稍慢但成本和功耗更低;相比于 Flash,PSRAM 速度更快,但不具备非易失性。

PSRAM 适用于需要较快存储速度的场景。RTL87x2G 目前无法使用外置的 PSRAM,RTL87x2G 系列中部分型号包含内置的 PSRAM,PSRAM 型号为 W955D8MKY。 使用时,用户可参考 RTL876x2G 对应型号的 datasheet 来确认是否支持 PSRAM。下文介绍 PSRAM 的使用方式。

初始化步骤

  1. Config file 中设定 PSRAM 上电选项,PSRAM Power Supply 设定为 Enable,内部会给 PSRAM 提供 1.8V 的电。否则,PSRAM 处于断电状态,不会有任何功耗产生。

../../../../_images/Config_File_Setting.png

Config File 设定

  1. mem_config.h 中定义 USE_PSRAM 的宏( #define USE_PSRAM 1 ),定义 USE_PSRAM 后会自动调用 psram_winbond_opi_init() 来完成 PSRAM 的初始化设定。

  2. 初始化后默认 PSRAM clock 为 20MHz,可以调用函数 fmc_psram_clock_switch() 来切换 PSRAM clock,一般推荐直接切换到 PSRAM 80MHz,具体说明及示例如下:

    函数名

    fmc_psram_clock_switch

    函数原型

    bool fmc_psram_clock_switch(PSRAM_IDX_TYPE idx, uint32_t required_mhz, uint32_t *actual_mhz)

    功能描述

    设定 PSRAM clock

    输入参数

    required_mhz:PSRAM clock 目标速度 X 2(最高设定为 160MHz,对应到 PSRAM 为 80MHz)

    actual_mhz:返回实际切换到的数值,clock 切换成功的情况下 actual_mhz = required_mhz

    先决条件

    uint32_t actual_mhz;
    fmc_psram_clock_switch(PSRAM_IDX_SPIC1, 160, &actual_mhz);
    

读写操作

PSRAM 读写操作与操作普通 RAM 的方式一致,直接访问 psram 地址(memcpy,memset)无需使用 driver,示例如下:

#define PSRAM_ADDR        0x08000000
#define TEST_ADDR         0x00100000
memcpy((uint8_t *) PSRAM_ADDR, (uint8_t *) TEST_ADDR, 1024);   //write

备注

PSRAM 型号仅支持 W955D8MKY,起始地址是 0x8000000,大小为 4MB。

低功耗设置

PSRAM 本身提供了两种低功耗模式:

  • DPD (Deep Power Down) mode
    若使用 DPD mode,在进入 low power mode(DLPS)后 PSRAM 中所有的内容都会丢失。
  • Hybrid Sleep mode
    若使用 Hybrid Sleep mode,用户可以选择 PSRAM 的部分区域在进出 DLPS 后内容不丢失,功耗 相对会增加。

为了用户使用方便,在系统低功耗模式中集成了 PSRAM 低功耗设定,用户可以修改以下两个部分来选择需要使用的 PSRAM 低功耗模式。

  1. io_dlps.c 文件中添加 #define USE_PSRAM_DEEP_POWER_HALF_SLEEP_MODE 1 来选择 Hybrid Sleep mode,否则会使用 DPD mode。

  2. 若用户选择 Hybrid Sleep mode,可以修改 io_dlps.c 文件中函数 fmc_psram_wb_set_partial_refresh() 的第二个参数,来选择进出 DLPS 后不丢失内容的区域。

    函数名

    fmc_psram_wb_set_partial_refresh

    函数原型

    bool fmc_psram_wb_set_partial_refresh(FMC_FLASH_NOR_IDX_TYPE idx, FMC_PSRAM_WB_PARTIAL_ARRAY_REFRESH partial)

    功能描述

    设定 PSRAM 部分区域在进出低功耗模式后内容不丢失

    输入参数

    FMC_FLASH_NOR_IDX_TYPE:默认设定为 FMC_FLASH_NOR_IDX1

    FMC_PSRAM_WB_PARTIAL_ARRAY_REFRESH:可以设定以下值

    • FMC_PSRAM_WB_REFRESH_FULL

    • FMC_PSRAM_WB_REFRESH_BOTTOM_1_2

    • FMC_PSRAM_WB_REFRESH_BOTTOM_1_4

    • FMC_PSRAM_WB_REFRESH_BOTTOM_1_8

    • FMC_PSRAM_WB_REFRESH_TOP_1_2

    • FMC_PSRAM_WB_REFRESH_TOP_1_4

    • FMC_PSRAM_WB_REFRESH_TOP_1_8

    先决条件

    备注

    内容不丢失的区域越大 功耗 会越高。

    使用举例:(例子中选择了 Hybrid Sleep mode,并选择 PSRAM 后半区域进出 DLPS 后内容不丢失)

    #define USE_PSRAM_DEEP_POWER_HALF_SLEEP_MODE  1
    
    #if USE_PSRAM
    #if USE_PSRAM_DEEP_POWER_HALF_SLEEP_MODE
      fmc_psram_wb_set_partial_refresh(FMC_FLASH_NOR_IDX1, FMC_PSRAM_WB_REFRESH_TOP_1_2);
      fmc_psram_enter_lpm(FMC_FLASH_NOR_IDX1, FMC_PSRAM_LPM_HALF_SLEEP_MODE);
    #else
      fmc_psram_enter_lpm(FMC_FLASH_NOR_IDX1, FMC_PSRAM_LPM_DEEP_POWER_DOWN_MODE);
    #endif
    
    #else
      shut_down_spic_pad_imp(FMC_FLASH_NOR_IDX1, true);
    
    #endif
    

功耗数据

W955D8MKY 的功耗数据如下表所示,其工作电压为 1.8V。

功耗数据

Power mode

Retention region

Current(uA)

Hybrid Sleep mode

Full Array

20

Bottom 1/2 Array

18

Bottom 1/4 Array

16

Bottom 1/8 Array

15

Top 1/2 Array

18

Top 1/4 Array

16

Top 1/8 Array

15

Deep power down mode

0~0.2