#include <stdint.h>
#include <stdbool.h>
// --- АДРЕСИ В ПАМ'ЯТІ ДЛЯ STM32C031 ---
#define RCC_BASE 0x40021000U
#define GPIOA_BASE 0x50000000U
#define GPIOB_BASE 0x50000400U
volatile uint32_t* const RCC_IOPENR = (volatile uint32_t*) (RCC_BASE + 0x34U);
volatile uint32_t* const GPIOA_MODER = (volatile uint32_t*) (GPIOA_BASE + 0x00U);
volatile uint32_t* const GPIOA_IDR = (volatile uint32_t*) (GPIOA_BASE + 0x10U);
volatile uint32_t* const GPIOA_ODR = (volatile uint32_t*) (GPIOA_BASE + 0x14U);
volatile uint32_t* const GPIOA_PUPDR = (volatile uint32_t*) (GPIOA_BASE + 0x0CU);
volatile uint32_t* const GPIOB_MODER = (volatile uint32_t*) (GPIOB_BASE + 0x00U);
volatile uint32_t* const GPIOB_IDR = (volatile uint32_t*) (GPIOB_BASE + 0x10U);
volatile uint32_t* const GPIOB_ODR = (volatile uint32_t*) (GPIOB_BASE + 0x14U);
volatile uint32_t* const GPIOB_PUPDR = (volatile uint32_t*) (GPIOB_BASE + 0x0CU);
// --- ФУНКЦІЇ, ЩО ПРАЦЮЮТЬ ЧЕРЕЗ ВКАЗІВНИКИ ТА АДРЕСИ ---
void readButton(volatile const uint32_t* idr, bool* isPressed) {
// перевіряємо == 0 (бо натискання закорочує пін на GND)
if ((*idr & (1U << 5)) == 0) {
*isPressed = true;
} else {
*isPressed = false;
}
}
void writeLed(volatile uint32_t* odr, const bool* turnOn) {
// Якщо за адресою turnOn лежить true — вмикаємо PA5 (D13)
if (*turnOn == true) {
*odr |= (1U << 5); // Подаємо живлення на світлодіод
} else {
*odr &= ~(1U << 5);
}
}
int main(void) {
// 1. Увімкнути тактування портів
*RCC_IOPENR |= (1U << 0); // GPIOA
*RCC_IOPENR |= (1U << 1); // GPIOB
// 2. Налаштовуємо режими пінів через стрілочку ->
*GPIOA_MODER &= ~(3U << (5 * 2)); // ->Pin5 01 = Output (Вихід для LED на піні D13)
*GPIOA_MODER |= (1U << (5 * 2)); // 00 = Input (Вхід для кнопки на піні D7)
*GPIOB_MODER &= ~(3U << (5 * 2)); // 00 = Input (Вхід для кнопки на піні D7)
*GPIOB_PUPDR &= ~(3U << (5 * 2));
*GPIOB_PUPDR |= (1U << (5 * 2));
bool buttonActive = false; // Змінна для збереження стану
while (1) {
// Передаємо ВКАЗІВНИК на регістр IDR та АДРЕСУ змінної (&buttonActive)
readButton(GPIOB_IDR, &buttonActive);
// Передаємо ВКАЗІВНИК на регістр ODR та АДРЕСУ змінної (&buttonActive)
writeLed(GPIOA_ODR, &buttonActive);
}
}