[電子工作] 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下に展開します。
(展開先は適当)
とりあえず、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下に展開します。
4.プロジェクトのひな形を作成
プロジェクトフォルダとして、~/STM32ProjectフォルダにNucleo_F303K8_sample_gpioフォルダを作成します。
作成したフォルダに、STM32CubeF3を展開したフォルダから、Driversフォルダをまるごとごっそりコピーします。
5.サンプルのコードをコピー
STM32CubeF3を展開したフォルダから、Projects/STM32F303K8-Nucleo/Examples/GPIO/GPIO_IOToggleフォルダの、SrcとIncとSW4STM32フォルダをコピーします。
6.makefileを準備
プロジェクトフォルダ直下に、下記の内容でmakefileを作ります。
※コンパイルフラグはよくわからずに書いているものもあるのでもう少し煮詰めたほうが良いような気はしています。
※HAL Driverのソースは、ビルドしながら必要なものを集めました。
makeしてみましょう。
_exitが無いと怒られてしまいました。
たぶん空関数で良いと思うので、適当に作ってSrcフォルダに突っ込みます。
_exit.c
makefileのビルド対象にも加えて、再ビルド。
sample.elfファイルが生成されれば成功です。
-> 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フォルダの、SrcとIncとSW4STM32フォルダをコピーします。
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
コメント 0