#include "stm32c0xx_hal.h"

// Function prototypes
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void) {
    // Initialize the HAL Library
    HAL_Init();
    
    // Configure the system clock
    SystemClock_Config();

    // Initialize GPIOs
    MX_GPIO_Init();

    /* USER CODE BEGIN WHILE */
    while (1) {
        // 3-bit binary counter loop (0 to 7)
        for (uint8_t i = 0; i < 8; i++) {
            // Set pin states based on the binary counter value
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, (i & 0x01) ? GPIO_PIN_SET : GPIO_PIN_RESET);  // LD1 (Pin 5)
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6, (i & 0x02) ? GPIO_PIN_SET : GPIO_PIN_RESET);  // LD2 (Pin 6)
            HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, (i & 0x04) ? GPIO_PIN_SET : GPIO_PIN_RESET);  // LD3 (Pin 7)

            HAL_Delay(1000);  // 1-second delay
        }
    }
    /* USER CODE END WHILE */
}

/* USER CODE BEGIN 0 */
// Add any necessary variables or functions here if needed
/* USER CODE END 0 */

// GPIO initialization function
static void MX_GPIO_Init(void) {
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // Enable GPIOA clock
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // Configure GPIO pins: PA5, PA6, PA7
    GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; // Push-pull output
    GPIO_InitStruct.Pull = GPIO_NOPULL;         // No pull-up or pull-down
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Low speed
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

// System Clock Configuration (You may need to adjust this based on your specific requirements)
void SystemClock_Config(void) {
    // Implement your clock configuration here (if needed)
}