1 votos

STM32 Simple Timer en Eclipse

EDIT: Editado en respuesta a la pregunta del comentario (1)

Estoy tratando de trabajar con algunos ejemplos del libro de Carmine Noviello, Dominio de STM32 . En el capítulo de introducción a los temporizadores, adapté su primer ejemplo y estoy obteniendo un error de "referencia indefinida" para la función HAL_TIM_Base_Init . También tengo otros errores, pero de uno en uno...

Resultado esperado: Este código debería compilar, enlazar y crear el objetivo, ya que tengo el .h que lo contiene en mi 'Ruta de inclusión' de Eclipse y lo estoy viendo en el archivo de cabecera como una "función exportada". Como ejemplo, el typedef TIM_Base_InitTypeDef compila bien y está en el mismo archivo de cabecera que la función que da el error.

Resultado real:

Invoking: MCU GCC Linker
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfloat-abi=hard -mfpu=fpv4-sp-d16 -specs=nosys.specs -specs=nano.specs -T"../STM32L476RGTx_FLASH.ld" -Wl,-Map=output.map -Wl,--gc-sections -o "cubemx.elf" @"objects.list"   -lm
Src/main.o: In function `main':
D:\prj\NUCLEO-476RG-03\cubemx\Debug/../Src/main.c:112: undefined reference to `HAL_TIM_Base_Init'
D:\prj\NUCLEO-476RG-03\cubemx\Debug/../Src/main.c:113: undefined reference to `HAL_TIM_Base_Start_IT'
collect2.exe: error: ld returned 1 exit status
makefile:35: recipe for target 'cubemx.elf' failed
make: *** [cubemx.elf] Error 1

He utilizado STM32CubeMX para crear los relojes básicos y configurar GPIO, y todas las llamadas de su código generado, por supuesto, funcionan bien. Pero esta función, que veo en línea en numerosos ejemplos de configuración de temporizadores en el STM32, por alguna razón no puede compilar. No puedo resolver esta referencia sin alguna idea.

Código fuente (menos el código de reloj y GPIO de CubeMX generado, que funciona):

#include "main.h"
#include "stm32l4xx_hal.h"
#include "stm32l4xx_hal_tim.h" // HEADER WITH THE FUNCTION IN IT

TIM_HandleTypeDef htim6;

/* Private function prototypes ---------------------------------------*/
void SystemClock_Config(void);
static void MX_GPIO_Init(void);

void TIM6_IRQHandler(void)
{
    HAL_TIM_IRQHandler(&htim6);
}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    if(htim->Instance == TIM6)
        HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_0);
}

int main(void)
{
  HAL_Init();

      htim6.Instance = TIM6;
      htim6.Init.Prescaler = 47999; //48MHz/48000 = 1000Hz
      htim6.Init.Period = 499; //1000HZ / 500 = 2Hz = 0.5s

      __HAL_RCC_TIM6_CLK_ENABLE(); //Enable the TIM6 peripheral

      HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0); //Enable the peripheral IRQ
      HAL_NVIC_EnableIRQ(TIM3_IRQn);

      HAL_TIM_Base_Init(&htim6); //Configure the timer ERROR
      HAL_TIM_Base_Start_IT(&htim6); //Start the timer ERROR

  SystemClock_Config();

  MX_GPIO_Init();

  while (1)
  {
  }

}

Siento que si pudiera resolver este error tendría un patrón para resolver otros que surgen del código de la biblioteca generada de CubeMX bajo Eclipse y las herramientas OpenSTM y el compilador GCC de AC6.

0voto

Chris Puntos 214

Necesitas añadir todos los archivos HAL .c usados a tu proyecto. La forma más fácil:

Descargue el programa CubeMx. Cree el proyecto para su micro. Configura el reloj. También puedes configurar otros periféricos (incluyendo los temporizadores) - pero probablemente quieras aprender a configurarlos - así que no uses el Cube para ello.

A continuación genere el proyecto.

Luego en el eclipse : Archivo -> Importar enter image description here

Siguiente ->

enter image description here

Navegue por el directorio donde ha generado el código fuente

enter image description here

Seleccione el proyecto. Marque Copiar proyecto en el espacio de trabajo y Finalizar

Y ya está.

0voto

berendi Puntos 316

Compruebe en su stm32l4xx_hal_conf.h que

#define HAL_TIM_MODULE_ENABLED

no está comentado. Si lo está, puede eliminar el /* */ manualmente, o activar un temporizador en CubeMX, y dejar que genere la fuente de nuevo. Entonces puede omitir #include "stm32l4xx_hal_tim.h" de su código, porque ya estará incluido por stm32l4xx_hal.h .

Este símbolo del preprocesador se comprueba en stm32l4xx_hal_tim.c y si no está definido, el archivo se compilará con un stub vacío. En su infinita sabiduría, los ingenieros de software de ST decidieron que no es necesario comprobar estos símbolos en las cabeceras, así que cuando un usuario desprevenido los incluye, su código compilará sin advertencias ni errores, porque las declaraciones están ahí, pero fallará al enlazar, porque las funciones no están ahí.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X