Tengo un STM32F303RET MCU con Eclipse, Cross ARM GCC y el entorno de biblioteca HAL. Estoy utilizando una placa de descubrimiento STM32F4 como programador SWD. Mi problema es que cuando descargo el archivo hexadecimal a la MCU recibí el siguiente mensaje:
Conectado a través de SWD.
Voltaje objetivo = 2.9 V.
Modo de conexión: Normal.
ID del dispositivo: 0x446
Tamaño del flash del dispositivo: 512 Kbytes
Familia de dispositivos: STM32F302xE / F303xE / F398xx
Cargando archivo ...
Programación Flash:
Archivo: Line_Sensors2.hex
Dirección: 0x08000000
Memoria programación ...
0% ................................. 100%
Memoria programada en 1s y 358ms.
Programación completa.
Restablecimiento de MCU.
¡El núcleo se ha detenido!
Mi configuración actual en STM32CUBEMX con un cristal externo de 8MHz es:
Archivosdeorigen,generadosporSTM32CubeMX:
main.c
/*Includes------------------------------------------------------------------*/#include"stm32f3xx_hal.h"
#include "mxconstants.h"
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
int main(void)
{
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* Configure the system clock */
SystemClock_Config();
/* Initialize all configured peripherals */
MX_GPIO_Init();
while (1)
{
HAL_GPIO_WritePin(GPIOB, D42_LED_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, D43_LED_Pin, GPIO_PIN_SET);
}
}
/** System Clock Configuration
*/
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV1;
HAL_RCC_OscConfig(&RCC_OscInitStruct);
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2);
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/** Configure pins as
* Analog
* Input
* Output
* EVENT_OUT
* EXTI
*/
void MX_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* GPIO Ports Clock Enable */
__GPIOF_CLK_ENABLE();
__GPIOA_CLK_ENABLE();
__GPIOB_CLK_ENABLE();
/*Configure GPIO pins : D42_LED_Pin D43_LED_Pin */
GPIO_InitStruct.Pin = D42_LED_Pin|D43_LED_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
stm32f3xx_hal_msp.c:
/* Includes ------------------------------------------------------------------*/
#include "stm32f3xx.h"
#include "stm32f3xx_hal.h"
#include "stm32f3xx_hal_cortex.h"
/**
* Initializes the Global MSP.
*/
void HAL_MspInit(void)
{
__SYSCFG_CLK_ENABLE();
HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_0);
/* System interrupt init*/
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
stm32f3xx_it.c:
/* Includes ------------------------------------------------------------------*/
#include "stm32f3xx_hal.h"
#include "stm32f3xx.h"
#include "stm32f3xx_it.h"
/**
* @brief This function handles System tick timer.
*/
void SysTick_Handler(void)
{
HAL_IncTick();
HAL_SYSTICK_IRQHandler();
}
He intentado con el oscilador interno (calibrado a 8 MHz) como fuente PLL y sin PLL. También probado con diferentes valores PLLMUL y PLLDIV. Los resultados son todos iguales, el núcleo se detiene después de la programación.
No tengo ningún punto de interrupción , ni siquiera utilizo la sesión de depuración , simplemente descargo el archivo hexadecimal al controlador. El voltaje en el pin de reinicio es 2.96V.
Estoy actualizando el dispositivo con ST-LINK_CLI, los argumentos son los siguientes:
-c SWD -p ${project_name}.hex -Rst -Run
El -Run
siempre falla cuando se detiene el núcleo.
No tengo ideas, no sé cuál puede ser el problema aquí. Falta algo en el proyecto HAL, pero no sé qué, ya que CubeMX debería generar toda la inicialización necesaria.
Actualizar
Pude programar con éxito la MCU utilizando la biblioteca SPL, por lo que el problema debe ser específico de la biblioteca HAL. El programador / depurador debería estar bien.