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",
] }
Мы почти добавили все необходимые крейты. Теперь напишем код для эффекта мигания.