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();
}
}