Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Embassy для Raspberry Pi Pico

Понятие HAL мы уже вводили в главе «Введение». Для Pico мы будем использовать Embassy RP HAL. Embassy RP HAL поддерживает микроконтроллеры Raspberry Pi RP2040, а также семейство RP235x.

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

Добавим крейт embassy-rp в проект, обновив Cargo.toml:

embassy-rp = { version = "0.9.0", features = [
  "rp235xa",
] }

Important

Мы указываем зависимость вручную, с точной версией, чтобы все, кто следует этой книге, использовали одну и ту же версию. Это позволяет избежать неожиданных проблем, которые могут возникнуть, если новые версии внесут изменения.

Мы включили функцию rp235xa, потому что наш чип — RP2350. Если бы мы использовали старую Pico, вместо неё включили бы функцию rp2040.

Инициализация HAL embassy-rp

Инициализируем HAL. При необходимости в функцию инициализации можно передать пользовательскую конфигурацию. Сейчас конфигурация позволяет менять настройки тактирования, но пока оставим значения по умолчанию:

#![allow(unused)]
fn main() {
let peripherals = embassy_rp::init(Default::default());
}

Это даёт нам синглтоны периферии, которые нам нужны. Помните, что вызывать эту функцию следует только один раз при запуске: повторный вызов приведёт к панике.

Таймер

Мы повторим пример быстрого старта и заставим мигать встроенный светодиод. Чтобы создать эффект мигания, нам нужен таймер, который будет добавлять задержки между включением и выключением светодиода. Без задержек мигание было бы слишком быстрым, чтобы его увидеть.

Для работы со временем мы будем использовать крейт embassy-time, который предоставляет основные функции для работы со временем:

cargo add embassy-time
#![allow(unused)]
fn main() {
embassy-time = { version = "0.5.0" }
}

Также нужно включить функцию time-driver в крейте embassy-rp. Она настраивает периферию TIMER как глобальный драйвер времени для embassy-time, работающий с частотой тактов 1 МГц:

cargo add embassy-rp --features=time-driver,critical-section-impl
embassy-rp = { version = "0.9.0", features = [
  "rp235xa",
  "time-driver",
  "critical-section-impl",
] }

Мы почти добавили все необходимые крейты. Теперь напишем код для эффекта мигания.