Trabajar con temporizador STM32F4

0

Estoy trabajando con el tablero de descubrimiento STM32F411. Utilizo Atollic TrueStudio y HAL Library. Estoy tratando de hacer un programa simple que compruebe cuándo se desborda el Timer2 y, cuando sucede, enciendo un LED.

Puedo configurar Timer2 sin problemas. El problema es que no puedo encontrar una función que devuelva verdadero cuando el temporizador se desborda. Tengo que usar __HAL_TIM_GetCounter(&hTim2); para obtener el conteo del temporizador, y puedo usar la interrupción. Pero, ¿qué sucede si solo quiero saber cuándo se desborda el temporizador sin utilizar interrupciones? ¿Qué debo usar?

    
pregunta Gonzalo Cervetti

2 respuestas

1

Compruebe el bit UIF del registro TIM2- > SR. Aquí hay un ejemplo completo de trabajo (en su mayoría) sin HAL, pero el ciclo también debería funcionar con HAL.

void tim2_test() {
    /* My LED is on port B. Change this if yours is different */
    RCC->AHBENR |= RCC_AHBENR_GPIOBEN;

    /* Enable TIM2 */
    RCC->APB1ENR |= RCC_APB1ENR_TIM2EN;

    /* Counter reload value. Must be a 16 bit integer, i.e. between 1 and 65535
    SystemCoreClock should be set by HAL */
    TIM2->ARR = SystemCoreClock / 10000 - 1;

    /* Prescaler value, pick it so that both this and the previous
    value fall between 1 and 65535 */
    TIM2->PSC = 9999;

    /* Start the timer with default settings, it'll count from 0 up to ARR */
    TIM2->CR1 = TIM_CR1_CEN;

    /* Port B pin 0 as output. Change this for your LED */
    GPIOB->MODER = (GPIOB->MODER & ~GPIO_MODER_MODER0) | GPIO_MODER_MODER0_0;

    while(1) {

        /* Check the update flag. It'll be set every time the timer overflows */
        if(TIM2->SR & TIM_SR_UIF) {

            /* Reset the flag, so that we can catch the next overflow */
            TIM2->SR &= ~TIM_SR_UIF;

            /* Toggle LED pin, change this for your board */
            GPIOB->ODR ^= 1;
        }
    }
}
    
respondido por el berendi
1

Puedes usar el HAL_TIM_PeriodElapsedCallback . Es una función muy útil que se llama cada vez que un temporizador se desborda.

Por ejemplo:

 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 
{

if(htim->Instance == TIM2)                    // check if TIM2 overflowed
{        
  // here you insert the code to blink the led
}
}

También le aconsejaría que descargue CubeMx en el que puede encontrar muchos proyectos de ejemplo útiles. (También puede generar un código de inicialización para varios periféricos si lo desea).

Descargo de responsabilidad: Sé que mencionó que necesita una solución sin la necesidad de usar interrupciones y aunque mi solución puede no ser lo que necesita, creo que es una buena alternativa que debe considerar. En caso de que necesite seguir con la solución sin interrupciones, la solución de Berendi (que en mi opinión es más avanzada) es lo que necesita.

Independientemente de la solución que termine usando, verifique que su temporizador esté configurado correctamente, que haya cargado el valor de recarga automática adecuado y que haya iniciado el temporizador.

    
respondido por el NikSotir

Lea otras preguntas en las etiquetas