#include "stm32c0xx_hal.h"

void SystemClock_Config(void);
void Error_Handler(void);

void GPIO_Init(void) {
    // Activer l'horloge du port GPIOA
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // Configurer les broches PA0 et PA1
    GPIO_InitTypeDef GPIO_InitStruct;
    GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;   // Sélectionner PA0 et PA1
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;     // Mode sortie push-pull
    GPIO_InitStruct.Pull = GPIO_NOPULL;             // Pas de résistance de pull
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;    // Vitesse faible
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);         // Initialiser les GPIOs
}

void LED_Blink(void) {
    while (1) {
        // Éteindre la LED sur PA0 et allumer la LED sur PA1
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // PA0 éteinte
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);   // PA1 allumée
        HAL_Delay(1000); // Délai de 1 seconde

        // Allumer la LED sur PA0 et éteindre la LED sur PA1
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET);   // PA0 allumée
        HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // PA1 éteinte
        HAL_Delay(1000); // Délai de 1 seconde
    }
}

int main(void) {
    // Initialisation de la HAL et de l'horloge système
    HAL_Init();
    SystemClock_Config();

    // Initialisation des GPIO
    GPIO_Init();

    // Clignotement des LEDs
    LED_Blink();

    return 0; // Non atteint
}

void SystemClock_Config(void) {
    RCC_OscInitTypeDef RCC_OscInitStruct = {0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    // Configurer l'oscillateur principal
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
    RCC_OscInitStruct.HSIState = RCC_HSI_ON;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;

    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
        Error_Handler();
    }

    // Configurer les horloges
    RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1;
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;

    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK) {
        Error_Handler();
    }
}

void Error_Handler(void) {
    // Gestion d'erreur : clignoter une LED ou boucle infinie
    while (1) {
        // Boucle infinie pour signaler l'erreur
    }
}