OS X(Mavericks)にSTM32F4DISCOVERY用の開発環境を構築する(サンプルビルド編)

前回に引き続いて、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が生成される。

次の記事ではサンプルプロジェクトの実行方法について説明する。