GCCでLPC1343用のバイナリをビルドする

結構前に買ってずっと放置されていたlpcxpresso nxp 1343をそろそろ使ってみる。OSを何度も変更する自分にとってはlpcxpressoIDEのプロダクトコードの入力とかめんどくさいので、GCCでlpc1343のバイナリを作成します。

ビルドした環境

Sourcery G++ Liteは適当にインストールしてpathを通しておく。

Lチカサンプルコードと必要なファイルの入手

http://ics.nxp.com/support/lpcxpresso/からLPC1300 Seriesの下のリンクからExample Projectsをダウンロード

適当なフォルダ(ここではblink)を作って、examples.lpc13xx.zipからLチカに必要な以下のファイルをコピー

  • CMSISv1p30_LPC13xx/src/core_cm3.c
  • CMSISv1p30_LPC13xx/src/system_LPC13xx.c
  • CMSISv1p30_LPC13xx/inc/core_cm3.h
  • CMSISv1p30_LPC13xx/inc/system_LPC13xx.h
  • CMSISv1p30_LPC13xx/inc/LPC13xx.h
  • blinkly/src/blinkly_main.c
  • blinkly/src/clkconfig.c
  • blinkly/src/clkconfig.h
  • blinkly/src/config.h
  • blinkly/src/gpio.c
  • blinkly/src/gpio.h
  • blinkly/src/timer32.c
  • blinkly/src/timer32.h

あといくつかのファイルを以下のリンクから持ってきてblinkにコピー

firmware.binをUSB経由で書き込み、動作させるためにlpcrcを用意しblinkに配置

GCCでビルドしたfirmware.binはそのままでは問題があるようでlpcrcでfirmware.binを書き換えないといけない。書き換えるとうまく動作した。よく調べてないので理由はよくわからないけど動いているから問題はないはず。

Makefilehttps://github.com/vsergeev/mbed-cmsis/blob/master/Makefileを修正した
以下のMakefileをblinkに保存
Makefile

# LPC1343 make Sample

PROJECT=lpc13xx_blink
OBJECTS=LPC1xxx_startup.o LPC13xx_handlers.o core_cm3.o system_LPC13xx.o blinky_main.o clkconfig.o gpio.o timer32.o
LSCRIPT=linkscript.ld

OPTIMIZATION= 0
DEBUG= -g
# Compiler Options
GCFLAGS = -Wall -fno-common -mcpu=cortex-m3 -mthumb -O$(OPTIMIZATION) $(DEBUG)
GCFLAGS += -D__RAM_MODE__=0
#GCFLAGS += -Wcast-align -Wcast-qual -Wimplicit -Wpointer-arith -Wswitch
#GCFLAGS += -Wredundant-decls -Wreturn-type -Wshadow -Wunused
LDFLAGS = -mcpu=cortex-m3 -mthumb -O$(OPTIMIZATION)  -Wl,-Map=$(PROJECT).map -T$(LSCRIPT)
ASFLAGS = $(LISTING) -mcpu=cortex-m3 --defsym RAM_MODE=0

# Compiler/Assembler/Linker Paths
GCC = arm-none-eabi-gcc
AS = arm-none-eabi-as
LD = arm-none-eabi-ld
OBJCOPY = arm-none-eabi-objcopy
REMOVE = rm -f
SIZE = arm-none-eabi-size

#########################################################################

all: $(PROJECT).bin

$(PROJECT).bin: $(PROJECT).elf
	$(OBJCOPY) -O binary -j .text -j .data $(PROJECT).elf $(PROJECT).bin
	mv $(PROJECT).bin firmware.bin
	./lpcrc-linux firmware.bin

#$(PROJECT).hex: $(PROJECT).elf
#	$(OBJCOPY) -R .stack -O ihex $(PROJECT).elf $(PROJECT).hex

$(PROJECT).elf: $(OBJECTS)
	$(GCC) $(OBJECTS) $(LDFLAGS) -o $(PROJECT).elf

stats: $(PROJECT).elf
	$(SIZE) $(PROJECT).elf

clean:
	$(REMOVE) $(OBJECTS)
	$(REMOVE) $(PROJECT).hex
	$(REMOVE) $(PROJECT).elf
	$(REMOVE) $(PROJECT).map
	$(REMOVE) $(PROJECT).bin
	$(REMOVE) $(OBJECTS)
	$(REMOVE) firmware.bin

#########################################################################
# Default rules to compile .c and .cpp file to .o
# and assemble .s files to .o

.c.o :
	$(GCC) $(GCFLAGS) -c $<

.cpp.o :
	$(GCC) $(GCFLAGS) -c $<

.S.o :
	$(AS) $(ASFLAGS) -o $@ $<
#########################################################################

ファイルの修正

いろんなところからファイルを集めてきたのでファイルを少し修正します

スタートアップコードの修正

LPC1xx_startup.cはmain()を呼ぶ前にSystemInit()を呼び出すように変更
38と39行目の間にextern void SystemInit (void);を追加

extern void SystemInit (void);

60と61行目の間にSystemInit();を追加

SystemInit();
リンカスクリプトの修正

linkscript.ldの30行目あたりにMEMORYの記述を追加

MEMORY
{
	flash(rx): ORIGIN = 0x00000000, LENGTH = 32k
	sram(rwx): ORIGIN = 0x10000000, LENGTH = 8K
}

あとはmakeコマンドでバイナリが作成されます。

書き込み

firmware.binの書き込みはhttp://hp.vector.co.jp/authors/VA000177/html/LPCXpresso.htmlに書いてあるのでそれを参考に、USBコネクタ取り付けて、firmware.binを書き込む

やっと動きましたー。やったね!
ここまで書いてあれだけど、こんな面倒なことをしなくてもhttps://github.com/microbuilder/LPC1343CodeBaseに別のサンプルソースコードがあるのでそれ使ってもいいと思います。