---
title: MCU Selection and Development Ecosystem
url: https://doc.liz6.com/en/hardware/09-embedded-systems/01-mcu-selection-and-development-ecosystem
locale: en
area: hardware
tags:
- hardware
- embedded-systems
date: 2026-06-30
modified: 2026-07-16
description: MCU Selection and Development Ecosystem Why Selection is Necessary You've learned about components and circuit analysis, but the first step in actual developmen…
---

# MCU Selection and Development Ecosystem

## Why Selection is Necessary

You've learned about components and circuit analysis, but the first step in actual development is: **Which chip to choose?**

Wrong choice → Insufficient performance / Too expensive / Out of stock / Poor ecosystem → Project failure

---

## Mainstream MCU Families

### STM32 (STMicroelectronics) — The King of Industrial/General Purpose

```
Product Line (by Core):
  STM32F0/F1: Cortex-M0/M3, Entry-level (48~72MHz)
  STM32F4:     Cortex-M4 + FPU + DSP, Performance (84~180MHz)
  STM32F7:     Cortex-M7, High Performance (216MHz+)
  STM32G0/G4: Cortex-M0+/M4, Mainstream Low Power
  STM32H5/H7: Cortex-M33/M7, Flagship (250MHz+)
  STM32L0/L4/L5: Ultra-Low Power
  STM32WB/WL: Wireless (BLE/LoRa)
  STM32MP1:   Cortex-A7 + M4, Linux + RTOS Dual-Core

Naming: STM32F407VGT6
      F=Series  407=Model  V=Package (100pin)  G=Flash (1MB)  T=LQFP  6=Temp Grade

Ecosystem:
  Tools: STM32CubeMX (Pin config + Clock tree + Code generation)
   IDE: STM32CubeIDE (Free), Keil, IAR
   HAL/LL Libraries: Official drivers
   OpenOCD + ST-Link Debugging
```

### ESP32 (Espressif) — The Cost-Effective King of WiFi/BLE

```
Family:
  ESP32 (Xtensa LX6): Dual-core 240MHz, WiFi 4 + BLE 4.2
  ESP32-S3: Single-core Xtensa LX7, WiFi 4 + BLE 5, AI Acceleration
  ESP32-C3: Single-core RISC-V, WiFi 4 + BLE 5, Low Power
  ESP32-C6: RISC-V, WiFi 6 + BLE 5.3 + Thread/Zigbee
  ESP32-S2: Single-core, WiFi only (No BLE), USB OTG

Features:
  ✓ Integrated WiFi + BLE → Top choice for IoT
  ✓ Low cost (ESP32-C3 module ~¥8)
  ✓ Dual ecosystem: Arduino / ESP-IDF
  ✗ Non-linear ADC (Don't use for precision measurement)
  ✗ Power consumption not as low as nRF
  ✗ Fewer pins (especially ESP32-C3, limited GPIO)

When to choose ESP:
  - Need WiFi or BLE
  - Low-cost IoT
  - Rapid prototyping (Arduino ecosystem)
  - Smart home / Sensor nodes
```

### nRF52/nRF53 (Nordic) — The Benchmark for Low-Power Wireless

```
Family:
  nRF52832: Cortex-M4F, BLE 5.0 (Classic)
  nRF52840: Cortex-M4F, BLE 5.0 + Thread/Zigbee + USB
  nRF52833: Reduced version of 52840 (No USB, Smaller Flash)
  nRF5340: Dual-core M33 (app+network), BLE 5.4 + Thread + LE Audio
  nRF52810: Entry-level BLE

Features:
  ✓ Extremely low power (μA level in BLE connection)
  ✓ Excellent RF performance
  ✓ Native Zephyr RTOS support
  ✗ Expensive (2-3x more than ESP32)
  ✗ No WiFi (Only BLE/Thread/Zigbee)
  ✗ Steep learning curve (Zephyr/nRF Connect SDK)

When to choose nRF:
  - Battery-powered BLE devices (Running for months~years)
  - Need Thread/Zigbee + BLE
  - Strict power requirements
  - Production-grade (Not just prototypes)
```

### RP2040 (Raspberry Pi) — The Dark Horse with Dual-Core PIO

