ESP32-S3 Flash and PSRAM: N8R8 vs N16R8 and Correct Settings

ESP32-S3 N8R8 vs N16R8 explained: flash and PSRAM sizes, QIO vs OPI, correct Arduino IDE and PlatformIO settings, diagnostics and common boot errors.

ESP32-S3 N8R8 and N16R8 boards have the same 8 MB of PSRAM. The difference is flash capacity: N8R8 has 8 MB flash, while N16R8 has 16 MB flash. On the common ESP32-S3-WROOM-1 versions, that flash is Quad SPI and the 8 MB PSRAM is Octal SPI. That detail matters because the correct configuration is normally QIO flash + OPI PSRAM, not OPI for both.

This is one of the most common ESP32-S3 setup traps. A board may upload successfully with the wrong memory options and then report no PSRAM, reboot under load, fail during early boot or use only part of the physical flash. The fix is not to guess from the board colour or seller title. Read the module code printed on the metal shield and configure the software for that exact memory combination.

This guide focuses on the mainstream ESP32-S3-WROOM-1 N8R8 and N16R8 configurations used on DevKit-style boards and many third-party ESP32-S3 boards. WROOM-2 and some high-memory variants use a different memory interface and are covered separately below.

What N8R8 and N16R8 Actually Mean

Module codeFlashPSRAMTypical interface
N88 MBNoneQuad-SPI flash
N1616 MBNoneQuad-SPI flash
N4R24 MB2 MBQuad flash + Quad PSRAM
N8R28 MB2 MBQuad flash + Quad PSRAM
N16R216 MB2 MBQuad flash + Quad PSRAM
N8R88 MB8 MBQuad flash + Octal PSRAM
N16R816 MB8 MBQuad flash + Octal PSRAM
N16R16V16 MB16 MBQuad flash + Octal PSRAM on current WROOM-1 variants

The naming becomes easier once you separate the two parts. The N8 or N16 portion identifies the module’s flash capacity in megabytes. The R8 portion identifies 8 MB of PSRAM. So N16R8 is not a faster processor and it does not contain twice as much RAM as N8R8. It simply gives the firmware and filesystem twice as much non-volatile flash storage.

That also means an N8R8 board and an N16R8 board can run the same application with almost identical RAM behaviour. If an LVGL interface, camera frame buffer or audio project needs more working memory, moving from N8R8 to N16R8 does not increase the 8 MB PSRAM pool.

For the wider module range, see our ESP32-S3 boards, modules and variants comparison. It explains WROOM-1, WROOM-2, MINI, DevKitC and the other memory suffixes in one place.

N8R8 vs N16R8: What Changes in Practice?

FeatureN8R8N16R8
Flash capacity8 MB16 MB
PSRAM capacity8 MB8 MB
PSRAM typeOctal SPIOctal SPI
Typical WROOM-1 flash typeQuad SPIQuad SPI
CPU performanceSame ESP32-S3 classSame ESP32-S3 class
Large frame buffersSame PSRAM headroomSame PSRAM headroom
Large firmware / assetsGoodMore headroom
Large LittleFS / SPIFFS partitionUp to available 8 MB layoutCan use a larger 16 MB layout
OTA flexibilityGoodBetter for large dual-app partitions

The 16 MB version becomes useful when the project stores large fonts, web assets, images, audio clips, machine-learning models or a sizeable local filesystem. It also gives more freedom when you want two large OTA application slots. For an ordinary ESPHome sensor, relay controller or small Arduino project, the extra 8 MB of flash may make no practical difference.

Do not confuse flash with RAM. Flash keeps firmware and files when power is removed. PSRAM is working memory used while the application is running. More flash does not give a camera another frame buffer and does not give LVGL more heap.

The Important Part: QIO Flash and OPI PSRAM

On ESP32-S3-WROOM-1-N8R8 and ESP32-S3-WROOM-1-N16R8, the normal combination is:

  • Flash mode: QIO / Quad SPI
  • PSRAM mode: OPI / Octal SPI

This is why a configuration string such as qio_opi appears so often for S3 boards with 8 MB PSRAM. The first part describes the flash interface; the second describes the PSRAM interface.

