El código STM32F303 se bloquea en el Controlador de excepciones de SysTick

0

Estoy trabajando con un microcontrolador STM32F303 con una placa Nucleo y mi código se atasca en la rutina SysTick_Handler del archivo startup_stm32f303xe.s. (Mi código se basa en un proyecto Nucleo de ejemplo, pero se reconstruye desde cero para fines de aprendizaje).

Esta publicación sugiere que necesito configuré la Interrupción de Systick a una prioridad más alta, lo que hice y no solucioné el problema. Esta publicación sugiere que la Excepción de Systick ocurre cuando el temporizador del sistema llega a 0 ... pero no creo que esté usando el temporizador del sistema en mi código.

En la vista de depuración con algunos puntos de interrupción, puedo ver que el código se ejecuta en las dos funciones de GPIO_TogglePin, después de lo cual entra en el controlador de excepciones.

¿Cómo puedo evitar que el programa cause la excepción de Systick?

Aquí está mi código:

int main(void) {

    HAL_Init();
    SystemClock_Config();
    LED2_GPIO_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();

    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Pull = GPIO_PULLUP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    GPIO_InitStruct.Pin = LED2_PIN;
    HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_8;
    HAL_GPIO_Init(LED2_GPIO_PORT, &GPIO_InitStruct);

    HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
    // Also tried HAL_InitTick(0);

    while(1) {

        HAL_GPIO_TogglePin(LED2_GPIO_PORT, LED2_PIN);
        HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);

        // Project code
    }
}

void SystemClock_Config(void) {
    RCC_ClkInitTypeDef RCC_ClkInitStruct;
    RCC_OscInitTypeDef RCC_OscInitStruct;

    /* HSI Oscillator already ON after system reset, activate PLL with HSI as source */
    RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE;
    RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
    RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
    RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2;
    RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16;
    RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
    if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) {
    Error_Handler();
    }

    /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 
 clocks dividers */
    RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK
        | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
    RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
    RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
    RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK) {
    Error_Handler();
    }

}
    
pregunta a2xia

1 respuesta

3

El ST HAL requiere el systick para funcionar.
Incrementa la marca del sistema que puede usar a través de HAL_GetTick() , se incrementa en el SysTick_Handler() a través de HAL_IncTick(); .
Se configurará mediante HAL_SYSTICK_Config en algún lugar de la HAL.

No te quedas atascado allí. Simplemente se llama cada 1 ms.

Si te quedas atascado en el controlador de systick, podría haber algún problema con la tabla de vectores. Por ejemplo: la dirección de SysTick_Handler en la posición para otra cosa.

Verifique los registros de IABR cuando se detenga.
4.2. 6 Interrumpir registros activos de bits.

    
respondido por el Jeroen3

Lea otras preguntas en las etiquetas