Interrupción del temporizador en stm32f103

2

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?

    
pregunta Amomum

2 respuestas

2

Está bien, parece ser que el depurador está arruinando los tiempos.

He sustituido el punto de interrupción con el encendido del LED, y sin el depurador permanece apagado. Si entro en la depuración y no habilito el punto de interrupción antes del inicio, el LED permanece apagado.

Solo si habilito el punto de interrupción y luego inicio la ejecución: el punto de interrupción se dispara y el LED se enciende.

    
respondido por el Amomum
0

No creo que sea un modo seguro leer el temporizador en la rutina de interrupción. Creo que cuando se llama a su ISR, el temporizador sigue funcionando !! Si la prioridad de interrupción de su systick es mayor que la de TIM2, la función de interrupción de TIM2 puede retrasarse. Así que cuando se llama a su código, el temporizador puede haber cambiado.

Le sugiero que mejore la prioridad de interrupción de TIM2 a mayor que systick, y pruébelo.

    
respondido por el diverger

Lea otras preguntas en las etiquetas