```
Specs:
  Dual-core Cortex-M0+ @133MHz
  264KB SRAM (Huge!)
  No built-in Flash (External QSPI, max 16MB)
  PIO (Programmable IO): 8 state machines, can simulate any protocol!
  ~$1 Retail Price

Features:
  ✓ Extremely cheap
  ✓ PIO is super flexible (VGA output / DVI / Custom protocols)
  ✓ Excellent documentation and community
  ✓ Large SRAM
  ✗ No WiFi/BLE (Needs external chip)
  ✗ No built-in Flash (Increases BOM)
  ✗ M0+ performance is average
  ✗ No DAC, Average ADC

When to choose RP2040:
  - Need I/O flexibility (PIO simulates various protocols)
  - Low cost for mass production
  - Education/Teaching
  - Integration with Raspberry Pi ecosystem
```

### ATmega / ATtiny (Microchip) — The Soul of Arduino

```
ATmega328P: Heart of Arduino Uno, 8bit AVR @16MHz
ATmega32U4: With USB, Arduino Leonardo/Micro
ATtiny85:  8pin, Extremely small projects

Features:
  ✓ Arduino ecosystem (Countless libraries and tutorials)
  ✓ 5V tolerant (A breath of fresh air in the 3.3V era)
  ✓ Simple, zero threshold to start
  ✗ Very weak (8bit, 16MHz, 2KB RAM)
  ✗ Expensive (For the performance provided)

Current Positioning: Extremely simple projects / 5V systems / Teaching
Actual Projects: Mostly replaced by ESP32/STM32/RP2040
```

---

## Selection Decision Tree

<svg viewBox="0 0 720 420" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="MCU Selection Decision Tree: Step-by-step filtering based on WiFi, BLE, Performance, Cost, Ease of Use">
  <defs><marker id="mcudt-arrow" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker></defs>
  <rect width="720" height="420" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">MCU Selection Decision Tree: Step-by-step filtering based on requirements</text>

  <rect x="40" y="50" width="290" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="185" y="71" text-anchor="middle" font-size="12.5" font-weight="700" fill="#3730a3">Need WiFi?</text>
  <line x1="333" y1="67" x2="460" y2="67" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="397" y="61" text-anchor="middle" font-size="10.5" fill="#64748b">Yes</text>
  <rect x="464" y="50" width="216" height="34" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="572" y="71" text-anchor="middle" font-size="12" font-weight="700" fill="#0f766e">ESP32 (Choose C3/S3 as needed)</text>
  <line x1="185" y1="84" x2="185" y2="102" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="200" y="97" font-size="10.5" fill="#64748b">No</text>

  <rect x="40" y="102" width="290" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="185" y="123" text-anchor="middle" font-size="12.5" font-weight="700" fill="#3730a3">Need BLE + Ultra-low Power?</text>
  <line x1="333" y1="119" x2="460" y2="119" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="397" y="113" text-anchor="middle" font-size="10.5" fill="#64748b">Yes</text>
  <rect x="464" y="102" width="216" height="34" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="572" y="123" text-anchor="middle" font-size="12" font-weight="700" fill="#0f766e">nRF52840</text>
  <line x1="185" y1="136" x2="185" y2="154" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="200" y="149" font-size="10.5" fill="#64748b">No</text>

  <rect x="40" y="154" width="290" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="185" y="175" text-anchor="middle" font-size="12.5" font-weight="700" fill="#3730a3">High Performance / Rich Peripherals?</text>
  <line x1="333" y1="171" x2="460" y2="171" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="397" y="165" text-anchor="middle" font-size="10.5" fill="#64748b">Yes</text>
  <rect x="464" y="154" width="216" height="34" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="572" y="175" text-anchor="middle" font-size="12" font-weight="700" fill="#0f766e">STM32F4 / H7</text>
  <line x1="185" y1="188" x2="185" y2="206" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="200" y="201" font-size="10.5" fill="#64748b">No</text>

  <rect x="40" y="206" width="290" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="185" y="227" text-anchor="middle" font-size="12.5" font-weight="700" fill="#3730a3">Ultra-low Cost + Flexible I/O?</text>
  <line x1="333" y1="223" x2="460" y2="223" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="397" y="217" text-anchor="middle" font-size="10.5" fill="#64748b">Yes</text>
  <rect x="464" y="206" width="216" height="34" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="572" y="227" text-anchor="middle" font-size="12" font-weight="700" fill="#0f766e">RP2040</text>
  <line x1="185" y1="240" x2="185" y2="258" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="200" y="253" font-size="10.5" fill="#64748b">No</text>

  <rect x="40" y="258" width="290" height="34" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="185" y="279" text-anchor="middle" font-size="12.5" font-weight="700" fill="#3730a3">Extremely Simple / 5V / Teaching?</text>
  <line x1="333" y1="275" x2="460" y2="275" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="397" y="269" text-anchor="middle" font-size="10.5" fill="#64748b">Yes</text>
  <rect x="464" y="258" width="216" height="34" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="572" y="279" text-anchor="middle" font-size="12" font-weight="700" fill="#0f766e">ATmega328P (Arduino)</text>
  <line x1="185" y1="292" x2="185" y2="310" stroke="#475569" stroke-width="1.6" marker-end="url(#mcudt-arrow)"/>
  <text x="200" y="305" font-size="10.5" fill="#64748b">No</text>

  <rect x="40" y="310" width="290" height="34" rx="8" fill="#f1f5f9" stroke="#cbd5e1"/>
  <text x="185" y="331" text-anchor="middle" font-size="12.5" font-weight="700" fill="#475569">Refer to specific project requirements</text>

  <rect x="40" y="360" width="640" height="46" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="56" y="379" font-size="12.5" fill="#3730a3">The decision order is the priority: Check WiFi first, then BLE low power, then performance and peripherals, then cost and I/O,</text>
  <text x="56" y="397" font-size="12.5" fill="#3730a3">finally check if simplicity and ease of use are desired—filter step-by-step from top to bottom, stop when matched.</text>
