MyUART.C
void (*rx_callback)(char) = 0;

void MyUART_SetRxCallback(void (*callback)(char)) {
    rx_callback = callback;
}

void USART2_IRQHandler(void){
    if (USART2->SR & USART_SR_RXNE) {
        char c = (char)(USART2->DR & 0xFF);
        if (rx_callback) rx_callback(c);
    }
}


main.C
volatile char cap = 0;
void ReceptionCap(char c){
       cap = c;
}
void AppliquerCommandeCap(void){
    int cmd = (int)cap;

    if (cmd == 0) {
      	StopRotation();
    } else if (cmd > 0) {
   	RotDroite(cmd);
    } else {
        RotGauche(-cmd);
    }
}

void main(){
	MyUART_Init(USART2);	
	MyUART_SetRxCallback(ReceptionCap);
	Init_GPIO_Sens();
	Init_Timer_PWM();
	while(1){
        	AppliquerCommandeCap();
        	Delay_ms(100); //fct à créer
    }
}




#define MOTEUR_GPIO GPIOB ??
#define MOTEUR_PIN_SENS 0 ??

void Init_GPIO_Sens(void) {
    MyGPIO_Init(MOTEUR_GPIO, MOTEUR_PIN_SENS, Out_Ppull);
}

#define MOTEUR_TIM TIM2 ??
#define MOTEUR_TIM_CHANNEL 1 ??

void Init_Timer_PWM(void) {
    // Exemple fréquence PWM : 20 kHz fclock=72Mhz
    // Choix PSC = 36 => 2 MHz timer clock
    // ARR = 100 => 20 kHz PWM (2MHz / 100)

	//La bonne pin (TIMx CHx) = Alternate Function Push-Pull
avec MyGPIO_Init(GPIOx,x, AltOut_Ppull) et verif  RCC->APB2ENR |= RCC_APB2ENR_IOPxEN;  actif

    MyTimer_Base_Init(MOTEUR_TIM, 100, 36); 
    MyTimer_PWM(MOTEUR_TIM, MOTEUR_TIM_CHANNEL);
    MyTimer_StartPWM(MOTEUR_TIM, MOTEUR_TIM_CHANNEL, 0); // PWM à 0 pour le start
}

void StopRotation(void) {
    	MyGPIO_Reset(MOTEUR_GPIO, MOTEUR_PIN_SENS); // blc sens    	MyTimer_StartPWM(MOTEUR_TIM, MOTEUR_TIM_CHANNEL, 0); // PWM=0 STOP
}

void RotDroite(int vitesse) {
   	MyGPIO_Set(MOTEUR_GPIO, MOTEUR_PIN_SENS); //  droite = 1
	MyTimer_StartPWM(MOTEUR_TIM, MOTEUR_TIM_CHANNEL, vitesse);}

void RotGauche(int vitesse) {
   	MyGPIO_Reset(MOTEUR_GPIO, MOTEUR_PIN_SENS); //  droite = 1
	MyTimer_StartPWM(MOTEUR_TIM, MOTEUR_TIM_CHANNEL, vitesse);}
