STM32 Simple Timer in Eclipse

0

EDITAR: Editado en respuesta a la pregunta en el comentario (1)

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

Resultado esperado: Este código debe compilar, vincular y crear el destino, ya que tengo el archivo .h que lo contiene en mi Eclipse 'Incluye ruta' y lo estoy viendo en el encabezado archivo como una "función exportada". Como ejemplo, el typedef TIM_Base_InitTypeDef compila bien y está en el mismo archivo de encabezado que la función que está generando 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

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

Código fuente (menos el reloj CubeMX generado y el código GPIO, 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 único error tendría un patrón para resolver otros que surgen del código de biblioteca generado desde CubeMX bajo Eclipse y las herramientas OpenSTM y el compilador GCC de AC6.

    
pregunta TomServo

2 respuestas

1

Debe agregar todos los archivos HAL .c usados a su proyecto. La forma más fácil:

Descarga el CubeMx. Crea el proyecto para tu micro. Configurar el reloj. También puede configurar otros periféricos (incluidos los temporizadores), pero es probable que desee aprender a configurarlos, por lo que no use el Cubo para ello.

A continuación, genere el proyecto.

Luego, en el eclipse: Archivo - > Importar

Siguiente->

Examineeldirectoriodondehageneradoelcódigofuente

Selecciona el proyecto. Marque Copiar proyecto en el área de trabajo y Finalizar

Y ya has terminado.

    
respondido por el P__J__
0

Comprueba en tu stm32l4xx_hal_conf.h que

#define HAL_TIM_MODULE_ENABLED

no está comentado. Si es así, puede eliminar /* */ manualmente o habilitar un temporizador en CubeMX y dejar que genere la fuente nuevamente. Luego, puede omitir #include "stm32l4xx_hal_tim.h" de su código, porque ya estará incluido por stm32l4xx_hal.h .

Este símbolo del preprocesador está marcado en stm32l4xx_hal_tim.c , y si no está definido, el archivo se compilará en un código auxiliar vacío. En su sabiduría infinita, los ingenieros de software de ST decidieron que no es necesario verificar estos símbolos en los encabezados, por lo que cuando un usuario confiado los incluye, su código se compilará sin advertencias ni errores, porque las declaraciones están ahí, pero fallan cuando están vinculadas , porque las funciones no están ahí.

    
respondido por el berendi

Lea otras preguntas en las etiquetas