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

Привет, мир!

В предыдущем разделе вы написали нечто вроде программы «Hello World». Но для программистов встраиваемых систем «настоящий Hello World» — это заставить светодиод (любой) включаться и выключаться раз в секунду. Такую программу обычно называют «blinky» (мигалка).

Зачем мигалка? Потому что она показывает, что вы достаточно контролируете плату, чтобы выполнить эту простую задачу. Вы можете загрузить программу на устройство и запустить её, найти нужный вывод на MCU и включить его, сделать паузу на фиксированное время. Когда вы контролируете плату на таком уровне, остальные задачи становятся гораздо проще.

В предыдущих главах вы узнали несколько способов загрузить программу на MB2. Теперь остаётся вопрос: какой вывод включать и выключать и как делать паузы между этими действиями.

Начнём с того, как работать с нужными выводами. Один из способов — прочитать электрическую схему («schematic»), если вы умеете это делать. Найдите схему MB2, выберите на ней светодиод, который хотите включать и выключать, и определите, к каким GPIO-выводам nRF52833 он подключён. (В этом отношении MB2 немного необычен: обычно светодиод подключён к одному выводу, который его включает или выключает. Светодиодный «дисплей» MB2 устроен сложнее: он позволяет включать и выключать сразу комбинации светодиодов, и этой возможностью мы скоро воспользуемся.)

Мы будем работать со светодиодом в верхнем левом углу дисплея MB2. Проследив провода ROW1 и COL1, к которым подключён этот светодиод, видим, что они идут к выводам nRF52833 с обозначениями AC17/P0.21 и B11/AIN4/P0.28. Если копнуть документацию глубже, выясняется, что AC17 и B11 — это координаты физических выводов (точнее, шариков припоя) на нижней стороне чипа; нам они не нужны. AIN4 означает, что этот вывод может работать как «аналоговый вход» (Analog Input), но сейчас это тоже нам не важно. (Это пригодится позже.)

Остаются P0.21 и P0.28. Эти обозначения соответствуют битам в памяти nRF52833, которые можно включать и выключать, чтобы зажечь светодиод. Из-за законов электроники, если вывод P0.21 включён (то есть выдаёт 3,3 В), а вывод P0.28 выключен (то есть принимает напряжение), светодиод загорится.

Но что делать в программе, чтобы это произошло? Будем работать на уровне крейта nrf52833-hal. Hardware Abstraction Layer (HAL) — это программный слой, призванный упростить работу с конкретным микроконтроллером. Как видно из названия, у нас есть HAL для микроконтроллера MB2. В нём есть всё необходимое, чтобы включить нужный светодиод.

Посмотрите examples/light-up.rs в каталоге этой главы и попробуйте его запустить. Можно воспользоваться чем-то более продвинутым, как раньше, но мы настроили всё так, что

cargo run --example light-up

загрузит и запустит вашу программу. Тот самый светодиод должен ярко загореться!

#![no_main]
#![no_std]

use cortex_m_rt::entry;
use nrf52833_hal::{gpio, pac};
use panic_halt as _;

#[entry]
fn main() -> ! {
    let peripherals = pac::Peripherals::take().unwrap();
    let p0 = gpio::p0::Parts::new(peripherals.P0);
    let _row1 = p0.p0_21.into_push_pull_output(gpio::Level::High);
    let _col1 = p0.p0_28.into_push_pull_output(gpio::Level::Low);

    #[allow(clippy::empty_loop)]
    loop {}
}

Обратите внимание, что к PAC этого чипа мы обращаемся через наш HAL-крейт. Чтобы получить доступ к выводам, нужна довольно сложная процедура. Наконец, поскольку можно сразу задать выводам нужные уровни при инициализации, их не нужно переключать отдельно. Переключение выводов — тема следующего раздела.