#include "stm32c0xx_hal.h"

void SystemClock_Config(void);

#define LED_VERTE_PIN GPIO_PIN_0   // PA0 pour la LED verte
#define LED_ROUGE_PIN GPIO_PIN_1    // PA1 pour la LED rouge
#define LED_ORANGE_PIN GPIO_PIN_4   // PA2 pour la LED orange
#define LED_BLEUE_PIN GPIO_PIN_3    // PA3 pour la LED bleue

// Déclaration des broches pour les boutons
#define BOUTON_INTERNE_PIN GPIO_PIN_0  // PD0 pour le bouton interne
#define BOUTON_EXTERNE_PIN GPIO_PIN_1  // PD1 pour le bouton externe

// Déclaration des ports GPIO correspondants
#define LED_GPIO_PORT GPIOA           // Port GPIOA pour les LEDs
#define BOUTON_GPIO_PORT GPIOD      // Port GPIOD pour les boutons


void allumerLEDVerte(void);
void allumerLEDRouge(void);
void allumerLEDOrange(void);
void allumerLEDBleue(void);
void eteindreLEDs(void);

void gestionBoutons(void);

// Fonction d'initialisation des GPIO
static void MX_GPIO_Init(void);

int main(void)
{
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init(); // Ajout de l'initialisation des GPIO

    while (1)
    {
        gestionBoutons(); 
    }
}

void allumerLEDVerte(void)
{
    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_VERTE_PIN, GPIO_PIN_SET);
}

//  allumer la LED rouge
void allumerLEDRouge(void)
{
    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_ROUGE_PIN, GPIO_PIN_SET);
}

//  allumer la LED orange
void allumerLEDOrange(void)
{
    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_ORANGE_PIN, GPIO_PIN_SET);
}

//  allumer la LED bleue
void allumerLEDBleue(void)
{
    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_BLEUE_PIN, GPIO_PIN_SET);
}

//  éteindre toutes les LEDs
void eteindreLEDs(void)
{
    HAL_GPIO_WritePin(LED_GPIO_PORT, LED_VERTE_PIN | LED_ROUGE_PIN | LED_ORANGE_PIN | LED_BLEUE_PIN, GPIO_PIN_RESET);
}

//  gestion des boutons
void gestionBoutons(void)
{
    // Lire l'état des boutons (PD0 et PD1)
    uint8_t etatBoutonInterne = HAL_GPIO_ReadPin(BOUTON_GPIO_PORT, BOUTON_INTERNE_PIN);
    uint8_t etatBoutonExterne = HAL_GPIO_ReadPin(BOUTON_GPIO_PORT, BOUTON_EXTERNE_PIN);

    // Si le bouton interne ou externe est pressé
    if (etatBoutonInterne == GPIO_PIN_RESET || etatBoutonExterne == GPIO_PIN_RESET)
    {
        // Allumer les LEDs
        allumerLEDVerte();
        allumerLEDRouge();
        allumerLEDOrange();
        allumerLEDBleue();
    }
    else
    {
        // Éteindre les LEDs
        eteindreLEDs();
    }
}

// Fonction d'initialisation des GPIO
static void MX_GPIO_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};

    // Activer les horloges pour GPIOA (pour les LEDs et les boutons)
    __HAL_RCC_GPIOA_CLK_ENABLE();

    // Configuration des broches pour les LEDs en sortie push-pull
    GPIO_InitStruct.Pin = LED_VERTE_PIN | LED_ROUGE_PIN | LED_ORANGE_PIN | LED_BLEUE_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;  // Sortie en mode push-pull
    GPIO_InitStruct.Pull = GPIO_NOPULL;          // Pas de tirage
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Vitesse faible
    HAL_GPIO_Init(LED_GPIO_PORT, &GPIO_InitStruct);

    // Configuration des broches pour les boutons en entrée avec pull-up
    GPIO_InitStruct.Pin = BOUTON_INTERNE_PIN | BOUTON_EXTERNE_PIN;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;      // Mode entrée
    GPIO_InitStruct.Pull = GPIO_PULLUP;          // Résistance de tirage vers le haut
    HAL_GPIO_Init(BOUTON_GPIO_PORT, &GPIO_InitStruct);
}

void SystemClock_Config(void)
{
    RCC_OscInitTypeDef RCC_OscInitStruct;
    RCC_ClkInitTypeDef RCC_ClkInitStruct;

    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();
    }

    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)
{
    // Gérer l'erreur de manière appropriée
    while (1)
    {
        // Boucle infinie pour maintenir le microcontrôleur dans un état d'erreur
    }
}
Loading
st-nucleo-c031c6