※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

lynxeyed_atsuのページ



ここでは、Mac OSXでのMARY基板開発について書いています。
前半はLPC21ISPを使ったMARY基板へのプログラム書き込みについて、後半ではEclipse Heliosを使った開発環境ネタについて書いています。

LPC21ISPでMARYに書き込む

Macでも遊びたい

普段mac使いなのでFlashmagicを使うためだけにBootCampやVMware Fusionを起動するのはちょっともったいないと思い、lpc21ispが使えないか調査しました。
Interface誌の2009年5月号のLPC2388基板もフラッシュ書き込みにlpc21ispでできているので問題は無いはず。
もしlpc21ispが入っていない場合はMacPortsで
sudo port install lpc21isp 
でインストールできます。

書き込みできない…

MARY-MB基板をUSBケーブルで接続し、ターミナル.appで
lpc21isp -control LPC1114.hex /dev/tty.SLAB_USBtoUART 115200 12000
とすると、MB基板のCPUは止まるのですが書き込みが出来ない…

なんで?
しらべるとuaaさんという方のweb日記に答えがありました。
2010年12月のてきとーな日記
PIO0_0をプルアップしてやれば良いらしい。ということでこんなジグを


もう一度再挑戦

CN5の3番ピンに3.3Vを与えています。(ここは自己責任で。汗)
ずっとプルアップするのではなくて、ターミナルのプログレスバー見ながらちょんちょんと印加する感じです。(謎
すると…

lpc21isp version 1.79
File LPC1114.hex:
loaded...
Start Address = 0x00000A95
converted to binary format...
image size : 31204
Image size : 31204
Synchronizing (ESC to abort).........(ここでCN5の3番ピンをチョンチョンとプルアップ)....... OK
(略)
Download Finished... taking 6 seconds
書き込みが出来るようになります。

MARYでgccとEclipse顛末記

gcc-4.5以降のわな

arm-gccで -mcpu=cortex-m0 がサポートされたのはgcc-4.5.0以降です。
今回はMacPortsでインストールできるarm-elf-gccを用いました。arm-none-eabiもOSX向けコンパイル済みのバイナリがMaple ArduinoのReafLabからダウンロードできるようです。
MacPortsで最新版arm-elf-gccをインストールします
sudo port install arm-elf-gcc
Cortex-M3などで以前からarm-elf-gccを導入されている方は以前のソースをコンパイルすると
/opt/local/bin/arm-elf-gcc/4.6.0/libgcc_s.so uses hardware FP, whereas a.out uses software FP
などという謎エラーを吐いてしまいます。

どうするか

ELFのヘッダにはsoftFPかhardFPの情報がありますが、オブジェクトファイルでこれらの情報が混在しているものと思われます。
で、LPC1114では強引にリンクしてもとくに問題ないはずのでコンパイル時には
gcc -Wl,--no-warn-mismatch foo.o bar.o ......
ようなサフィックスを付加すれば良いと思います。(詳細後述)

Eclipseの導入

Eclipseのダウンロードページ からEclipse IDE for C/C++ Developers (includes Incubating components)をダウンロードし、Mac OSXにインストールします。

インストールが終わったらEclipseには手をつけず、一旦CQ.zipのプロジェクトファイルの加工をします。

CQ.zipのディレクトリ構成とMakefile書き換え


CQ.zip内のプロジェクトどれか1つをひな形にします。(main.cファイル以外すべて同じ構成のようなので)
私はプロジェクトのルートディレクトリ名を"MARY_proj"として、次のような構成にしています

  • MARY_proj
    • bmp [ディレクトリ] (OLED表示用のビットマップ変換データフォルダ)
    • CMSISv1p30_LPC_11xx [ディレクトリ]
    • src [ディレクトリ]
      • adc.c
      • adc.h
      • (中略)
      • utility.c
      • utility.h
    • lpc1114_Debug_lib.ld
    • lpc1114_Debug_mem.ld
    • lpc1114_Debug.ld
    • LPC1114.axf
    • LPC1114.map
    • makefile
    • objects.mk
    • sources.mk
    • subdir.mk

で、この[src]ディレクトリに
  • LPC11xx.h
  • cr_startup_lpc11.c
  • core_cm0.h
  • system_LPC11xx.h
を[CMSISv1p30_LPC_11xx]ディレクトリからコピーしておきます。
makefileを次のように書き換えます。もし、arm-elf-gccのインストール先が異なるのであれば適宜読み替えて下さい。

##########################################################################
# GNU GCC compiler prefix and location
########################################################################## 
CROSS_COMPILE = /opt/local/bin/arm-elf-
AS = $(CROSS_COMPILE)as
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
SIZE = $(CROSS_COMPILE)size 
OBJCOPY = $(CROSS_COMPILE)objcopy 
OBJDUMP = $(CROSS_COMPILE)objdump

 -include ../makefile.init
 
RM := rm -rf

# All of the sources participating in the build are defined here
-include sources.mk
-include subdir.mk
-include objects.mk

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif
-include ../makefile.defs
# Add inputs and outputs from these tool invocations to the build variables 
# All Target
.PHONY: all
all: clean build
# Tool invocations
build: $(OBJS) $(USER_OBJS)
	@echo 'Building target: $@'
@echo 'Invoking: MCU Linker'
$(CC) -Wl,--no-warn-mismatch -nostdlib -L"CMSISv1p30_LPC11xx/Debug" -Xlinker -Map=LPC1114.map -Xlinker --gc-sections -mcpu=cortex-m0 -mthumb -T "lpc1114_Debug.ld" -o"LPC1114.axf" $(OBJS) $(USER_OBJS) $(LIBS)
# ↑soft FP/hard FPのエラー回避をするのに強制的にリンク
@echo 'Finished building target: $@'
@echo ' '
$(MAKE) --no-print-directory post-build
# Other Targets
.PHONY: clean
clean:
-$(RM) $(OBJS)$(C_DEPS)$(EXECUTABLES) LPC1114.axf
-@echo ' '
post-build:
-@echo 'Performing post-build steps'
-$(SIZE) LPC1114.axf; $(OBJCOPY) -O ihex LPC1114.axf LPC1114.hex ; $(OBJCOPY) -O binary LPC1114.axf LPC1114.bin ;# checksum -d LPC1114.bin;
-@echo ' '
.PHONY: all clean dependents
.SECONDARY: post-build
-include ../makefile.targets


次はsubdir.mkです。

################################################################################
# Automatically-generated file. Do not edit!
################################################################################

# Add inputs and outputs from these tool invocations to the build variables 
C_SRCS += \
src/adc.c \
src/array_com.c \
src/color_led.c \
src/cr_startup_lpc11.c \
(中略)
src/uart.c \
src/utility.c 

OBJS += \
./src/adc.o \
./src/array_com.o \
./src/color_led.o \
./src/cr_startup_lpc11.o \
./src/fixedpoint.o \
(中略)
./src/systick.o \
./src/timer16.o \
./src/uart.o \
./src/utility.o 

C_DEPS += \
./src/adc.d \
./src/array_com.d \
./src/color_led.d \
./src/cr_startup_lpc11.d \
(中略) 
./src/uart.d \
./src/utility.d 

# Each subdirectory must supply rules for building sources it contributes
src/%.o: src/%.c
	@echo 'Building file: $<'
	@echo 'Invoking: MCU C Compiler'
	$(CC) -D__USE_CMSIS=CMSISv1p30_LPC11xx -DDEBUG -D__CODE_RED -D__NEWLIB__ -I CMSISv1p30_LPC11x/inc -O0 -g3 -Wall -c  -fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections -mcpu=cortex-m0 -mthumb -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o"$@" "$<"
@echo 'Finished building: $<'
@echo ' '


ここまでできたらターミナルでMARY_projフォルダに移動し
$ make all
として、LPC1114.hexが生成されるか確認します。

Eclipse起動


先ほどまで準備したフォルダの場所を覚えておきます。(可能であればEclipseのデフォルトワークスペースである~/Documents/workspace/MARY_projにするとよいかも?)
Eclipse (この記事を執筆段階で最新のHelios)を起動します。

起動し、(初回はデフォルトワークスペースの場所を聞いてくると思いますが)とりあえず、OKしておきます。
メニュー → File → New → Other... を選択すると次のウィンドウがでてきます。
ここでMakefile Project with Existing Codeを選択し、Nextを選択します。
Browseで先ほどのフォルダを選択(makefileが直下にあるフォルダ)します。例では
~/Documents/workspace/MARY_proj
がそのフォルダになります。→ Finishをクリック
こんな感じになるはずなので、試しにビルドします。Command(⌘)+[B]を押します。
コンソールウィンドウに

make --no-print-directory post-build
Performing post-build steps
/opt/local/bin/arm-elf-size LPC1114.axf; /opt/local/bin/arm-elf-objcopy -O ihex LPC1114.axf LPC1114.hex ; /opt/local/bin/arm-elf-objcopy -O binary LPC1114.axf LPC1114.bin ;# checksum -d LPC1114.bin;
  text	   data	    bss	    dec	    hex	filename
 30092	   1112	   1608	  32812	   802c	LPC1114.axf

と出力されれば成功です。


参考文献(ブログ)