Для начала нам надо подать тактовый сигнал на порт А, к линии 0 которого подключена кнопка:
/* enable led & button port */
RCC->AHB1ENR |= RCC_AHB1ENR_GPIODEN | RCC_AHB1ENR_GPIOAEN;
GPIO_MODER мы не трогаем, т.к нужная линия в/в у нас настроена по умолчанию на ввод.
Не смотря на то что у нас есть триггер Шмитта, необходимо сделать поддтяжку порта чтобы окончательно подавить дребезг контактов. Для этого есть регистр GPIOx_PUPDR:
Как и регистре режимов тут на каждую линию выделено по два бита для управления подтяжками:
Т.к. кнопка на плате у нас притягивает линию к земле, то нам необходимо подтянуть ее к питанию:
/* 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;
}
}