2008年9月2日火曜日

Cortex M3開発環境 on Mac OS X

Design Wave 2008年5月号STM32基板の開発環境をできるだけ簡単にOS X上に構築する。

(1) クロスコンパイラ
CodeSourceryのGNU Toolchainをコンパイルするのが手っ取り早そうだが,コンパイルすら面倒ということでdevkitARMのOS X版を使うことに。幸いrelease 23bのgccは4.3.0なのでcortex-m3に対応している。

(2) プロジェクトテンプレートの作成
以下の構成のディレクトリを作成する。
$ ls ./gcc_template
FWLib/ USBLib/ ld_script/ src/
Makefile include/ lib/

(3) Firmware Library, USB Library
Design Wave 2008年5月号付属CD-ROM,あるいはSTMicroからダウンロードできるFirmware Library, USB LibraryをFWLib, USBLibディレクトリの下にコピーする。
$ ls -R ./gcc_template/{FWLib,USBLib}
./gcc_template/FWLib:
library/

./gcc_template/FWLib/library:
inc/ src/

./gcc_template/FWLib/library/inc:
cortexm3_macro.h stm32f10x_i2c.h stm32f10x_spi.h
stm32f10x_adc.h stm32f10x_iwdg.h stm32f10x_systick.h
stm32f10x_bkp.h stm32f10x_lib.h stm32f10x_tim.h
stm32f10x_can.h stm32f10x_map.h stm32f10x_tim1.h
stm32f10x_dma.h stm32f10x_nvic.h stm32f10x_type.h
stm32f10x_exti.h stm32f10x_pwr.h stm32f10x_usart.h
stm32f10x_flash.h stm32f10x_rcc.h stm32f10x_wwdg.h
stm32f10x_gpio.h stm32f10x_rtc.h

./gcc_template/FWLib/library/src:
stm32f10x_adc.c stm32f10x_i2c.c stm32f10x_spi.c
stm32f10x_bkp.c stm32f10x_iwdg.c stm32f10x_systick.c
stm32f10x_can.c stm32f10x_lib.c stm32f10x_tim.c
stm32f10x_dma.c stm32f10x_nvic.c stm32f10x_tim1.c
stm32f10x_exti.c stm32f10x_pwr.c stm32f10x_usart.c
stm32f10x_flash.c stm32f10x_rcc.c stm32f10x_wwdg.c
stm32f10x_gpio.c stm32f10x_rtc.c

./gcc_template/USBLib:
library/

./gcc_template/USBLib/library:
inc/ src/

./gcc_template/USBLib/library/inc:
usb_core.h usb_init.h usb_lib.h usb_regs.h
usb_def.h usb_int.h usb_mem.h usb_type.h

./gcc_template/USBLib/library/src:
usb_core.c usb_init.c usb_int.c usb_mem.c usb_regs.c

(4) プログラムスケルトン
付属CD-ROMの「STM32F10xxxのサンプル・プログラムおよびマニュアル/STM32F10xFWLib/FWLib/project」および「STM32F10xxxのサンプル・プログラムおよびマニュアル/STM32F10xFWLib/FWLib/project/RIDE」からプログラムスケルトンとなるソースファイルを./gcc_template/{src,include}にコピーする。
$ ls ./gcc_template/{src,include}
./gcc_template/include:
stm32f10x_conf.h stm32f10x_it.h usb_conf.h

./gcc_template/src:
cortexm3_macro.s stm32f10x_it.c
main.c stm32f10x_vector.c


(5) リンカスクリプト
Design Wave 2008年6月号のJTAGデバッガ自作記事のデータをダウンロードする。ダウンロードしたdata.zipを展開してdata/CQ/ARM_OCD_myJTAG/workspace/LED/ld_scriptにあるリンカスクリプトを./gcc_template/ld_scriptへコピーする。
$ ls ./gcc_template/ld_script
STM32_128K_20K_FLASH.ld STM32_SEC_RAM.ld
STM32_COMMON.ld STM32_SEC_RAMonly.ld
STM32_SEC_EXT.ld stm32.ld
STM32_SEC_FLASH.ld

また,DFU領域を書き潰さないようにstm32.ldを以下のように修正しておく。
9c9
< INCLUDE "./ld_script/STM32_COMMON.ld"
---
> INCLUDE "../ld_script/STM32_COMMON.ld"
15,16c15,16
< /* FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K */
> FLASH (rx) : ORIGIN = 0x8003000, LENGTH = 128K - 12K
---
< FLASH (rx) : ORIGIN = 0x8000000, LENGTH = 128K
> /*FLASH (rx) : ORIGIN = 0x8003000, LENGTH = 128K - 12K */
29c29
< INCLUDE "./ld_script/STM32_SEC_FLASH.ld"
---
> INCLUDE "../ld_script/STM32_SEC_FLASH.ld"


