Захотел попробовать libopencm3. Написал моргание светодиодом с копипастой makefile, получилось так:
MCU := cortex-m3
CC := arm-none-eabi-gcc
AS := arm-none-eabi-as
OBJCOPY := arm-none-eabi-objcopy
LD :=arm-none-eabi-ld
SIZE := arm-none-eabi-size
SF := st-flash
TARGET := blink
ARCH_FLAGS = -mcpu=$(MCU) -mthumb
CSTD ?= -std=c99
CFLAGS = $(ARCH_FLAGS) $(CSTD) -Wall -Wextra
CFLAGS += -Wshadow
CFLAGS += -MD -O0
CFLAGS += -DSTM32F1
CFLAGS += -I./libopencm3/include
LD_SCRIPT = stm32f1.ld
LIB_PATH = ./libopencm3/lib
LIB_NAME = opencm3_stm32f1
LDFLAGS = -T$(LD_SCRIPT) -L$(LIB_PATH) -l$(LIB_NAME)
LDFLAGS += -nostartfiles $(ARCH_FLAGS) --specs=nosys.specs
all:
$(CC) $(CFLAGS) $(LDFLAGS) main.c -o bin.elf
Вот так падает:
/usr/lib/gcc/arm-none-eabi/8.3.1/../../../arm-none-eabi/bin/ld: /tmp/cc8qsoBW.o: in function `main':
main.c:(.text+0x2a): undefined reference to `rcc_periph_clock_enable'
/usr/lib/gcc/arm-none-eabi/8.3.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x38): undefined reference to `gpio_set_mode'
/usr/lib/gcc/arm-none-eabi/8.3.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x42): undefined reference to `gpio_clear'
/usr/lib/gcc/arm-none-eabi/8.3.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x4c): undefined reference to `gpio_toggle'
/usr/lib/gcc/arm-none-eabi/8.3.1/../../../arm-none-eabi/bin/ld: main.c:(.text+0x5e): undefined reference to `gpio_toggle'
Сам libopencm3 для f1 скомпилирован
find libopencm3/lib/ -name "*.a"
libopencm3/lib/libopencm3_stm32f1.a
Также у меня падает проект на линковке, который я хочу перевести на libopencm3 с примерно таким Makefile-ом (CFLAFG примерно такое же как и в прошлом Makefile):
...
INCLUDE := ./libopencm3/include
LIBPATH := ./libopencm3/lib
LIBNAME := opencm3_stm32f3
LINKER_SCRIPT := linker.ld
...
LDFLAGS = --static -L$(LIBPATH) -l$(LIBNAME) -T$(LINKER_SCRIPT)
...
$(TARGET).elf: $(OBJS) | $(BIN_DIR)
$(LD) $(LDFLAGS) $^ -o $(BIN_DIR)/$@
Он также не может найти символы:
undefined reference to `rcc_periph_clock_enable'
undefined reference to `gpio_mode_setup'
и т.д.
libopencm3 компилировал make TARGETS=stm32/f1
для f1 и CFLAGS='-mfloat-abi=hard -mfpu=fpv4-sp-d16' make TARGETS=stm32/f3
для f3 (без CFLAGS потом ругается на application.elf uses VFP register arguments blah.o does not
не знаю хорошее ли это решение, нашел его методом проб и ошибок).
Что я делаю не так? Я не очень понимаю, почему оно не работает: библиотека скомпилирована, я указываю линкеру -L и -l. Что могло пойти не так?
Решение
Я поставил -lopencm3_stm32f*
в конец и все заработало.