Tengo algunos problemas con la configuración de un temporizador de 1 segundo en el mcu STM32F103.
He configurado el temporizador 2 para que tenga un precalificador de 1099 y un período de 65514, por lo que espero tener una tasa de interrupción de 1 segundo: 72MHz / 1099/65514 = 1Hz.
Sin embargo, en realidad recibo la primera interrupción incluso antes de finalizar la rutina de configuración del temporizador (no es una gran preocupación en este momento), la siguiente interrupción se produce después de 1000 ms como se esperaba, la siguiente interrupción se produce después de 322 ms y la siguiente después de 32 ms. la siguiente después de 590ms. (Estos se midieron de acuerdo con el temporizador de systick que tengo funcionando a 1 ms).
Parece bastante aleatorio, ¿qué está pasando?
Aquí es parte del código relevante:
void RCC_Configuration() {
RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA |
RCC_APB2Periph_GPIOB |
RCC_APB2Periph_AFIO |
RCC_APB2Periph_USART1, ENABLE);
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3 |
RCC_APB1Periph_TIM2, ENABLE);
}
void Timer2_4_5_Configuration() {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Prescaler = (1099-1);
TIM_TimeBaseStructure.TIM_Period = (65514-1);
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
TIM_Cmd(TIM2, ENABLE);
}
void NVIC_Configuration () {
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
void TIM2_IRQHandler() {
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
GPIOA->ODR ^= GPIO_Pin_2;
}
EDITAR: Logré que esto funcionara, cometí un error tonto en el resto de mi código. He usado el mismo pin para otra cosa. Olvidé comentar la línea, oopsy.
El led en el pin 2 cambia a 1Hz según lo previsto, pero surge una nueva pregunta:
He establecido un punto de interrupción en la línea de conmutación de pines en el controlador de interrupciones TIM y parece que se dispara en momentos aleatorios como se indicó anteriormente. Pero cuando quito el punto de interrupción, el led cambia según lo previsto.
¿Qué está pasando?
P.S - Estoy usando IDE CooCox.