Site logo

Developer Blog

Pavel Koltyshev

Обзор микроконтроллеров от Raspberry Pi

Содержание

Если вы наигрались с Arduino и вам стало грустно от микроконтроллера, которому в 2026 году исполнится 18 лет, а самому семейству AVR уже почти 30. Если хочется чего-то более современного и такого же простого, как Arduino, то, возможно, вам стоит обратить внимание на микроконтроллеры от компании Raspberry Pi, такие как RP2040 или более новая версия RP2350.

Почему не STM32? Порог вхождения в STM32 гораздо выше для рядового пользователя, поскольку они рассчитаны на более профессиональный подход, углубленное чтение спецификаций и сложную настройку самого микроконтроллера. Они сложнее и займут у вас больше времени. При этом STM32 — достаточно зрелые микроконтроллеры с богатым API и высокой производительностью.

RP2040

RP2040 RP2040

В 2021 году компания Raspberry Pi, известная своими мини-компьютерами, представила свой первый микроконтроллер — RP2040.

Микроконтроллер RP2040 использует двухъядерный процессор ARM Cortex-M0+, работающий на частоте до 133 МГц.

RP2040 оснащён 264 килобайтами встроенной SRAM и не имеет встроенной флеш-памяти — для хранения прошивки используется внешняя SPI флеш-память, что делает устройство гибким в плане конфигурации. Контроллер поддерживает интерфейсы UART, SPI, I²C, PWM и USB, а также имеет 30 универсальных выводов GPIO, часть из которых может работать с аналоговыми сигналами через 12-битный АЦП.

Особое внимание в RP2040 заслуживает блок PIO (Programmable I/O) — уникальная система, позволяющая реализовывать пользовательские протоколы ввода-вывода на аппаратном уровне. Благодаря этому микроконтроллер способен работать с нестандартными интерфейсами и выполнять задачи, которые раньше требовали внешних контроллеров или FPGA.

RP2350

RP2350 RP2350

В 2024 году компания Raspberry Pi выпускает свой второй микроконтроллер — RP2350.

В основе RP2350 лежит новый процессор с двумя ядрами ARM Cortex-M33. Существует также версия с ядром RISC-V, что открывает перед разработчиками выбор между разными экосистемами и инструментами. Одновременно можно использовать только одну версию процессора.

Тактовая частота RP2350 достигает 150 МГц, а объём встроенной SRAM увеличен до 520 килобайт, что позволяет использовать его в более сложных и ресурсоёмких проектах. Как и у предшественника, флеш-память подключается через внешний SPI-интерфейс, однако теперь микроконтроллер поддерживает более быструю и энергоэффективную работу с внешними накопителями.

Набор периферии также стал богаче. Помимо привычных интерфейсов SPI, I²C, UART, PWM и USB, RP2350 получил поддержку CAN и I3C, что делает его удобным для использования в промышленных и автомобильных решениях. Количество выводов GPIO увеличилось до 48, и они по-прежнему могут работать с аналоговыми сигналами через улучшенный 12-битный АЦП.

Особое внимание снова уделено системе PIO (Programmable I/O), которая в RP2350 стала ещё мощнее и гибче. Теперь она позволяет создавать более сложные пользовательские протоколы и взаимодействовать с периферией с минимальной нагрузкой на основные ядра.

Ошибки RP2350

К сожалению, при выходе RP2350 было найдено несколько критических ошибок, вот некоторые из них:

  • Erratum RP2350-E9 — когда вывод настраивается как вход с включённым внутренним pull-down, а затем поднимается до высокого уровня (например, 3.3 В), он не возвращается полностью к 0 В после снятия сигнала. Вместо этого он остаётся на уровне ~2.1-2.2 В — это явление называется эффектом защёлкивания (latching behaviour).
  • Уязвимости, найденные в Boot ROM в рамках Hacking Challenge.

Описанные выше ошибки исправлены в версии чипа со степпингом A4. Потребуется некоторое время, чтобы новые чипы вытеснили старые, содержащие ошибки.

Таблица сравнения микроконтроллеров

Характеристика RP2040 RP2350
Год выпуска 2021 2024
Архитектура CPU Dual-core ARM Cortex-M0+ Dual-core Cortex-M33 или RISC-V (PicoRV32-based)
Тактовая частота До 133 МГц До 150 МГц (ARM) / до 200 МГц (RISC-V)
Память SRAM 264 КБ 520 КБ
Встроенная флеш-память Нет (внешняя QSPI-Flash) Нет (внешняя QSPI или Octal SPI Flash)
Интерфейсы ввода-вывода GPIO, SPI, I²C, UART, PWM, PIO (2× PIO) GPIO, SPI, I²C, UART, PWM, PIO (2× улучшенные PIO)
Поддержка USB USB 1.1 Device/Host USB 1.1 Device/Host (улучшена надёжность)
DMA 12 каналов 16 каналов
ADC 12-бит, 4 канала 12-бит, 4 канала + температурный сенсор
Аппаратная безопасность Нет TrustZone-M, криптографические инструкции
Аппаратный FPU Нет Есть (в Cortex-M33)
RTC (часы реального времени) Нет Да
Питание (рабочее напряжение) 1.8-3.3 В 1.8-3.3 В
Количество GPIO 30 30 для RP2350A и 48 для RP2350B
Корпус QFN-56, WLCSP-56 QFN-56, WLCSP-56 (совместимый пин-аут)
Совместимость с RP2040 Почти полная (пины и периферия совместимы)
Особенности Простая архитектура, высокая надёжность ARM + RISC-V, больше памяти, поддержка безопасности
Пример платы Raspberry Pi Pico Raspberry Pi Pico 2

Чем RP2350 лучше, чем RP2040?

  • RP2350 может работать с двумя типами процессоров: ARM Cortex-M33 или RISC-V.
  • У него в два раза больше памяти (520 КБ против 264 КБ).
  • Частота немного выше, поэтому он быстрее.
  • Появилась аппаратная безопасность: TrustZone и криптографические инструкции.
  • Есть FPU — это ускоритель для математических вычислений.
  • RTC стал полноценным: теперь он может работать в спящем режиме и будить микроконтроллер.
  • Улучшены PIO, DMA и работа с USB.

Примеры использования

Микроконтроллеры Raspberry Pi можно программировать на MicroPython, а также на C/C++.

Для C/C++ существует SDK, в дальнейшем мы будем использовать именно его.

Прошивка платы довольно проста. Достаточно нажать и удерживать кнопку BOOTSEL, подключая её к ПК по USB. После этого плата отобразится в системе как флеш-накопитель, на который нужно скопировать файл прошивки в формате .uf2. Затем устройство автоматически перезагрузится и запустит вашу программу.

Однако удобнее всего использовать редактор кода VS Code с расширением "Raspberry Pi Pico". Оно само установит необходимые зависимости и позволит прошивать плату одним нажатием кнопки.

Простейшая программа мигания светодиодом на RP2350:

#include "pico/stdlib.h"

#define LED_PIN 25
#define LED_DELAY_MS 1000

// Инициализация LED
void led_init(void) {
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
}

// Установка состояния LED
void led_set_state(bool state) {
    gpio_put(LED_PIN, state);
}

int main() {
    led_init();
    
    while (true) {
        led_set_state(true);
        sleep_ms(LED_DELAY_MS);
        
        led_set_state(false);
        sleep_ms(LED_DELAY_MS);
    }
}