SSブログ

[電子工作] MacでSTM32の開発環境を GNU arm + OpenOCDで作ってみる [電子工作]

ようやくビルド+書き込みが出来るようになったレベルですが、まとめておきます。

-> CubeMXで生成したプロジェクトのビルドはこちら
環境
・MacBook Pro (15-inch, Early 2011) (いい加減古い…)
・macOS Sierra バージョン 10.12.1
・make … たぶんXCodeのコマンドラインツール。

目標
・テキストエディタ+makeで開発
・launchpadのGNU ARM Embedded Toolchainでビルドする
・OpenOCDで書き込み & デバッグする

ターゲット
・Nucleo-F303K8 ボード
 単品で同じ石を秋月で買えるから、という理由で選びましたが、ちょっと使いづらいかも
・STM32CubeF3 Firmware PackageのExampleのGPIO_IOToggleをビルドし実行する
 いわゆるLチカ

それでは手順開始です。

1.arm-none-eabi-gccの入手
お手軽にlaunchpadからバイナリを入手します。
右のDownloadsのリストから、gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2をダウンロードし、~/STM32Toolchain下に展開します。
(展開先は適当)
      cd ~
      mkdir STM32Toolchain
      cd STM32Toolchain
      tar jxf ~/Downloads/gcc-arm-none-eabi-5_4-2016q3-20160926-mac.tar.bz2

とりあえず、pathは通さないでおきます。

2.OpenOCDの入手とインストール
こちらもお手軽に、GNU ARM Eclipse OpenOCDのインストールパッケージで入れてしまいます。
githubからインストールパッケージを入手します。
Downloadsのリストから、gnuarmeclipse-openocd-osx-0.10.0-201610281609-dev.pkgをダウンロードし、実行します。

インストール先は、/Applications/GNU ARM Eclipse/OpenOCD になっています。

3.STM32 HAL Driverの入手
STmicroのサイトから、ターゲットのCPUに合わせたドライバをダウンロードします。
今回はSTM32F30xシリーズなので、STM32CubeF3をダウンロードします。
メールアドレスなどの入力が必要ですが、いくつかの手順を経るとen.stm32cubef3.zipというファイルとしてダウンロードできます。
これも、~/STM32Toolchain下に展開します。

    cd ~/STM32Toolchain
    unzip ~/Downloads/en.stm32cubef3.zip


4.プロジェクトのひな形を作成
プロジェクトフォルダとして、~/STM32ProjectフォルダにNucleo_F303K8_sample_gpioフォルダを作成します。

    cd ~
    mkdir -p STM32Project/Nucleo_F303K8_sample_gpio


作成したフォルダに、STM32CubeF3を展開したフォルダから、Driversフォルダをまるごとごっそりコピーします。

    cd ~/STM32Project/Nucleo_F303K8_sample_gpio
    cp -a ~/STM32Toolchain/STM32Cube_FW_F3_V1.6.0/Drivers .


5.サンプルのコードをコピー
STM32CubeF3を展開したフォルダから、Projects/STM32F303K8-Nucleo/Examples/GPIO/GPIO_IOToggleフォルダの、SrcIncSW4STM32フォルダをコピーします。

    cd ~/STM32Project/Nucleo_F303K8_sample_gpio
    cp -a ~/STM32Toolchain/STM32Cube_FW_F3_V1.6.0/Projects/STM32F303K8-Nucleo/Examples/GPIO/GPIO_IOToggle/Src .
    cp -a ~/STM32Toolchain/STM32Cube_FW_F3_V1.6.0/Projects/STM32F303K8-Nucleo/Examples/GPIO/GPIO_IOToggle/Inc .
    cp -a ~/STM32Toolchain/STM32Cube_FW_F3_V1.6.0/Projects/STM32F303K8-Nucleo/Examples/GPIO/GPIO_IOToggle/SW4STM32 .


6.makefileを準備
プロジェクトフォルダ直下に、下記の内容でmakefileを作ります。

※コンパイルフラグはよくわからずに書いているものもあるのでもう少し煮詰めたほうが良いような気はしています。
※HAL Driverのソースは、ビルドしながら必要なものを集めました。
PROJECT = sample

DIR=~/STM32Toolchain/gcc-arm-none-eabi-5_4-2016q3/bin
CC=$(DIR)/arm-none-eabi-gcc
NM=$(DIR)/arm-none-eabi-nm
CP=$(DIR)/arm-none-eabi-objcopy
OD=$(DIR)/arm-none-eabi-objdump
SZ=$(DIR)/arm-none-eabi-size

