Problema con el temporizador basado en interrupciones en STM32F411

0

Estaba siguiendo este tutorial en línea y no puedo hacer que funcione el temporizador basado en interrupciones. Sé que el temporizador se está ejecutando porque si descomento las cinco líneas en el bucle principal, obtengo una buena salida de onda cuadrada. Pero con esas líneas comentadas, la interrupción del temporizador no se dispara y no puedo entender por qué. ¿Alguien puede sugerir lo que estoy haciendo mal?

#include "stm32f4xx_hal.h"

void SysTick_Handler(void)
{
    HAL_IncTick();
    HAL_SYSTICK_IRQHandler();
}

static TIM_HandleTypeDef s_TimerInstance = { .Instance = TIM2 };

void InitializeTimer()
{
    __TIM2_CLK_ENABLE();
    s_TimerInstance.Init.Prescaler = 160;
    s_TimerInstance.Init.CounterMode = TIM_COUNTERMODE_UP;
    s_TimerInstance.Init.Period = 100;
    s_TimerInstance.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
    s_TimerInstance.Init.RepetitionCounter = 0;
    HAL_TIM_Base_Init(&s_TimerInstance);
    HAL_TIM_Base_Start(&s_TimerInstance);
}

void InitializeLED()
{
    __GPIOA_CLK_ENABLE();
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.Pin = LD2_Pin;
    GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStructure.Speed = GPIO_SPEED_HIGH;
    GPIO_InitStructure.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStructure);
}

void TIM2_IRQHandler()
{
    HAL_TIM_IRQHandler(&s_TimerInstance);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    HAL_GPIO_TogglePin(LD2_GPIO_Port, LD2_Pin);
}

int main(void)
{
    HAL_Init();
    InitializeLED();
    InitializeTimer();

    HAL_NVIC_SetPriority(TIM2_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(TIM2_IRQn);

    for (;;)
    {
//        int timerValue = __HAL_TIM_GET_COUNTER(&s_TimerInstance);
//        if (timerValue == 50)
//            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_SET);
//        if (timerValue == 100)
//            HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    }
}
    
pregunta TomServo

1 respuesta

2

Parece que el bit UIE en TIM2->DIER no está habilitado. Debe haber alguna función HAL para hacerlo, no lo sé. No recomendaría el uso de HAL para el cronometraje de todos modos, hay problemas con su precisión .

Iniciar un temporizador es solo unas pocas líneas de código.

void InitializeTimer(void) {
    __TIM2_CLK_ENABLE();
    TIM2->PSC = 160;             /* Set prescaler value */
    TIM2->EGR = TIM_EGR_UG;      /* Update prescaler */
    TIM2->ARR = 100;             /* Set timer period */
    TIM2->DIER = TIM_DIER_UIE;   /* Enable interrupt generation on timer overflow */
    TIM2->CR1 = TIM_CR1_CEN;     /* Start counting */
}

void TIM2_IRQHandler()
{
    /* Clear interrupt flag first. It cannot be the last instruction in an interrupt handler. */
    TIM2->SR = 0;
    LD2_GPIO_Port->ODR ^= LD2_Pin;
}
    
respondido por el berendi

Lea otras preguntas en las etiquetas