work.c

Для начала нам надо подать тактовый сигнал на порт А, к линии 0 которого подключена кнопка:

/* enable led & button port */
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN;

GPIO_MODER мы не трогаем, т.к нужная линия в/в у нас настроена по умолчанию на ввод.

Не смотря на то что у нас есть триггер Шмитта, необходимо сделать поддтяжку порта чтобы окончательно подавить дребезг контактов. Для этого есть регистр GPIOx_PUPDR:

Как и регистре режимов тут на каждую линию выделено по два бита для управления подтяжками:

  • 00: Нет подтяжки
  • 01: Подтяжка к питанию
  • 10: Подтяжка к земле
  • 11: Зарезервированно

Т.к. кнопка на плате у нас притягивает линию к земле, то нам необходимо подтянуть ее к питанию:

/* pull-up button io */
    BUT_PORT->PUPDR |= GPIO_PUPDR_PUPDR0_1;

Для получения данных у нас есть регистр ввода - GPIOx_IDR:

Как и в регистре вывода, здесь на каждую линию есть по одному биту.

Алгоритм программы прост: в цикле проверяем нажата ли кнопка, если нажата то зажигаем светодиоды и ждем пока отпустят кнопку, после чего гасим светодиоды и снова ожидаем нажатия кнопки:

/* infinity loop */
    while (1) {
        /* if button pressed */
        if (BUT_PORT->IDR & BUT1) {
            /* enable leds */
            LED_PORT->ODR |= ALL_LEDS;
            /* wait while button pressed */
            while (BUT_PORT->IDR & BUT1);
            /* disable leds */
            LED_PORT->ODR &= ~ALL_LEDS;
        }
    }