(6) Thum2ライブラリ
data/CQ/ARM_OCD_myJTAG/workspace/LED/lib_thumb2にあるThumb2でコンパイルされたライブラリを./gcc_template/libへコピーする。
$ ls ./gcc_template/lib
libc.a libgcc.a libiberty.a
libg.a libgcov.a libm.a

また,data/CQ/ARM_OCD_myJTAG/workspace/LED/src/syscalls.cを./gcc_template/srcへコピーしておく。

(7) Makefile
以下の内容でmakefileを作成する。
###
### Makefile for STM32F10x Cortex-M3
###

PROG = target

SRCDIR = ./src
CFILES = ${SRCDIR}/main.c \
${SRCDIR}/stm32f10x_vector.c \
${SRCDIR}/stm32f10x_it.c
SFILES = ${SRCDIR}/cortexm3_macro.s

CC = arm-eabi-gcc
AS = arm-eabi-as
AR = arm-eabi-ar
LD = arm-eabi-ld
OBJCOPY = arm-eabi-objcopy

CFLAGS = -mcpu=cortex-m3 -mthumb -Wall -g -O2
ASFLAGS = -mthumb
LDFLAGS = --cref -gc-sections -Map=${PROG}.map -T ld_script/stm32.ld -L ./lib

INCLUDES = -I./include -I./FWLib/library/inc -I./USBLib/library/inc

# Firmware Library source files
FWLIBDIR = ./FWLib/library/src
FWLIBFILES = \
${FWLIBDIR}/stm32f10x_adc.c\
${FWLIBDIR}/stm32f10x_bkp.c\
${FWLIBDIR}/stm32f10x_can.c\
${FWLIBDIR}/stm32f10x_dma.c\
${FWLIBDIR}/stm32f10x_exti.c\
${FWLIBDIR}/stm32f10x_flash.c\
${FWLIBDIR}/stm32f10x_gpio.c\
${FWLIBDIR}/stm32f10x_i2c.c\
${FWLIBDIR}/stm32f10x_iwdg.c\
${FWLIBDIR}/stm32f10x_lib.c\
${FWLIBDIR}/stm32f10x_nvic.c\
${FWLIBDIR}/stm32f10x_pwr.c\
${FWLIBDIR}/stm32f10x_rcc.c\
${FWLIBDIR}/stm32f10x_rtc.c\
${FWLIBDIR}/stm32f10x_spi.c\
${FWLIBDIR}/stm32f10x_systick.c\
${FWLIBDIR}/stm32f10x_tim.c\
${FWLIBDIR}/stm32f10x_tim1.c\
${FWLIBDIR}/stm32f10x_usart.c\
${FWLIBDIR}/stm32f10x_wwdg.c

# USB Library source files
USBLIBDIR = ./USBLib/library/src
USBLIBFILES = \
${USBLIBDIR}/usb_core.c\
${USBLIBDIR}/usb_init.c\
${USBLIBDIR}/usb_int.c\
${USBLIBDIR}/usb_mem.c\
${USBLIBDIR}/usb_regs.c

OBJS = ${CFILES:.c=.o} ${SFILES:.s=.o}
LIBOBJS = ${FWLIBFILES:.c=.o} ${USBLIBFILES:.c=.o}

.SUFFIXES: .c .s .o

.c.o:
${CC} ${CFLAGS} ${INCLUDES} -c $< -o $@

.s.o:
${AS} ${ASFLAGS} $< -o $@

all: ${PROG}.s19

./lib/libstm32.a : ${LIBOBJS}
${AR} cr $@ ${LIBOBJS}

${PROG}.elf : ${OBJS} ./lib/libstm32.a
${LD} ${LDFLAGS} ${OBJS} -lstm32 -o $@

${PROG}.s19: ${PROG}.elf
$(OBJCOPY) -O srec ${PROG}.elf ${PROG}.s19

${PROG}.hex: ${PROG}.elf
$(OBJCOPY) -O ihex ${PROG}.elf ${PROG}.hex

clean :
rm -rf ${OBJS} ${LIBOBJS} ${PROG}.elf ${PROG}.s19 ${PROG}.hex ${PROG}.map ./lib/libstm32.a