LINUX.ORG.RU

libopencm3

 , ,


0

1

Решил потыкать сие творение (да и вообще stm32 из под онтопика запрограммировать).

#define STM32F4

#include <libopencm3/stm32/rcc.h>
#include <libopencm3/stm32/gpio.h>

/* Set STM32 to 168 MHz. */
static void clock_setup(void)
{
	rcc_clock_setup_hse_3v3(&hse_8mhz_3v3[CLOCK_3V3_168MHZ]);

	/* Enable GPIOD clock. */
	rcc_periph_clock_enable(RCC_GPIOD);
}

static void gpio_setup(void)
{
	/* Set GPIO12-15 (in GPIO port D) to 'output push-pull'. */
	gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT,
			GPIO_PUPD_NONE, GPIO12 | GPIO13 | GPIO14 | GPIO15);
}

int main(void)
{
	int i;

	clock_setup();
	gpio_setup();

	/* Set two LEDs for wigwag effect when toggling. */
	gpio_set(GPIOD, GPIO12 | GPIO14);

	/* Blink the LEDs (PD12, PD13, PD14 and PD15) on the board. */
	while (1) {
		/* Toggle LEDs. */
		gpio_toggle(GPIOD, GPIO12 | GPIO13 | GPIO14 | GPIO15);
		for (i = 0; i < 6000000; i++) { /* Wait a bit. */
			__asm__("nop");
		}
	}

	return 0;
}

Скопировал код из примера, инклуды указал, компилирую...

'GPIO_PORT_D_BASE' could not be resolved

Ну и сразу призываю любителя libopencm3 Eddy_Em

p.s.

Что примечательно, hal из коробки тоже не компилируется, хотя шаблонный проект с мигающим светодиодом пашет.

а так?

#include <libopencm3/stm32/f4/rcc.h>
#include <libopencm3/stm32/f4/gpio.h>

вызов и выхлоп компилятора выложи целиком

registrant ★★★★★ ()
Последнее исправление: registrant (всего исправлений: 1)

Что у тебя за микроконтроллер?

Вот, пробую для F4. makefile:

BINARY		= test
BOOTPORT	?= /dev/ttyUSB0
BOOTSPEED	?= 115200
LDSCRIPT	= stm32f4-discovery.ld
LIBNAME		= opencm3_stm32f4
DEFS		= -DSTM32F4 -DEBUG

OBJDIR = mk
INDEPENDENT_HEADERS=

FP_FLAGS	?= -msoft-float
ARCH_FLAGS	= -mthumb -mcpu=cortex-m3 $(FP_FLAGS) -mfix-cortex-m3-ldrd

###############################################################################
# Executables
PREFIX		?= arm-none-eabi

RM			:= rm -f
RMDIR		:= rmdir
CC			:= $(PREFIX)-gcc
LD			:= $(PREFIX)-gcc
AR			:= $(PREFIX)-ar
AS			:= $(PREFIX)-as
OBJCOPY		:= $(PREFIX)-objcopy
OBJDUMP		:= $(PREFIX)-objdump
GDB			:= $(PREFIX)-gdb
STFLASH		= $(shell which st-flash)
STBOOT		= $(shell which stm32flash)

###############################################################################
# Source files
LDSCRIPT	?= $(BINARY).ld
SRC			= $(wildcard *.c)
OBJS		= $(addprefix $(OBJDIR)/, $(SRC:%.c=%.o))

ifeq ($(strip $(OPENCM3_DIR)),)
OPENCM3_DIR := /usr/local/arm-none-eabi
$(info Using $(OPENCM3_DIR) path to library)
endif

INCLUDE_DIR	= $(OPENCM3_DIR)/include
LIB_DIR		= $(OPENCM3_DIR)/lib
SCRIPT_DIR	= $(OPENCM3_DIR)/scripts

###############################################################################
# C flags
CFLAGS		+= -Os -g
CFLAGS		+= -Wall -Wextra -Wshadow -Wimplicit-function-declaration
CFLAGS		+= -Wredundant-decls
# -Wmissing-prototypes -Wstrict-prototypes
CFLAGS		+= -fno-common -ffunction-sections -fdata-sections

###############################################################################
# C & C++ preprocessor common flags
CPPFLAGS	+= -MD
CPPFLAGS	+= -Wall -Werror
CPPFLAGS	+= -I$(INCLUDE_DIR) $(DEFS)

###############################################################################
# Linker flags
LDFLAGS		+= --static -nostartfiles
LDFLAGS		+= -L$(LIB_DIR)
LDFLAGS		+= -T$(LDSCRIPT)
LDFLAGS		+= -Wl,-Map=$(*).map
LDFLAGS		+= -Wl,--gc-sections

###############################################################################
# Used libraries
LDLIBS		+= -l$(LIBNAME)
LDLIBS		+= -Wl,--start-group -lc -lgcc -Wl,--end-group

