Skip to content
thesavantidiot edited this page Apr 18, 2026 · 1 revision

MCU Targets — Running an LLM on ESP32, STM32, RP2040

Which microcontroller can run which model?

ATOME is designed to run on the cheapest hardware possible. Here is the full compatibility matrix, tested with realistic RAM accounting (including all pathway scratch buffers, KV cache, and router weights).

Compatibility matrix

MCU RAM Flash atome-nano (14KB) atome-micro (52KB) atome-mini (103KB) atome-base (205KB)
ESP32-S3 512 KB 8 MB YES YES YES YES
ESP32-C3 400 KB 4 MB YES YES YES YES
RP2040 264 KB 2 MB YES YES YES NO
STM32F4 256 KB 1 MB YES YES YES NO
nRF52840 256 KB 1 MB YES YES YES NO

RAM accounting reserves 30% for stack, heap, and RTOS overhead.

Model configurations

atome-nano — fits everywhere

#define ATOME_D_MODEL    32
#define ATOME_MAX_SEQ    16
#define ATOME_N_LAYERS   2
#define ATOME_N_PATHWAYS 3
  • 10K parameters, 2.5 KB weights, ~14 KB RAM
  • Good for: wake-word detection, simple classification, anomaly detection
  • Runs on: every MCU with >20 KB RAM

atome-micro — the sweet spot

#define ATOME_D_MODEL    64
#define ATOME_MAX_SEQ    32
#define ATOME_N_LAYERS   4
#define ATOME_N_PATHWAYS 3
  • 50K parameters, 12 KB weights, ~52 KB RAM
  • Good for: intent classification, short text generation, sensor pattern recognition
  • Runs on: ESP32, STM32F4, RP2040, nRF52840, and anything with >64 KB RAM

atome-mini — for capable chips

#define ATOME_D_MODEL    128
#define ATOME_MAX_SEQ    32
#define ATOME_N_LAYERS   4
#define ATOME_N_PATHWAYS 3
  • 200K parameters, 50 KB weights, ~103 KB RAM
  • Good for: multi-turn interaction, longer generation, complex classification
  • Runs on: ESP32 family, RP2040

atome-base — maximum capability

#define ATOME_D_MODEL    256
#define ATOME_MAX_SEQ    32
#define ATOME_N_LAYERS   4
#define ATOME_N_PATHWAYS 3
  • 500K parameters, 125 KB weights, ~205 KB RAM
  • Good for: the most demanding on-device tasks
  • Runs on: ESP32-S3 (512 KB RAM), ESP32-C3 (400 KB RAM)

Where do weights live?

Model weights are stored in flash/ROM, not RAM. The atome_model_t struct contains only pointers into flash. Only the inference state (atome_state_t) consumes RAM.

This means a chip with 256 KB RAM and 1 MB flash can hold a model with up to ~250 KB of weights while still having room for inference buffers.

Cross-compilation

ARM Cortex-M (STM32)

arm-none-eabi-gcc -O2 -std=c99 -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -c atome.c

ESP32 (ESP-IDF)

Add atome.c and atome.h to your ESP-IDF component. Set the defines in your CMakeLists.txt or in a config header included before atome.h.

RP2040 (Pico SDK)

Add atome.c to your CMakeLists.txt sources. The Pico SDK provides a standard C99 environment.

Real-world applications by target

Application Recommended model Target MCU
Smart bulb voice commands atome-nano ESP32-C3
Wearable intent detection atome-micro nRF52840
Industrial sensor anomaly atome-micro STM32F4
Robot command parsing atome-mini ESP32-S3
IoT gateway text processing atome-base ESP32-S3