Setting both memories to OPI is not a harmless performance upgrade. The software configuration has to match the hardware. Espressif explicitly distinguishes Quad flash from Octal PSRAM in the WROOM-1 module table and recommends selecting the PSRAM type according to the actual module.

Do not generalise this rule to every ESP32-S3 module. WROOM-2 high-memory variants can use Octal flash as well as Octal PSRAM. A WROOM-2 board therefore may require an OPI/OPI configuration. Read the complete module code first.

How to Identify Your ESP32-S3 Module

Ignore vague listings such as “ESP32-S3 16M” or “ESP32-S3 with PSRAM”. Look at the metal RF shield on the module itself. You are looking for a marking similar to:

ESP32-S3-WROOM-1
N8R8

or:

ESP32-S3-WROOM-1
N16R8

The suffix can be very small. A phone camera with good lighting is often easier than trying to read it directly. If the module says only N8 or N16 with no R suffix, do not assume PSRAM is present.

Also distinguish the module from the complete development board. “ESP32-S3-DevKitC-1” describes the board. “ESP32-S3-WROOM-1-N8R8” describes the module fitted to it. Two visually similar boards can therefore need different flash-size or PSRAM settings.

Correct Arduino IDE Settings for N8R8

If your board has its own accurate Arduino definition, use that first. For a generic ESP32-S3 board using ESP32S3 Dev Module, these are the important settings for a WROOM-1 N8R8 module:

Arduino optionN8R8 setting
BoardESP32S3 Dev Module, or the exact board profile
Flash Size8 MB
Flash ModeQIO
PSRAMOPI PSRAM
CPU Frequency240 MHz for normal S3 use
Flash Frequency80 MHz is the normal WROOM-1 starting point
Partition SchemeChoose an 8 MB-compatible layout for the project

USB CDC, upload mode and USB mode depend on how the particular development board connects its USB socket. Those options do not change whether the module physically contains 8 MB PSRAM.

Correct Arduino IDE Settings for N16R8

N16R8 uses the same PSRAM type as N8R8. The main configuration change is the flash capacity:

Arduino optionN16R8 setting
BoardESP32S3 Dev Module, or the exact board profile
Flash Size16 MB
Flash ModeQIO
PSRAMOPI PSRAM
CPU Frequency240 MHz for normal S3 use
Flash Frequency80 MHz is the normal WROOM-1 starting point
Partition SchemeChoose a layout that fits 16 MB if you want to use the extra capacity

The most common mistake is selecting 16 MB flash but leaving an 8 MB partition layout. The board can still boot, but the application will not automatically gain a larger filesystem or larger OTA slots. Flash size tells the toolchain how much physical flash exists; the partition table decides how that flash is divided.

Flash Size and Partition Scheme Are Different Settings

An N16R8 board physically contains 16 MB of flash, but your project can deliberately use less. A partition table might reserve space for two OTA applications, NVS and a filesystem, or it might give most of the flash to one large application and local files.

Think of the two options separately:

  • Flash Size = how much flash hardware is installed.
  • Partition Scheme = how that installed flash is divided between apps and data.

If you upgrade a project from N8R8 to N16R8 but keep exactly the same 8 MB partition map, it may behave exactly as before and leave the upper part of the flash unused. That is not a fault. Change the partition layout only when the project actually needs the extra space.

Conversely, do not select a 16 MB partition layout for hardware that physically contains only 8 MB. Espressif warns that an incorrect flash-size or partition configuration can produce startup and runtime failures.

Quick Arduino Test: Check Flash and PSRAM

Before debugging a display, camera or large application, upload a minimal sketch and check what the running firmware sees.

#include <Arduino.h>

void setup() {
  Serial.begin(115200);
  delay(1500);

  Serial.printf("Chip: %s\n", ESP.getChipModel());

  Serial.printf("Flash: %.2f MB\n",
                ESP.getFlashChipSize() / 1048576.0);

  Serial.printf("PSRAM total: %.2f MB\n",
                ESP.getPsramSize() / 1048576.0);

  Serial.printf("PSRAM free: %.2f MB\n",
                ESP.getFreePsram() / 1048576.0);

  Serial.printf("Internal heap free: %.2f KB\n",
                ESP.getFreeHeap() / 1024.0);
}

