Работа с GPIO

Теперь пора подключить кнопку к плате и заставить светодиод мигать.

Начнем с мигания светодиодом. Добавьте модули delay и gpio в импорт crabik_board::hal. В созданном проекте напишите следующий код:


#![allow(unused)]
fn main() {
// Разделение GPIO на отдельные пины
let port0 = gpio::p0::Parts::new(periph.P0);
// Создание "задержки"
let mut delay = delay::Delay::new(core_periph.SYST);
// Макрос который переименовывает пины микроконтроллера в названия пинов на плате
let pins = crabik_board::rename_pins!(port0);
// Переводит пин 11 в режим выхода
let mut led = pins.d11.into_push_pull_output(gpio::Level::Low);

loop {
    // Устанавливает высокий уровень на пине
    led.set_high().unwrap();
    // Задержка на 1 секунду
    delay.delay_ms(1_000_u32);
    // Устанавливает низкий уровень на пине
    led.set_low().unwrap();
    // Задержка на 1 секунду
    delay.delay_ms(1_000_u32);
}
}

Далее разберемся что именно делает этот фрагмент кода:

  • Строчка let port0 = p0::Parts::new(periph.P0);.Тут мы передаем периферию GPIO для разделения на отдельные пины (в микроконтроллерах пины обычно представлены портом, через него можно управлять множеством пинов сразу, для удобства использования порты разделяют на отдельные пины).
  • Строчка let mut delay = Delay::new(core_periph.SYST);. Тут мы передаем системный таймер SysTick в структуру Delay. Delay использует данный таймер для точного отсчета задержки.
  • Строчка let pins = crabik_board::rename_pins!(port0);. Тут мы передаем уже разделенные пины макросу, который из названия пина например p0_01, сделает его d11. Можно его не использовать, но тогда нужно смотреть на схему платы для того что-бы узнать название пина.
  • Строчка let mut led = pins.d11.into_push_pull_output(Level::Low);. Тут мы переводим пин 11 в режим вывода с подтяжкой к земле.
  • Далее идет бесконечный цикл. В нем мы мигаем светодиодом.

Теперь можно добавить нашу кнопку. Подключим кнопку к выводу A0. После строки где мы переводили пин 11 в режим вывода, добавте строку:


#![allow(unused)]
fn main() {
// Переводит пин A0 в режим входа с подтяжкой к 3.3 вольтам
let button = pins.a0.into_pullup_input();
}

И измените цикл на:


#![allow(unused)]
fn main() {
loop {
    // Если кнопка нажата то включаем светодиод
    if button.is_low().unwrap() {
        led.set_high().unwrap();
    } else {
        led.set_low().unwrap();
    }
}
}

В итоге у нас получилась программа, которая включает светодиод если на пине A0 низкий уровень (кнопка нажата).