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;
        }
    }

Comments