STM32F1 tiene problemas con un temporizador

1

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.

    
pregunta Mike

1 respuesta

3

Cuando un depurador detiene la ejecución del programa, manualmente o al llegar a un punto de interrupción, congela el núcleo de Cortex-M (incluido el contador de tics del sistema) y deja el resto del sistema en ejecución.

Los periféricos continúan contando, leyendo y escribiendo en la memoria e IOs, y levantando banderas de interrupción. Los indicadores se acumulan y, una vez que se reanuda el procesador, comienza a darles servicio.

La mayoría de los periféricos se pueden configurar para suspender cuando se suspende la CPU, esto es útil cuando se necesita la intervención del programa para mantener la función correcta. De forma predeterminada, generalmente el depurador no los afecta, aunque existen excepciones (el temporizador Freescale FTM se detiene de forma predeterminada).

Las MCU STM32F1 tienen un registro dedicado para configurar el comportamiento de depuración de los periféricos, el DBG- > DBGMCU_CR.

    
respondido por el venny

Lea otras preguntas en las etiquetas