es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Configuración del temporizador sysTick

Estoy tratando de configurar el temporizador Systick para generar una interrupción de 1 ms. Mi MCU es STM32F767 y mis frecuencias de reloj son las siguientes:

Oscilador = HSE
No PLL
SYSCLK = 25 MHz
Divisor de reloj AHB = 2
HCLK = 12,5 MHz
Divisor de reloj APB1 = 2
PCLK1 = 6,25 MHz
Divisor de reloj APB2 = 2
PCLK2 = 6,25 MHz

He configurado correctamente el reloj y he verificado que las frecuencias sean correctas.

Ahora, la siguiente parte es que quiero configurar el temporizador SysTick para generar una interrupción cada 1 ms. Según entiendo, el método HAL_Delay() requiere que el temporizador Systick esté configurado para una interrupción de 1 ms.

Ahora, como mi HCLK es de 12,5 MHz, cada ciclo dura 0,08 us. Para obtener una interrupción cada 1 ms, debo configurar el valor de recarga de SysTick en 12500. Estoy haciendo exactamente eso.

HAL_SYSTICK_Config(12500);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

Sin embargo, cuando llamo al siguiente código:

while(1){
    HAL<em>GPIO</em>WritePin(GPIOB, GPIO<em>PIN</em>7, GPIO<em>PIN</em>SET);
    HAL<em>Delay(1000);
    HAL</em>GPIO<em>WritePin(GPIOB, GPIO</em>PIN<em>7, GPIO</em>PIN<em>RESET);
    HAL</em>Delay(1000);
    counter++;
}

El pin cambia a una frecuencia de alrededor de 3 segundos en lugar de 1. ¿Qué estoy haciendo mal aquí?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema podría estar con el método HAL_Delay(). La función HAL_Delay() utiliza el temporizador SysTick para esperar el tiempo especificado antes de continuar, y en este caso, está esperando 1000ms (1 segundo) antes de cambiar el estado del pin.

    Sin embargo, dado que el temporizador SysTick no está generando la tasa de interrupción correcta, el retraso tampoco es preciso. Una posible solución es usar la interrupción de SysTick en lugar del método HAL_Delay() para cambiar el estado del pin.

    Para hacer esto, puede habilitar la interrupción de SysTick estableciendo el registro de control y estado de SysTick (STK_CTRL) con la siguiente configuración:

    SysTick-> CTRL | = SysTick_CTRL_TICKINT_Msk;

    Esto habilitará la interrupción de SysTick. Luego, puede definir un controlador de interrupción para la interrupción de SysTick y cambiar el estado del pin dentro del controlador. Por ejemplo:

    void SysTick_Handler(void)
    {
        HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_7); //Cambia el estado del Pin B7
    }
    
    int main(void)
    {
        SystemClock_Config();
    
        HAL_SYSTICK_Config(12500); // 1ms de interrupción
        SysTick-> CTRL | = SysTick_CTRL_TICKINT_Msk; // Habilita la interrupción de SysTick
    
        //Otro código
    
        while (1)
        {
            //Otro código
        }
    }
    

    En este código, el controlador de interrupción de SysTick cambia el estado del pin cada 1ms, y el código principal continúa ejecutándose sin retrasos. Esto debería asegurar que el pin cambia de estado a la tasa correcta.

Comments are closed.