PSRAM

PSRAM是一种结合了DRAM和SRAM优点的存储器,具有SRAM的易用性和DRAM的成本效益。相比于SRAM,PSRAM速度稍慢但成本和功耗更低;相比于Flash,PSRAM速度更快,但不具备非易失性。 PSRAM适用于需要较快存储速度的场景。RTL87x2G目前无法使用外置的PSRAM,RTL8762GTP、RTL8772GWP、RTL8772GWP-VI、RTL8772GWP-VM、RTL8772GWP-VA包含内置的PSRAM,型号为W955D8MKY。 下文介绍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, 可以调用函数 pm_spic1_freq_set() 来切换PSRAM clock,一般推荐直接切换到PSRAM 80MHz,具体说明及示例如下:

    函数名

    pm_spic1_freq_set

    函数原型

    int32_t pm_spic1_freq_set(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;
    pm_spic1_freq_set(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

    先决条件

    备注

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

    PSRAM低功耗使用举例(例子中选择了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
    

    功耗数据如下:

    功耗数据

    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