DEFS = -DUSE_HAL_DRIVER -DSTM32F303x8

MCU = cortex-m4
MCFLAGS  = -MD -mcpu=$(MCU) -march=armv7e-m -mtune=$(MCU)
MCFLAGS += -mthumb -mlittle-endian -mno-unaligned-access -mno-sched-prolog
MCFLAGS += -mfloat-abi=hard  -mfpu=fpv4-sp-d16
MCFLAGS += -fno-strict-aliasing -fsigned-char
MCFLAGS += -ffunction-sections -fdata-sections
MCFLAGS += -fno-schedule-insns2
MCFLAGS += -fno-common -fno-hosted
MCFLAGS += -mthumb-interwork
MCFLAGS += -fmessage-length=0
MCFLAGS += -ffreestanding
MCFLAGS += -fno-move-loop-invariants

STM32_INCLUDES = -IInc \
	-IDrivers/BSP/STM32F3xx_Nucleo_32 \
	-IDrivers/CMSIS/Device/ST/STM32F3xx/Include \
	-IDrivers/CMSIS/Include \
	-IDrivers/STM32F3xx_HAL_Driver/Inc/Legacy \
	-IDrivers/STM32F3xx_HAL_Driver/Inc

#OPTIMIZE       = -Os
OPTIMIZE       = -gdwarf-2 -O0 -flto-partition=none -fipa-sra

CFLAGS	= $(MCFLAGS)  $(OPTIMIZE)  $(DEFS)  $(STM32_INCLUDES)
CFLAGS += -Wl,-T,SW4STM32/STM32F303K8_NUCLEO/STM32F303K8Tx_FLASH.ld
AFLAGS	= $(MCFLAGS)

SRC = Src/main.c \
	Src/stm32f3xx_it.c \
	Src/system_stm32f3xx.c \
	Drivers/BSP/STM32F3xx_Nucleo_32/stm32f3xx_nucleo_32.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c

ASRC = SW4STM32/startup_stm32f303x8.s

COBJ      = $(SRC:.c=.o)
AOBJ      = $(ASRC:.s=.o)

all: build size

build: elf hex lst sym

elf: $(PROJECT).elf
hex: $(PROJECT).hex
lst: $(PROJECT).lst
sym: $(PROJECT).sym

%.hex: %.elf
	@echo
	$(CP) -O ihex $< $@

%.lst: %.elf
	@echo
	$(OD) -h -S -C $< > $@

%.sym: %.elf
	@echo
	$(NM) -n $< > $@

size:
	@echo
	$(SZ) $(PROJECT).hex
	$(SZ) $(PROJECT).elf
	$(SZ) -A -x $(PROJECT).elf

%.elf:  $(AOBJ) $(COBJ)
	@echo
	$(CC) $(CFLAGS) $^ -o $@

$(COBJ) : %.o : %.c
	@echo
	$(CC) -c $(CFLAGS) $< -o $@

$(AOBJ) : %.o : %.s
	@echo
	$(CC) -c $(CFLAGS) $< -o $@

clean:
	@echo
	find . -name '*.o' -print | xargs rm
	rm $(PROJECT).elf $(PROJECT).hex $(PROJECT).lst $(PROJECT).sym


makeしてみましょう。

/Users/user/STM32Toolchain/gcc-arm-none-eabi-5_4-2016q3/bin/../lib/gcc/arm-none-eabi/5.4.1/../../../../arm-none-eabi/lib/armv7e-m/fpu/libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x16): undefined reference to `_exit'
collect2: error: ld returned 1 exit status
make: *** [sample.elf] Error 1


_exitが無いと怒られてしまいました。
たぶん空関数で良いと思うので、適当に作ってSrcフォルダに突っ込みます。

_exit.c
void
__attribute__((weak))
_exit(int code __attribute__((unused)))
{
  // TODO: write on trace
  while (1)
    ;
}


makefileのビルド対象にも加えて、再ビルド。

SRC = Src/main.c \
	Src/stm32f3xx_it.c \
	Src/system_stm32f3xx.c \
	Drivers/BSP/STM32F3xx_Nucleo_32/stm32f3xx_nucleo_32.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_cortex.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_rcc.c \
	Drivers/STM32F3xx_HAL_Driver/Src/stm32f3xx_hal_gpio.c \
	Src/_exit.c


sample.elfファイルが生成されれば成功です。
タグ:STM32 STM32F303K8
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。