#include "stm32c0xx.h" // Include STM32C0 specific header file
volatile uint8_t led_state = 0; // Variable to keep track of the LED state
// Function to initialize LEDs (PA0 to PA3) as output
void LED_Init(void) {
// Enable GPIOA clock (RCC_IOPENR: I/O port A enable)
RCC->IOPENR |= RCC_IOPENR_GPIOAEN;
// Configure PA0 to PA3 as output (00 for input, 01 for output)
GPIOA->MODER &= ~(0xFF); // Clear bits for PA0-PA3
GPIOA->MODER |= 0x55; // Set PA0 to PA3 as outputs (01)
}
// Function to initialize buttons (PA4 and PA5) as inputs with external interrupts
void Button_Init(void) {
// Enable SYSCFG clock to configure external interrupts
RCC->APBENR2 |= RCC_APBENR2_SYSCFGEN;
// Configure PA4 and PA5 as input (00 in MODER)
GPIOA->MODER &= ~(0xF << (4 * 2)); // Clear mode for PA4 and PA5
// Set PA4 and PA5 with pull-up resistors (to avoid floating)
GPIOA->PUPDR &= ~(0xF << (4 * 2)); // Clear pull-up/down settings
GPIOA->PUPDR |= (0x5 << (4 * 2)); // Set PA4 and PA5 to pull-up (01)
// Configure external interrupt for PA4 and PA5 (EXTI lines 4 and 5)
SYSCFG->EXTICR[1] |= (0 << SYSCFG_EXTICR2_EXTI4_Pos); // Map PA4 to EXTI4
SYSCFG->EXTICR[1] |= (0 << SYSCFG_EXTICR2_EXTI5_Pos); // Map PA5 to EXTI5
EXTI->IMR1 |= EXTI_IMR1_IM4 | EXTI_IMR1_IM5; // Enable interrupt for PA4 and PA5
EXTI->FTSR1 |= EXTI_FTSR1_FT4 | EXTI_FTSR1_FT5; // Trigger on falling edge for PA4 and PA5
// Enable EXTI interrupts in NVIC
NVIC_EnableIRQ(EXTI4_15_IRQn); // Enable EXTI lines 4-15 in NVIC
}
// Interrupt handler for EXTI lines 4 to 15 (PA4 and PA5)
void EXTI4_15_IRQHandler(void) {
if (EXTI->RPR1 & EXTI_RPR1_RPIF4) { // Check if PA4 (EXTI4) triggered
led_state ^= 1; // Toggle LED state
if (led_state) {
GPIOA->ODR |= 0x0F; // Turn on LEDs (PA0-PA3)
} else {
GPIOA->ODR &= ~0x0F; // Turn off LEDs (PA0-PA3)
}
EXTI->RPR1 |= EXTI_RPR1_RPIF4; // Clear interrupt pending flag for PA4
}
if (EXTI->RPR1 & EXTI_RPR1_RPIF5) { // Check if PA5 (EXTI5) triggered
led_state ^= 1; // Toggle LED state
if (led_state) {
GPIOA->ODR |= 0x0F; // Turn on LEDs (PA0-PA3)
} else {
GPIOA->ODR &= ~0x0F; // Turn off LEDs (PA0-PA3)
}
EXTI->RPR1 |= EXTI_RPR1_RPIF5; // Clear interrupt pending flag for PA5
}
}
void setup()(void) {
LED_Init(); // Initialize the LEDs (PA0-PA3)
Button_Init(); // Initialize buttons with interrupts (PA4, PA5)
while (1) {
// Main loop does nothing; all logic is handled in the interrupt handler
}
}
void loop()
{}Loading
st-nucleo-c031c6
st-nucleo-c031c6