#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stm32c0xx_hal.h>
// Handles UART
UART_HandleTypeDef huart1; // Pour USART1
// Définition des buffers
#define BUFFER_LEN 4 // 4 valeurs pour contrôler les LED
uint8_t RX_BUFFER[BUFFER_LEN]; // Buffer pour recevoir les données via UART
uint8_t TX_BUFFER[BUFFER_LEN] = {1, 2, 3, 4}; // Buffer pour transmettre des valeurs
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
void Error_Handler(void);
int main(void)
{
HAL_Init(); // Initialiser la bibliothèque HAL
SystemClock_Config(); // Configurer l'horloge système
MX_GPIO_Init(); // Initialiser les GPIO
MX_USART1_UART_Init(); // Initialiser USART1
while (1) // Boucle principale
{
// Recevoir les données via UART et stocker dans RX_BUFFER
HAL_UART_Receive(&huart1, RX_BUFFER, BUFFER_LEN, HAL_MAX_DELAY); // Réception bloquante
// Vérifier la valeur reçue et contrôler les LEDs en conséquence
for (int i = 0; i < BUFFER_LEN; i++) {
if (RX_BUFFER[i] == 1)
{
// Allumer la LED rouge sur PA0
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_RESET); // Allumer LED sur PA0 (logique inversée)
}
else if (RX_BUFFER[i] == 2)
{
// Éteindre la LED rouge sur PA0
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); // Éteindre LED sur PA0 (logique inversée)
}
else if (RX_BUFFER[i] == 3)
{
// Allumer la LED bleue sur PA1
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET); // Allumer LED sur PA1 (logique inversée)
}
else if (RX_BUFFER[i] == 4)
{
// Éteindre la LED bleue sur PA1
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET); // Éteindre LED sur PA1 (logique inversée)
}
}
HAL_Delay(1000); // Attendre 1 seconde entre chaque action pour observer les changements
}
}
static void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_Config;
// Initialiser les LED sur PA0 et PA1
GPIO_Config.Pin = GPIO_PIN_0 | GPIO_PIN_1; // Configurer PA0 et PA1 comme sorties
GPIO_Config.Mode = GPIO_MODE_OUTPUT_PP; // Mode Push-Pull
GPIO_Config.Pull = GPIO_NOPULL; // Pas de résistance de tirage
GPIO_Config.Speed = GPIO_SPEED_FREQ_HIGH; // Haute vitesse
__HAL_RCC_GPIOA_CLK_ENABLE(); // Activer l'horloge GPIOA
HAL_GPIO_Init(GPIOA, &GPIO_Config); // Initialiser les GPIO
}
static void MX_USART1_UART_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct = {0}; // Structure pour configurer les GPIO
__HAL_RCC_GPIOB_CLK_ENABLE(); // Activer l'horloge pour GPIOB
// Configurer PB6 et PB7 pour USART1
GPIO_InitStruct.Pin = GPIO_PIN_6 | GPIO_PIN_7; // TX et RX
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; // Mode alternatif Push-Pull
GPIO_InitStruct.Pull = GPIO_NOPULL; // Pas de résistance de tirage
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // Vitesse basse
GPIO_InitStruct.Alternate = GPIO_AF1_USART1; // Fonction alternative
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); // Initialiser GPIOB
// Configurer USART1
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200; // Vitesse de transmission
huart1.Init.WordLength = UART_WORDLENGTH_8B; // 8 bits par mot
huart1.Init.StopBits = UART_STOPBITS_1; // 1 bit de stop
huart1.Init.Parity = UART_PARITY_NONE; // Pas de parité
huart1.Init.Mode = UART_MODE_TX_RX; // Mode transmission et réception
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; // Pas de contrôle de flux
huart1.Init.OverSampling = UART_OVERSAMPLING_16; // Suréchantillonnage
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; // Pas d'options avancées
if (HAL_UART_Init(&huart1) != HAL_OK) // Initialiser USART1
{
Error_Handler(); // Gestion d'erreur
}
}
void Error_Handler(void)
{
// Implémentation utilisateur pour signaler l'état d'erreur de HAL
while (1) // Boucle infinie en cas d'erreur
{
// Gestion d'erreur : faire clignoter une LED (PA5 ici pour signaler une erreur)
HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // Basculer la LED sur PA5
HAL_Delay(100); // Attendre 100 ms
}
}