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.