void loop() {
  delay(1000);
}

An N8R8 build should report roughly 8 MB of flash and a usable PSRAM total close to the installed 8 MB. An N16R8 build should report roughly 16 MB of flash and the same 8 MB-class PSRAM capacity.

The exact usable PSRAM figure can be lower than the nominal capacity because the runtime reserves memory and reports what is available to the system rather than a marketing label. The important red flag is 0 bytes of PSRAM on a module that is marked R8.

PlatformIO Settings for N8R8

With PlatformIO and the generic ESP32-S3 DevKitC definition, the important Arduino memory combination for a WROOM-1 N8R8 module is QIO flash plus OPI PSRAM:

[env:esp32-s3-n8r8]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino

board_build.flash_mode = qio
board_build.arduino.memory_type = qio_opi
board_upload.flash_size = 8MB

build_flags =
  -DBOARD_HAS_PSRAM

monitor_speed = 115200

The board definition or framework version can supply additional defaults such as flash frequency and partitions. Add an explicit partition CSV only when you need a particular OTA/filesystem layout. Do not copy a random 16 MB partition file into an 8 MB N8R8 project.

PlatformIO Settings for N16R8

The PSRAM setting stays the same. Increase the physical flash size and select a suitable partition layout if the application needs to use the extra flash:

[env:esp32-s3-n16r8]
platform = espressif32
board = esp32-s3-devkitc-1
framework = arduino

board_build.flash_mode = qio
board_build.arduino.memory_type = qio_opi
board_upload.flash_size = 16MB

build_flags =
  -DBOARD_HAS_PSRAM

monitor_speed = 115200

For a larger filesystem or OTA layout, set board_build.partitions to a 16 MB-compatible partition CSV supplied by your installed framework, or use a custom table designed for the project. Current Arduino-ESP32 packages include 16 MB-oriented partition files, but the exact file names and menu choices can change between core versions.

The key line is board_build.arduino.memory_type = qio_opi: Quad-I/O flash, Octal-I/O PSRAM. That matches the common WROOM-1 N8R8/N16R8 hardware combination.

Do Not Use qio_opi for Every ESP32-S3

qio_opi is correct for many popular 8 MB PSRAM S3 boards, but it is not a universal ESP32-S3 setting.

Memory combinationTypical configuration idea
Quad flash, no PSRAMQIO flash; PSRAM disabled
Quad flash + 2 MB Quad PSRAMQIO + QSPI PSRAM
Quad flash + 8 MB Octal PSRAMQIO + OPI PSRAM
Octal flash + Octal PSRAMOPI + OPI; module-specific

Espressif’s WROOM-2 family is the obvious reason not to copy settings blindly. Some WROOM-2 variants use Octal flash as well as Octal PSRAM. A configuration copied from a WROOM-1 N8R8 guide can therefore be wrong even though both modules contain 8 MB of PSRAM.

Why PSRAM Can Show as Zero

If an R8 module reports no PSRAM, check the configuration before assuming the board is defective.

  • Confirm the module really says R8.
  • Use OPI PSRAM for WROOM-1 N8R8/N16R8.
  • Do not select QSPI PSRAM just because the flash uses QIO.
  • Update the ESP32 Arduino core or PlatformIO platform if the board profile is old.
  • Use the minimal memory diagnostic before adding camera, display or filesystem code.

A wrong PSRAM mode can manifest as zero detected memory, early crashes or failures only when a large buffer is allocated. The code may compile perfectly because the problem is the runtime memory interface, not the C++ syntax.

Boot Loops After Changing Flash or PSRAM Settings

If the board worked before you changed memory settings and now repeatedly resets, return to the hardware markings and simplify the configuration.

SymptomLikely first check
PSRAM reports 0Wrong PSRAM mode or no PSRAM fitted
Boot loop immediately after flashingFlash/PSRAM interface mismatch or unsuitable flash frequency
N16R8 reports only 8 MB flashWrong flash-size setting or board definition
16 MB board works but filesystem is still smallPartition table still uses a smaller layout
Large buffer allocation failsAllocation still using internal RAM, PSRAM disabled, or fragmented memory
Random instability after selecting 120 MHz flashReturn to the module-supported/default flash frequency

