Для начала нам надо подать тактовый сигнал на порт А, к линии 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; } }