1.摘要

记录一下如何打开并使用ESP32的PSRAM,以及一些设置的注意事项。首先贴上Espressif乐鑫官方的关于PSRAM的wiki页面:使用 ESP32 模组

2.实际操作

实际操作并不复杂,如果是使用idf.py,那么需要先在 make menuconfig 中配置开启 PSRAM 功能,以便正确启用和配置 PSRAM。由于我是在VSCODE中操作的,有个更直观的可视化界面,因此本文以VSCODE中的esp-idf menuconfig为例,实际两者操作应该大同小异。
不同模块的配置应该会有些微的差异,本文以ESP32-S3 N8R8为例。以下为总的配置:

3.需要注意的配置

勾选Support for external, SPI-connected RAM之后,就会出现更多关于psram的配置选项,下面列出几个认为比较重要的配置:

  • Mode (QUAD/OCT) of SPI RAM chip in use

    • QUAD 模式:该模式使用 4 条数据线进行并行数据传输。这是最常用的模式,兼顾了速度和复杂性。
    • OCT 模式:该模式使用 8 条数据线进行并行数据传输,相比 QUAD 模式有更高的数据传输速率,但通常需要更复杂的硬件支持。
  • Type of SPIRAM chip in use
    这里选择自动检测即可,如果确实没检测到,也可以尝试更换。

  • Set RAM clock speed
    这里比较重要,该选项应该与Flash SPI中的时钟保持一致

  • SPI RAM access method
    这个配置涉及到 ESP32 中的 SPI RAM 访问方法的设置。让我们逐个解释三种模式:

    • Make RAM allocatable using malloc() as well:
      这种模式允许将 SPI RAM 集成到系统的内存分配机制中,使得可以通过标准的 malloc() 函数来分配 SPI RAM 的内存。在这种模式下,ESP32 的堆内存中的一部分将被用作 SPI RAM,因此可以使用 malloc() 来动态分配 SPI RAM 的内存。这使得编程变得更加简单,因为可以使用标准的内存分配函数来管理 SPI RAM 的内存。

    • The SPI RAM can be accessed in multiple methods: by just having it available as an unmanaged memory region in the CPU’s memory map:
      这种模式下,SPI RAM 将作为 CPU 内存映射中的一个不受管理的内存区域,即它不会被堆管理系统管理。在这种模式下,如果需要使用 SPI RAM,必须通过专门的 API 或库函数来访问它,而不能直接使用标准的内存分配函数。

    • By integrating it in the heap as ‘special’ memory needing heap_caps_malloc to allocate:
      这种模式下,SPI RAM 被集成到系统的堆内存中,但它被视为一种特殊的内存类型,需要使用 heap_caps_malloc() 函数来分配。这意味着可以使用标准的 malloc() 函数来分配内部 RAM,但是要分配 SPI RAM,需要使用 heap_caps_malloc() 函数,并指定相应的内存类型标志。

  • Enable SPI RAM ECC
    访问 SPIRAM 时启用 MSPI 纠错码功能。如果启用,SPI RAM 总大小的 1/16 将保留用于纠错代码。