volatile float roueAvRatio = 1.00; volatile uint32_t roue_AvD_Timer = 0; <=== set in a timer capture interrupt volatile uint32_t roue_Ar_Timer = 0; <=== set in a timer capture interrupt void calcRoues() { roueAvRatio = 0.5; } void main() { calcRoues(); } void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim->Instance == TIM15) { // Sortie roue avant doRoueAvant(); } } void doRoueAvant() { uint32_t primask; float periode; uint16_t prescaler; uint16_t diviseur; uint16_t prescalertimer2 = TIM2->PSC + 1; enterCritical(&primask); // Verifie si les deux roues a une nouvelle impulsions de dispo. if ((!roue_AvG_Nouveau) || (!roue_AvD_Nouveau)) { // non, on répète l'impulsion? if (roue_Av_Impulsion_Repetition < roue_Av_Impulsion_Repetition_Max) { // oui HAL_GPIO_TogglePin(ECU_ROUE_AV_GPIO_Port, ECU_ROUE_AV_Pin); roue_Av_Impulsion_Repetition++; } // et on quitte exitCritical(&primask); return; } // remettre nouvelle impulsion à non roue_AvG_Nouveau = 0; roue_AvD_Nouveau = 0; // et on reset le compteur de répétitions roue_Av_Impulsion_Repetition = 0; // Calcule la nouvelle période // Moyenne des 2 roues transformé en impulsion d'horloge et ratio periode = ((roue_AvG_Timer + roue_AvD_Timer) / 2) * prescalertimer2 * roueAvRatio; // prescaller dynamique diviseur = (periode / 65536) + 1; if (diviseur > 2048) { diviseur = 2048; } prescaler = diviseur - 1; periode = periode / diviseur; if (periode >= 65535) { periode = 65535; } // timer update // déactive les interrupt pour le timer __HAL_TIM_DISABLE_IT(&htim15, TIM_IT_UPDATE); //reset a 0 __HAL_TIM_SET_COUNTER(&htim15, 0); // prescaler __HAL_TIM_SET_PRESCALER(&htim15,prescaler); // nouveau max __HAL_TIM_SET_AUTORELOAD(&htim15, (uint16_t)periode); // force l'update du prescaller htim15.Instance->EGR = TIM_EGR_UG; // enleve l'interrupt généré par l'update __HAL_TIM_CLEAR_FLAG(&htim15, TIM_FLAG_UPDATE); // réactive l'interrupt __HAL_TIM_ENABLE_IT(&htim15, TIM_IT_UPDATE); // toggle la sortie HAL_GPIO_TogglePin(ECU_ROUE_AV_GPIO_Port, ECU_ROUE_AV_Pin); exitCritical(&primask); }