</svg>

---

## Recommended Development Boards

| Chip | Dev Board | Price | Debugger |
|------|--------|------|--------|
| STM32F4 | STM32F407G-DISC1 | ~$25 | On-board ST-Link |
| STM32F1 | Blue Pill (STM32F103C8T6) | ~$2 | Requires ST-Link |
| STM32G0 | Nucleo-G0B1RE | ~$15 | On-board ST-Link |
| ESP32 | ESP32-DevKitC / NodeMCU | ~$5 | Built-in USB-UART |
| ESP32-C3 | ESP32-C3-DevKitM-1 | ~$8 | Built-in USB-JTAG |
| nRF52840 | nRF52840-DK | ~$40 | On-board J-Link |
| nRF52840 | Seeed XIAO nRF52840 | ~$10 | Built-in |
| RP2040 | Raspberry Pi Pico | ~$4 | Requires debugger or USB drag-and-drop |
| ATmega | Arduino Uno R3 | ~$25 | Built-in bootloader |

---

## Toolchain Quick Reference

| Chip | IDE | Debug | Flash |
|------|-----|------|------|
| STM32 | STM32CubeIDE / PlatformIO | ST-Link + OpenOCD | ST-Link / DFU |
| ESP32 | PlatformIO / Arduino / ESP-IDF | Built-in USB-JTAG (C3/S3) | USB UART |
| nRF52 | VS Code + nRF Connect | J-Link / DAP-Link | J-Link / DFU |
| RP2040 | VS Code + Pico SDK | Picoprobe / USB Drag-and-Drop | USB Drag-and-Drop |
| ATmega | Arduino IDE / PlatformIO | Requires Debugger | USB Bootloader |

---

## Recommended Learning Path

