Tengo una pequeña sorpresa con la interrupción del temporizador en el evento de actualización. Pensé que si el temporizador está configurado para contar, el evento de actualización ocurrirá justo después del desbordamiento, es decir, cuando la CNT será igual a cero. Según las figuras 103-105 del manual de referencia.
Pero ese no parece ser el caso por alguna razón. Lo probé con este simple código:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
// tick frequency in Hz
const uint32_t tickFreq = 1000*1000;
const uint16_t timPrescaler = SystemCoreClock / (tickFreq ) - 1;
TIM_TimeBaseInitTypeDef timBaseStruct;
timBaseStruct.TIM_Prescaler = timPrescaler;
timBaseStruct.TIM_ClockDivision = 0;
timBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;
timBaseStruct.TIM_Period = 5;
TIM_TimeBaseInit(TIM2, &timBaseStruct);
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE );
NVIC_EnableIRQ(TIM2_IRQn);
Luego en el controlador irq:
void TIM2_IRQHandler(void)
{
if(TIM2->CNT != 0)
{
TIM2->CNT = 1; // <----------- and I put a breakpoint on this line
}
TIM2->SR = ( uint16_t ) ~TIM_IT_Update;
}
No tengo nada más habilitado, no hay secciones críticas, solo un bucle while vacío.
También tengo un archivo .ini para el depurador, así que cuando detengo la ejecución, todos los temporizadores también se detienen.
Ahora lo interesante.
Cuando depuro en el simulador de Keil, la ejecución no se detiene en el punto de interrupción. Pero cuando depuro en el tablero, la ejecución se detiene en el punto de interrupción y puedo ver que TIM2- > CNT es igual a 1!
Parece que está conectado con la frecuencia de tic, si lo hago mil veces menos, el punto de interrupción no detiene la ejecución. Pero qué demonios, es sólo 1 MHz; CPU está sincronizada en 72 MHz!
Ahora me pregunto: ¿es un error en el simulador o en el hardware? ¿O simplemente he leído mal algo y el temporizador no se ha iniciado correctamente?