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