前回に引き続いて、STM32F4DISCOVERYのプログラムのビルドについて説明する。
STM32の開発環境は有償、無償も含めていろいろあるようだが、Eclipseのような○○なものを使いたくないので(○○はお気に入りの言葉を挿入)、Emacsおよびシェルを用いて開発を行うことにする。
情報源
まずは開発を行うのに必要な情報源から。
STMicroelectronicsのSTM32F4DISCOVERYページ
また、この記事はSetup for Mac OS Xを参考にしている。
firmware packageの入手
先ほどのSTM社のウェブサイトから、サンプルを含めたライブラリ&ユーティリティが入手できる。
STSW-STM32068のページの下の方に「サンプル&購入」という欄があり、STSW-STM32068の項のDownloadボタンをクリックすると、stsw-stm32068.zipファイルがダウンロードできる。
ダウンロードしたzipファイルを展開すると、STM32F4-Discovery_FW_V1.1.0フォルダの中に、以下のようなファイル・ディレクトリが現れる。
STM32F4-Discovery_FW_V1.1.0/ +-- Libraries/ +-- MCD-ST Liberty SW License Agreement 20Jul2011 v0.1.pdf +-- Project/ +-- Release_Notes.html +-- Utilities/ +-- _htmresc
これらのファイル・ディレクトリは後で使うので展開した場所を覚えておく。
サンプルプロジェクトの作成
開発を行う際のひな形となるサンプルプロジェクトを作成する。
最終的なサンプルプロジェクトのディレクトリ構成は以下のようになる。
sample/ (サンプルプロジェクトのベースディレクトリ) +-- inc (ヘッダーファイル) +-- src (ソースファイル) +-- Libraries (ライブラリ: STM32F4-Discovery_FW_V1.1.0からコピー) +-- Utilities (ユーティリティ: STM32F4-Discovery_FW_V1.1.0からコピー) +-- Makefile +-- stm32_flash.ld (リンカ用スクリプト)
適当な場所にベースディレクトリと初期的なディレクトリを作成する。
mkdir sample mkdir sample/inc mkdir sample/src cd sample
LibrariesとUtilitiesのコピー
ライブラリとユーティリティをstsw-stm32068.zipを展開したものからコピーする。zipファイルを展開した場所を~/Downloadsとすると、以下のようにコピーすればよい。(ソースディレクトリの最後に/を付けないのに気をつけて)
cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Libraries . cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Utilities .
incとsrcの作成
incとsrcのディレクトリにサンプルファイルをコピーする。元にするのはSTM32F4-Discovery_FW_V1.1.0のProjectsにあるIO_Toggleとする。このサンプルは実行すると中央に4つあるLEDを順に点灯するのを繰り返すというものである。
cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle/stm32f4xx_it.h inc/ cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle/stm32f4xx_conf.h inc/ cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle/stm32f4xx_it.c src/ cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle/main.c src/
その他のファイルをコピーする。system_stm32f4xx.cについては参考サイトでも説明されているように、FPUの初期化コードがIO_Toggleの方に含まれていないので、CMSISディレクトリのものを利用する。
cp ./Libraries/CMSIS/ST/STM32F4xx/Source/Templates/system_stm32f4xx.c src/ cp ./Libraries/CMSIS/ST/STM32F4xx/Source/Templates/gcc_ride7/startup_stm32f4xx.s src/
コピーすべきファイルは以上だが、上記のファイルだけでビルドすると、_exitの参照が未解決となってしまうため、以下のような内容の_exit.cを作成し、srcディレクトリに格納する。
void _exit(int x) { while(1); }
リンク用スクリプトのコピー
オブジェクトをリンクする際に用いるスクリプトをコピーする。
cp ~/Downloads/STM32F4-Discovery_FW_V1.1.0/Project/Peripheral_Examples/IO_Toggle/TrueSTUDIO/IO_Toggle/stm32_flash.ld .
Makefileの作成
最後にサンプルをビルドするため以下のようなMakefileを作成する。
TARGET=demo.hex EXECUTABLE=demo.elf CC=arm-none-eabi-gcc LD=arm-none-eabi-ld #LD=arm-none-eabi-gcc AR=arm-none-eabi-ar AS=arm-none-eabi-as CP=arm-none-eabi-objcopy OD=arm-none-eabi-objdump BIN=$(CP) -O ihex DEFS = -DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DMANGUSTA_DISCOVERY -DUSE_USB_OTG_FS -DHSE_VALUE=8000000 MCU = cortex-m4 MCFLAGS = -mcpu=$(MCU) -mthumb -mlittle-endian -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb-interwork STM32_INCLUDES = -I./inc \ -I./Libraries/CMSIS/Include/ \ -I./Libraries/CMSIS/ST/STM32F4xx/Include \ -I./Libraries/STM32F4xx_StdPeriph_Driver/inc \ -I./Libraries/STM32_USB_Device_Library/Class/hid/inc \ -I./Libraries/STM32_USB_Device_Library/Core/inc \ -I./Libraries/STM32_USB_OTG_Driver/inc \ -I./Utilities/STM32F4-Discovery #OPTIMIZE = -Os OPTIMIZE = -g -O0 CFLAGS = $(MCFLAGS) $(OPTIMIZE) $(DEFS) -I./ $(STM32_INCLUDES) -Wl,-T,stm32_flash.ld AFLAGS = $(MCFLAGS) #-mapcs-float use float regs. small increase in code size SRC = ./src/main.c \ ./src/stm32f4xx_it.c \ ./src/system_stm32f4xx.c \ ./src/_exit.c \ ./Utilities/STM32F4-Discovery/stm32f4_discovery.c \ ./Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_syscfg.c \ ./Libraries/STM32F4xx_StdPeriph_Driver/src/misc.c \ ./Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_gpio.c \ ./Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_rcc.c \ ./Libraries/STM32F4xx_StdPeriph_Driver/src/stm32f4xx_exti.c STARTUP = ./src/startup_stm32f4xx.s OBJDIR = . OBJ = $(SRC:%.c=$(OBJDIR)/%.o) OBJ += Startup.o all: $(TARGET) $(TARGET): $(EXECUTABLE) $(CP) -O ihex $^ $@ $(EXECUTABLE): $(SRC) $(STARTUP) $(CC) $(CFLAGS) $^ -o $@ clean: rm -f Startup.lst $(TARGET) $(TARGET).lst $(OBJ) $(AUTOGEN) $(TARGET).out $(TARGET).hex $(TARGET).map \ $(TARGET).dmp $(TARGET).elf
以上でビルド環境の構築は完了である。
ビルド
ビルドは単にmakeコマンドを実行すれば良い。
結果として、demo.hexとdemo.elfが生成される。
次の記事ではサンプルプロジェクトの実行方法について説明する。