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.