For mainstream WROOM-1 modules, 80 MHz is the sensible flash-frequency starting point. A higher menu option existing in the IDE does not mean every module and PCB is specified to use it.

PSRAM Does Not Replace Internal SRAM

Another source of confusion is assuming that enabling 8 MB PSRAM gives every allocation a huge new heap automatically. The ESP32-S3 still has internal SRAM, and some data structures, DMA buffers, stacks and time-critical allocations need internal memory or specific capabilities.

PSRAM is most useful for large frame buffers, images, fonts, audio buffers, caches and application data that can tolerate the external-memory access path. A program can therefore report several megabytes of free PSRAM and still fail because a particular allocation requires internal RAM.

For graphics and camera projects, check the library’s allocation API rather than assuming a normal malloc() will always place the largest buffer where you expect it. The correct memory hardware setting is only the first step.

GPIO 35–37 and Octal Memory Boards

Memory choice can also affect pin availability. On ESP32-S3 boards using certain Octal-memory configurations, GPIO35, GPIO36 and GPIO37 can be committed internally and should not be treated as universally available user GPIOs.

If you are using an official DevKitC-1 or a board that copies its layout, check the exact module and board pinout before assigning those pins. Our ESP32-S3 DevKitC-1 pinout and safe GPIO guide covers the memory-dependent GPIO restrictions, native USB pins and board revisions.

When Is N16R8 Worth Buying?

N16R8 is useful when your project is constrained by flash storage, not by working RAM.

ProjectN8R8N16R8 advantage
ESPHome sensors and relaysMore than enough in most casesUsually little benefit
USB HID / MIDI / serialUsually enoughUseful only with large assets
Camera streamingExcellent 8 MB PSRAMSame PSRAM; more local storage
LVGL displayExcellent 8 MB PSRAMMore fonts/images/files
Large web interfaceGoodMore room for local assets
Dual OTA imagesGoodMore flexibility for large firmware
Audio prompts / local mediaUsableExtra flash can be valuable

If the price difference is small, N16R8 is a nice convenience. But do not buy it expecting twice the camera performance or twice the UI memory. Both N8R8 and N16R8 have the same 8 MB PSRAM.

Which One Should You Choose?

Choose N8R8 for the best general-purpose ESP32-S3 balance. Eight megabytes of flash and 8 MB of PSRAM is already enough for demanding Arduino, ESPHome, camera, display, audio and USB projects.

Choose N16R8 when you know you need more flash for filesystem data, large firmware, OTA partitions, local web assets, fonts, images or audio. It gives more storage headroom without changing the PSRAM architecture.

For most users, the configuration matters more than the difference between the two. A correctly configured N8R8 will outperform an N16R8 board that is running with the wrong PSRAM mode, incorrect flash size or unsuitable partition table.

ESP32-S3 N8R8 and N16R8 FAQ

Does N16R8 have more RAM than N8R8?

No. Both have 8 MB PSRAM. N16R8 has 16 MB flash instead of 8 MB.

Should N8R8 use OPI flash mode?

Not on the common ESP32-S3-WROOM-1-N8R8. Its flash is Quad SPI while the 8 MB PSRAM is Octal SPI, so the usual combination is QIO flash and OPI PSRAM.

What does qio_opi mean in PlatformIO?

For the common S3 Arduino memory configuration, it describes Quad-I/O flash with Octal-I/O PSRAM. It is appropriate for WROOM-1 N8R8 and N16R8, but not for every S3 module.

Why does my N16R8 only have a small filesystem?

Because physical flash size and partition layout are separate. Select or create a partition table that actually allocates the additional flash to the filesystem or OTA partitions.

Can I use 120 MHz flash on N8R8 or N16R8?

Do not select a higher frequency simply because the menu offers it. The mainstream WROOM-1 module documentation uses 80 MHz as the normal maximum unless a higher-speed requirement is specifically supported for the module and board design.

Related ESP32 Guides

Datasheets & External Resources

Memory combinations and configuration guidance were checked against current Espressif documentation. Always match the settings to the complete module code printed on your own hardware.

Share your love