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 code | Flash | PSRAM | Typical interface |
|---|---|---|---|
| N8 | 8 MB | None | Quad-SPI flash |
| N16 | 16 MB | None | Quad-SPI flash |
| N4R2 | 4 MB | 2 MB | Quad flash + Quad PSRAM |
| N8R2 | 8 MB | 2 MB | Quad flash + Quad PSRAM |
| N16R2 | 16 MB | 2 MB | Quad flash + Quad PSRAM |
| N8R8 | 8 MB | 8 MB | Quad flash + Octal PSRAM |
| N16R8 | 16 MB | 8 MB | Quad flash + Octal PSRAM |
| N16R16V | 16 MB | 16 MB | Quad 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?
| Feature | N8R8 | N16R8 |
|---|---|---|
| Flash capacity | 8 MB | 16 MB |
| PSRAM capacity | 8 MB | 8 MB |
| PSRAM type | Octal SPI | Octal SPI |
| Typical WROOM-1 flash type | Quad SPI | Quad SPI |
| CPU performance | Same ESP32-S3 class | Same ESP32-S3 class |
| Large frame buffers | Same PSRAM headroom | Same PSRAM headroom |
| Large firmware / assets | Good | More headroom |
| Large LittleFS / SPIFFS partition | Up to available 8 MB layout | Can use a larger 16 MB layout |
| OTA flexibility | Good | Better 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 option | N8R8 setting |
|---|---|
| Board | ESP32S3 Dev Module, or the exact board profile |
| Flash Size | 8 MB |
| Flash Mode | QIO |
| PSRAM | OPI PSRAM |
| CPU Frequency | 240 MHz for normal S3 use |
| Flash Frequency | 80 MHz is the normal WROOM-1 starting point |
| Partition Scheme | Choose 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 option | N16R8 setting |
|---|---|
| Board | ESP32S3 Dev Module, or the exact board profile |
| Flash Size | 16 MB |
| Flash Mode | QIO |
| PSRAM | OPI PSRAM |
| CPU Frequency | 240 MHz for normal S3 use |
| Flash Frequency | 80 MHz is the normal WROOM-1 starting point |
| Partition Scheme | Choose 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 combination | Typical configuration idea |
|---|---|
| Quad flash, no PSRAM | QIO flash; PSRAM disabled |
| Quad flash + 2 MB Quad PSRAM | QIO + QSPI PSRAM |
| Quad flash + 8 MB Octal PSRAM | QIO + OPI PSRAM |
| Octal flash + Octal PSRAM | OPI + 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.
| Symptom | Likely first check |
|---|---|
| PSRAM reports 0 | Wrong PSRAM mode or no PSRAM fitted |
| Boot loop immediately after flashing | Flash/PSRAM interface mismatch or unsuitable flash frequency |
| N16R8 reports only 8 MB flash | Wrong flash-size setting or board definition |
| 16 MB board works but filesystem is still small | Partition table still uses a smaller layout |
| Large buffer allocation fails | Allocation still using internal RAM, PSRAM disabled, or fragmented memory |
| Random instability after selecting 120 MHz flash | Return 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.
| Project | N8R8 | N16R8 advantage |
|---|---|---|
| ESPHome sensors and relays | More than enough in most cases | Usually little benefit |
| USB HID / MIDI / serial | Usually enough | Useful only with large assets |
| Camera streaming | Excellent 8 MB PSRAM | Same PSRAM; more local storage |
| LVGL display | Excellent 8 MB PSRAM | More fonts/images/files |
| Large web interface | Good | More room for local assets |
| Dual OTA images | Good | More flexibility for large firmware |
| Audio prompts / local media | Usable | Extra 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
- ESP32-S3 boards, modules and variants compared — WROOM, MINI, DevKitC and memory suffixes.
- ESP32-S3 DevKitC-1 pinout and safe GPIOs — including memory-dependent pin restrictions.
- ESP32 vs ESP32-S3 — CPU, USB, Bluetooth, GPIO and memory differences.
- ESP32 versions compared — choosing between S3, C3, C6, C5, H2 and other families.
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.
- ESP32-S3-WROOM-1 / WROOM-1U datasheet — official flash and PSRAM combinations.
- Arduino-ESP32 troubleshooting: identify module and PSRAM type.
- Arduino-ESP32 Tools menu — flash mode, flash size, partition and PSRAM options.
- ESP-IDF flash and PSRAM configuration — Quad/Octal modes and supported memory combinations.
- PlatformIO Espressif32 platform documentation — flash-mode and PSRAM build configuration.