Si usa cubemx y HAL_Driver layer, por ejemplo, su frecuencia de actualización del temporizador es 40MHZ (verá en el reloj esquemático en cubeMx), y sus condiciones iniciales para el temporizador fueron, por ejemplo:
htim2.Instance = TIM2;
htim2.Init.Prescaler = 40000; //40e6/40e3 = 1000 ms
htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
htim2.Init.Period = 5000; //If you want five seconds for initial interruption
htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
Con este código sabrías que tu temporizador se interrumpe cada 5 segundos. Luego, el código basado en el modo seleccionado, supuse que podría ser algo como esto:
void prepare_timer(char mode){
htim2.Init.Period = mode * 5000;
TIM_Base_SetConfig(TIM2, &htim2.Init);
}
Y luego, solo debes configurar el temporizador a través del código de dos líneas.
Obviamente, antes de todo esto, necesita activar NVIC en CubeMX. Y ponga esta función prepare_timer () dentro del controlador:
void TIM2_IRQHandler(void)
{
/* USER CODE BEGIN TIM2_IRQn 0 */
/* USER CODE END TIM2_IRQn 0 */
HAL_TIM_IRQHandler(&htim2);
/* USER CODE BEGIN TIM2_IRQn 1 */
--------------maybe here----------------------
/* USER CODE END TIM2_IRQn 1 */
}
Tal vez deba hacer __HAL_TIM_ENABLE(&htim2);
o algo para habilitar el conteo, etc.