.SUFFIXES: .elf .bin .hex .srec .list .map .images
.SECONDEXPANSION:
.SECONDARY:

ELF		:= $(OBJDIR)/$(BINARY).elf
LIST	:= $(OBJDIR)/$(BINARY).list
BIN		:= $(BINARY).bin
HEX		:= $(BINARY).hex

all: bin

elf: $(ELF)
bin: $(BIN)
hex: $(HEX)
list: $(LIST)

$(OBJDIR):
	mkdir $(OBJDIR)

$(OBJDIR)/%.o: %.c
	@printf "  CC      $<\n"
	$(CC) $(CFLAGS) $(CPPFLAGS) $(ARCH_FLAGS) -o $@ -c $<

$(SRC) : %.c : %.h $(INDEPENDENT_HEADERS)
	@touch $@

%.h: ;

$(BIN): $(ELF)
	@printf "  OBJCOPY $(BIN)\n"
	$(OBJCOPY) -Obinary $(ELF) $(BIN)

$(HEX): $(ELF)
	@printf "  OBJCOPY $(HEX)\n"
	$(OBJCOPY) -Oihex $(ELF) $(HEX)

$(LIST): $(ELF)
	@printf "  OBJDUMP $(LIST)\n"
	$(OBJDUMP) -S $(ELF) > $(LIST)

$(ELF): $(OBJDIR) $(OBJS) $(LIB_DIR)/lib$(LIBNAME).a
	@printf "  LD      $(ELF)\n"
	$(LD) $(LDFLAGS) $(ARCH_FLAGS) $(OBJS) $(LDLIBS) -o $(ELF)

clean:
	@printf "  CLEAN\n"
	$(RM) $(OBJS) $(OBJDIR)/*.d $(ELF) $(HEX) $(LIST) $(OBJDIR)/*.map
	$(RMDIR) $(OBJDIR)

flash: $(BIN)
	@printf "  FLASH  $(BIN)\n"
	$(STFLASH) write $(BIN) 0x8000000

boot: $(BIN)
	@printf "  LOAD $(BIN) through bootloader\n"
	$(STBOOT) -b$(BOOTSPEED) $(BOOTPORT) -w $(BIN)

.PHONY: clean elf hex list flash boot

stm32f4-discovery.ld:

MEMORY
{
	rom (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
	ram (rwx) : ORIGIN = 0x20000000, LENGTH = 128K
}

/* Include the common ld script. */
INCLUDE libopencm3_stm32f4.ld
Но матерится
uses VFP register arguments

Я еще не собирал ничего под F4 с opencm3, так что ХЗ, что ему надо.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

А, извиняюсь, там же hard:

FP_FLAGS	?= -mfloat-abi=hard

Усе накомпиляло, бинарь вышел в 1416 байт.

Eddy_Em ☆☆☆☆☆ ()

В общем, единственное, что тебе нужно — это подставить правильный линкер-скрипт с указанием объема памяти (сейчас это stm32f4-discovery.ld). Образец взял у них же, в opencm3. Но готовья на все случаи жизни нет, поэтому для всех вариаций F103 я вручную копипастил, меняя ROM/RAM.

Если лень кучу даташитов ковырять, загляни в libopencm3/ld/devices.data

Eddy_Em ☆☆☆☆☆ ()

И да: собери этот же тестовый код на регистрах и удивись.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

У меня STM32F407 (Короче дискавери платка).

Тут оказалось проще - какой-то глюк либо IDE либо препроцессора. Компилирую я с помощью arm-none-eabi-gcc ХЗ какой версии.

Правда он почему-то пытается запускаться с нулевого адреса.

Скрипт взят из стандартного проекта.

/*
 * Memory Spaces Definitions.
 *
 * Need modifying for a specific board. 
 *   FLASH.ORIGIN: starting address of flash
 *   FLASH.LENGTH: length of flash
 *   RAM.ORIGIN: starting address of RAM bank 0
 *   RAM.LENGTH: length of RAM bank 0
 *
 * The values below can be addressed in further linker scripts
 * using functions like 'ORIGIN(RAM)' or 'LENGTH(RAM)'.
 */

MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 128K
  CCMRAM (xrw) : ORIGIN = 0x10000000, LENGTH = 64K
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 1024K
  FLASHB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB0 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB1 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB2 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  EXTMEMB3 (rx) : ORIGIN = 0x00000000, LENGTH = 0
  MEMORY_ARRAY (xrw)  : ORIGIN = 0x20002000, LENGTH = 32
}

/*
 * For external ram use something like:

   RAM (xrw) : ORIGIN = 0x64000000, LENGTH = 2048K

 */
RiseOfDeath ★★★★ ()
Последнее исправление: RiseOfDeath (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.