El núcleo de STM32F303RET siempre se detiene después de la programación

0

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.

    
pregunta Bence Kaulics

2 respuestas

0

He logrado resolver el problema. El problema en sí era todo el proyecto Eclipse. He intentado armar un proyecto para el F3 utilizando HAL basado en la plantilla de proyecto F4 HAL Eclipse. Debo decir que algunos detalles (archivos o configuraciones necesarios) se perdieron y, en general, el código no se pudo ejecutar en la MCU.

Para resaltar uno:

El archivo vectors_stm32f4xx.c (directorio proyecto / sistema / src / cmsis) debe contener el código de inicio cuando se reinicia la MCU, y está provisto por la plantilla Eclipse F4 . En mi caso tuve que usar un archivo ensamblador provisto por ST, STM32CubeMX.

El archivo es startup_stm32f303xe.s . Ahora, como Eclipse no puede administrar archivos que terminan con .s, debería haber cambiado la extensión del archivo a .S (mayúscula). No cambié la extensión del archivo, por lo que la MCU probablemente no pudo iniciarse después de reiniciar. Tal vez este fue el mayor problema.

El alma completa:

He encontrado una descripción detallada sobre cómo usar Eclipse + STM32Cube + cualquier controlador STM32. Desafortunadamente, es demasiado largo para incluir todo esto aquí, así que solo proporciono un enlace y espero que esté disponible. Funcionó bien para mí.

    
respondido por el Bence Kaulics
1

¿Has visto esta página de configuración? Es por eso que mi depurador se detiene antes de depurar:

    
respondido por el Daniel

Lea otras preguntas en las etiquetas