<svg viewBox="0 0 720 370" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system,'Source Han Sans CN','Microsoft YaHei',sans-serif" role="img" aria-label="Recommended Learning Path: Three starting points with respective learning paths">
  <defs><marker id="mcupath-arrow" markerWidth="10" markerHeight="8" refX="8" refY="3" orient="auto"><path d="M0,0 L8,3 L0,6 Z" fill="#475569"/></marker></defs>
  <rect width="720" height="370" fill="#ffffff"/>
  <text x="360" y="28" text-anchor="middle" font-size="17" font-weight="700" fill="#1f2933">Recommended Learning Path: Three starting points, respective learning paths</text>

  <rect x="30" y="60" width="110" height="40" rx="8" fill="#e2e8f0" stroke="#cbd5e1"/>
  <text x="85" y="84" text-anchor="middle" font-size="12" font-weight="700" fill="#475569">Complete Beginner</text>
  <line x1="143" y1="80" x2="167" y2="80" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="170" y="60" width="150" height="40" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="245" y="76" text-anchor="middle" font-size="12" font-weight="700" fill="#3730a3">Arduino Uno</text>
  <text x="245" y="91" text-anchor="middle" font-size="10.5" fill="#4f46e5">Fastest results</text>
  <line x1="323" y1="80" x2="347" y2="80" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="350" y="60" width="150" height="40" rx="8" fill="#f0fdfa" stroke="#99f6e4"/>
  <text x="425" y="76" text-anchor="middle" font-size="12" font-weight="700" fill="#0f766e">ESP32</text>
  <text x="425" y="91" text-anchor="middle" font-size="10.5" fill="#0d9488">Add WiFi/BLE</text>
  <line x1="503" y1="80" x2="527" y2="80" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="530" y="60" width="150" height="40" rx="8" fill="#dcfce7" stroke="#4ade80"/>
  <text x="605" y="76" text-anchor="middle" font-size="12" font-weight="700" fill="#166534">STM32</text>
  <text x="605" y="91" text-anchor="middle" font-size="10.5" fill="#15803d">Understand low-level</text>

  <rect x="30" y="150" width="110" height="40" rx="8" fill="#e2e8f0" stroke="#cbd5e1"/>
  <text x="85" y="174" text-anchor="middle" font-size="11.5" font-weight="700" fill="#475569">Has Programming Basics</text>
  <line x1="143" y1="170" x2="167" y2="170" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="170" y="150" width="190" height="40" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="265" y="174" text-anchor="middle" font-size="12" font-weight="700" fill="#3730a3">ESP32 + PlatformIO</text>
  <line x1="363" y1="170" x2="387" y2="170" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="390" y="150" width="210" height="40" rx="8" fill="#dcfce7" stroke="#4ade80"/>
  <text x="495" y="166" text-anchor="middle" font-size="12" font-weight="700" fill="#166534">STM32 HAL</text>
  <text x="495" y="181" text-anchor="middle" font-size="10.5" fill="#15803d">Understand peripheral registers</text>

  <rect x="30" y="240" width="110" height="40" rx="8" fill="#e2e8f0" stroke="#cbd5e1"/>
  <text x="85" y="264" text-anchor="middle" font-size="11.5" font-weight="700" fill="#475569">Pursue Low-Level Understanding</text>
  <line x1="143" y1="260" x2="167" y2="260" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="170" y="240" width="230" height="40" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="285" y="256" text-anchor="middle" font-size="12" font-weight="700" fill="#3730a3">STM32 Blue Pill</text>
  <text x="285" y="271" text-anchor="middle" font-size="10.5" fill="#4f46e5">Bare-metal register programming</text>
  <line x1="403" y1="260" x2="427" y2="260" stroke="#475569" stroke-width="1.6" marker-end="url(#mcupath-arrow)"/>
  <rect x="430" y="240" width="250" height="40" rx="8" fill="#dcfce7" stroke="#4ade80"/>
  <text x="555" y="264" text-anchor="middle" font-size="12" font-weight="700" fill="#166534">Write your own linker script</text>

  <rect x="40" y="300" width="640" height="56" rx="8" fill="#eef2ff" stroke="#c7d2fe"/>
  <text x="56" y="322" font-size="12.5" fill="#3730a3">The three paths converge: Beginners build confidence with Arduino, those with programming basics can start directly with ESP32,</text>
  <text x="56" y="342" font-size="12.5" fill="#3730a3">only those pursuing low-level understanding need to go through bare-metal register programming and linker scripts.</text>
</svg>

---
*Keywords: STM32, ESP32, nRF52, RP2040, ATmega, Arduino, Cortex-M, RISC-V, Selection, Development Board*
