ねぎ2013年06月04日 20時56分15秒

ねぎ
よく使う食材に「ねぎ」がある。
今まで根っこの部分は切って捨てていた。


ところがこの部分を土の中に埋めておくと芽が出てねぎができるらしい。
捨てる部分から新しいねぎができるならこんないいことはない。
さっそくやってみた。
9本植えてここまで育ったのは4本。
へなへなとしていて元気がないが問題なく食べられるだろう。
でも、味噌汁に入れると1~2回で終わってしまいそうだ。
またねぎを買ってきたら根っこだけ植えておこう。

これもリサイクルだろうか?

LPC800 (2) LPC800 Mini Kit2013年06月09日 15時33分39秒

LPC800 Mini Kit
NXP から荷物か届いた。
何か頼んだ記憶は無い。


恐る恐る開けてみると、袋の中に箱が入っており LPC800 Mini Kit と書いてある。
そういえば、[LPC800キャンペーン]簡単なクイズに答えて、LPC800 Mini ボードを当てよう!
に応募していたのだった。こういうのに当たるのは初めてだ。
うれしい!!


さて、それでは使うための準備を始めよう。
用意する物は
・USB ケーブル (電源供給用)
・RS232 基板 (シリアル通信用)
これぐらいだろうか?


参照:LPC800 Mini Kit (LPC810M021FN8)
   LPC810 CodeBase

LPC800 (3) MDK-ARM に LPC81x を追加する2013年06月11日 21時39分50秒

MDK-ARM_AddOn_LPC8xx
MDK-ARM の最新版は 4.71a だが、私の使っている Version は 4.53 だ。
この状態で LPC81x のプロジェクトを読み込むと以下のようなダイアログが表示される。
Error: Device not found
Please update your device selection
というわけで LPC81x を追加する。追加は簡単だ。
LPC800 Support for version 4.60 of Keil MDK-ARM これを実行すればよい。


さて、どこに追加されたのか見てみると
UV4.cdb の中ではなく 別のファイル NXP_LPC8xx.cdb が追加されて TOOLS.INI に以下の内容が記述してある。
[UV2]
CDB0=UV4\NXP_LPC8xx.cdb("NXP LPC8xx Devices")
この方法は知らなかった。これからは私専用の Device file を作成し、そこに追加するデバイスを書き加えることにしよう。


もちろん、今回も GCC 用の Startup と リンカースクリプトを用意する。
Keil\ARM\GNU\Startup\NXP\LPC8xx\startup_LPC8xxG++.s

 




Keil\ARM\GNU\Startup\NXP\LPC8xx\LPC810_rom_gnu.ld

 




参照:
    Device Database Parameters (デバイスデータベースのパラメータ)
    Customize or Add Devices (カスタムデバイスと新規デバイス)


環境:LPC800 Mini Kit (LPC810M021FN8)
    + Keil MDK-ARM V4.53
    + GCC Sourcery CodeBench Lite 2012.09-63

LPC800 (4) LED blink (1)2013年06月12日 22時01分21秒

LPC800 Mini Kit に RS232 変換基板を接続
電源を入れる前に基板をチェックする。パターンが有るのに R1 が実装して無い。回路図を見るとピンヘッダーに出力する電圧は R1 が 3.3V で R2 が 5V だ。シリアルの変換基板は 3.3V で使いたいので R2 を取り除き R1 の場所に実装する。
LPC800 Mini-Kit Schematic



恐る恐るUSB ケーブルだけ接続してみる。
青 LEDが点滅する。
LPC800 Mini Kit LED blink

プログラムが書き込んであるんだ!
よしよし。
次にRS232 変換基板を接続する。
Hello, LPC810! が連続して出力される。
Hello LPC810 !!



なるほど、今のところ問題はない。
さて、前回 Startup を用意したが、ここでは出来合いのサンプルを使うことにする。
コードサンプルは LPC810 CodeBase
最初はプリビルドされた tools\LPC810_Blinky_0_2.hex を書き込んでみよう。
書き込みは Flash Magic を使う。 ISP モードにするために Reset と ISP のSW を同時に押す。Reset ・ ISP の順で SW を開放する。
これで ISP モードになっているはずなので書き込みスタート。
Flash Magic V7.50

そして Reset 。
特に問題はない。ただ、実行してみると LED の点滅速度が遅い。
まあ、いいか。


参照:
    LPC800-Mini - DIP8 LPC810ボード
    LPC800 Mini-Kit (LPC810M021FN8)
    LPC810 CodeBase

LPC800 (5) LED blink (2) Keil µVision4 + GCC2013年06月13日 21時13分02秒

GUI Flash Magic
前回手に入れたサンプル (LPC810 CodeBase) をコンパイルして書き込んでみよう。
使う環境はいつもの通り
   Keil MDK-ARM V4.53
   GCC Sourcery CodeBench Lite 2012.09-63
さっそくプロジェクトを作る。
Output
 ž Create Executable
 R Create HEX File
Listing
 R Linker Listing
 R Memory Map
CC
 Define	 	__USE_CMSIS
 R Enable APCS (ARM Procedure Call Standard)
 R Support Calls between ARM and THUMB Instruction Set
 R Compile Thumb Code
 IncludePaths		.\cmsis;.\src
 MiscControls		-fmessage-length=0 -fno-builtin -ffunction-sections -fdata-sections

Assembler
 Define			
 R Enable ARM/Thumb Interworking
 Include Paths	
 MiscControls	

Linker
 R Do not use Standard System Startup Files
 R Do not use Standard System Libraries
 R Use Math Libraries
 linkerScriptFile	.\linker\LPC810_rom_gnu.ld
 IncludeLibraries	
 IncludePaths		.\linker
 MiscControls		-nostdlib -Xlinker --gc-sections

Utilities
 ž Use External Tool for Flash Programming
 Command		fm.exe
 Arguments		DEVICE($D,$X) ERASEUSED("!H",PROTECTISP) HEXFILE("!H",NOCHECKSUMS,NOFILL,PROTECTISP) COM(1,230400)


ソースをプロジェクトに登録
 main.c
 system_LPC8xx.c
 gpio.c
 mrt.c
 printf.c
 printf-retarget.c
 spi.c
 uart.c
 startup_LPC8xxG++.s



次にソースの修正
system_LPC8xx.c
System PLL Clock Source Select Register (SYSPLLCLKSEL) を System Oscillator から IRC Oscillator に変更(1を0)


コンパイル・・・・・・・・問題ない
書き込み・・・・・・・・・エラーだ!
ERROR: Invalid parameters for DEVICE directive: DEVICE(LPC810M021,12.0)


今回 Flash Magic を新しくしたのでそのせいかも知れない。
ドキュメントを読んでみると、パラメータに flashbank が増えている。
パラメータを追加して書き込み・・・・・・・・またエラーだ。
ERROR: Invalid parameters for DEVICE directive: DEVICE(LPC810M021,12.0,0)


何がいけないんだ。
GUI版では書き込みできるのでGUI版と同じデバイス名(LPC810M021FN8)を使ってみる。
書き込み・・・・・・・・・エラーだ!
ERROR: Invalid parameters for ERASEUSED directive: ERASEUSED(.\outG++\LPC810_CodeBaseS.HEX,PROTECTISP)


今度は異なる部分のパラメータだ。
分からない。


もうだめだ。
GUI版の Flash Magic で書き込むことにする。
書き込んで Reset 。


動いている。
特に問題は無いようだ。
さて、ここで動作 Clock を調べてみよう。system_LPC8xx.c の SYSPLLCTRL_Val が 0x41で SYSAHBCLKDIV_Val が 0x1なので Main CLK が 24MHz 、System clock も 24MHz ということになる。


環境:LPC800 Mini Kit (LPC810M021FN8)
    + Keil MDK-ARM V4.53
    + LPC800 Support for version 4.60 of Keil MDK-ARM
    + GCC Sourcery CodeBench Lite 2012.09-63
    + LPC810 CodeBase
    + Flash Magic Version 7.50

LPC800 (6) LED blink (3) Keil µVision4 + RealView2013年06月16日 14時47分26秒

TTL-232R-3V3
この際なので µVision4 + RealView でもプロジェクトを作ってみる。
Project メニューから New µVision Project を選択し 新規プロジェクトを作成する。
Target Options は、以下のように設定した。
Target
 R Use Cross-Module Optimization
 R Use MicroLIB
 R IROM1
  Start		0x0
  Size		0x1000
 R IRAM1
  Start		0x10000000
  Size		0x400
Output
 ž Create Executable
 R Create HEX File
Listing
 R Linker Listing
 R Memory Map
C/C++
 Define
 Include Path		.\cmsis;.\src
 Misc Controls
Asm
 Define		NO_CRP
 Include Path
 Misc Controls
Linker
 R Use Memory Layout from Target Dialog
 R Report 'might fail' Conditions as Errors
 Misc Controls
Utilities
 ž Use External Tool for Flash Programming
 Command		fm.exe
 Arguments		DEVICE($DFN8,$X,0) ERASEUSED("!H",PROTECTISP) HEXFILE("!H",NOCHECKSUMS,NOFILL,PROTECTISP) COM(1,230400)


ソースをプロジェクトに登録。
コンパイル ・・・・・・・・・ エラーだ。
.\outarm\LPC800_MDK-ARM.axf: Error: L6200E: Symbol printf multiply defined (by printfa.o and printf.o).
.\outarm\LPC800_MDK-ARM.axf: Error: L6200E: Symbol sprintf multiply defined (by printfa.o and printf.o).


Library Retarget File を書いてやれば、そのまま printf が使えるらしいが、ここでは関数名を変えてしまうことにする。
printf sprintf を tprintf tsprintf に変更する。


コンパイル ・・・・・・・・・ 問題ない
書き込み ・・・・・・・・・ 問題ない


え!
書き込める?
Command も Arguments も前回と同じだ。
異なるのはファイル名とディレクトリ名か?
ファイル名 LPC810_CodeBaseS.hex
ディレクトリ名 outG++


書き出してみるとディレクトリ名が怪しい outG++ を outGS に変更して書き込み。
ああ!書き込める。
というわけで Flash Magic のコマンドライン版ではディレクトリ名に + があるとだめなようだ。


ここまでの所をまとめておこう。
LPC810_LED_blink


ところで上記のケーブル(TTL-232R-3V3) LPC800 Mini Kit にぴったりだ。
似たような物でこんなの(USB to TTL Serial Cable - ID: 954)もある。
どちらもコンパクトでいいね。


環境:LPC800 Mini Kit (LPC810M021FN8)
    + Keil MDK-ARM V4.53
    + LPC800 Support for version 4.60 of Keil MDK-ARM
    + LPC810 CodeBase
    + Flash Magic Version 7.50

LPC800 (7) LED blink (4) Ride7 + Rkit-ARM2013年06月22日 14時31分07秒

Ride7 + RKit-ARM
Ride7 + RKit-ARM でも動作を確認しておこう。
まずは startup
crt0_LPC81x.s

 




続いてリンカースクリプト
LPC81x_4K_1K_FLASH.ld

 


LPC81x_4K_1K_DEF.ld

 


LPC81x_COMMON.ld

 


sections_FLASH.ld

 




以下の必要なファイルは lpc8xx_template からもらってこよう。
system_LPC8xx.c
system_LPC8xx.h
core_cm0plus.h
core_cmFunc.h
core_cmInstr.h
LPC8xx.h
main.c (ポートの変更あり)

 




そしてコンパイル
書き込み
問題ないね。


ただし、スクリプトで LPC81x を追加していないとコンパイルオプションで target processor に cortex-m3 が選択されてしまうので注意しよう。
また、Sourcery CodeBench Lite 2012.09-63 では cortex-m0plus をサポートしていないので cortex-m0 を指定する。


環境:LPC800 Mini Kit (LPC810M021FN8)
    + Ride7 version 7.30.10.0169
    + RKit-ARM version 1.30.10.0356
    + GCC Sourcery CodeBench Lite 2012.09-63
    + Flash Magic Version 7.50

LPC800 (8) mbed (1)2013年06月25日 23時04分57秒

RealView LPC810
LPC810 の資料を探していて mbed を見つけた。mbed は聞いた事があったが LPC812 がサポートされていると分かったので使ってみたくなった。
使ってみるといっても実際は公開されているソースを自分の環境でコンパイルして動かすということだ。
MPU が異なっても共通のライブラリが使えるようなので面白そうだ。
現在サポートされているターゲットは
LPC2368
LPC1768
LPC11U24
LPC4088
LPC4330
LPC812
KL25Z
STM32F407


LPC812 が動くなら LPC810 でも動くのじゃないかと思い、試してみた。
ソースはここ (mbed SDK) にあるが、必要な物がどれかよく分からない。
まずは、libraries\mbed\targets\cmsis\NXP\TARGET_LPC81X の中のファイル
startup_LPC8xx.s
sys.cpp
cmsis_nvic.c
core_cm0.c
system_LPC8xx.c
と、前回使用した main.c を使って RealView でコンパイルリンクしてみる。
あ、修正するのは
startup_LPC8xx.s
__initial_sp EQU 0x10001000 を 0x10000400 に変更
LPC812.sct

 

問題なく動く。いい感じだ。


次は GCC で試してみよう。
TARGET_LPC81X 内に TOOLCHAIN_GCC_CS を作成し LPC810.ld と startup_LPC81x.s と sys.cpp を用意する。
TARGET_LPC11UXX\TOOLCHAIN_GCC_CS の中身をコピーして修正すればよい。
コンパイルすると、エラーだ。
./out/lpc810.elf section `.text' will not fit in region `rom'
./out/lpc810.elf section `.data' will not fit in region `ram'
region `rom' overflowed by 6512 bytes
region `ram' overflowed by 1384 bytes
ROM も RAM もサイズに入りきらないらしい。
RealView は余裕ではいるのになぜ?
いろいろ試していて分かったことは sys.cpp をリンクすると一気にバイナリサイズが大きくなって容量をオーバーしてしまうことだ。
今の所解決方法が見つからない。


参照:mbed
環境:LPC800 Mini Kit (LPC810M021FN8)
    + Keil MDK-ARM V4.53
    + LPC800 Support for version 4.60 of Keil MDK-ARM
    + GCC Sourcery CodeBench Lite 2012.09-63
    + mbed SDK
    + Flash Magic Version 7.50

LPC800 (9) mbed (2) libraries2013年06月29日 19時08分05秒

mbed GCC library
今回はライブラリの作成をすることにする。


libraries\mbed\targets\hal\NXP\TARGET_LPC81X と
libraries\mbed\common
の中身をまとめて mbed というライブラリにする。


まず、 RealView でライブラリを作成してみる。
....
エラーの連続だ。
何がいけないのかよく分からない。


続いて GCC。
問題なくライブラリが出来上がる。


なかなか問題のある成り行きだ。
ターゲットファイルは RealView でうまくいって GCC で失敗している。
一方、ライブラリは RealView で失敗して GCC で成功している。
このままではどうにもならない。
一度 LPC810 を離れ、別のターゲットで試してみよう。
次に何とかなりそうなのが LPC1114 と LPC2388 だ。
今度は、 LPC1114 でやってみよう。


参照:mbed
環境:LPC800 Mini Kit (LPC810M021FN8)
    + Keil MDK-ARM V4.53
    + LPC800 Support for version 4.60 of Keil MDK-ARM
    + GCC Sourcery CodeBench Lite 2012.09-63
    + mbed SDK
    + Flash Magic Version 7.50

LPC800 (10) mbed (3) ライブラリ作成2013年06月30日 10時06分10秒

RealView gnu compiler command-line option
別のターゲットで試す前に調べてみた。
答えは意外なことに身近な所にあった。
それは µVision4 の Help の中。


command-line option として
"--gnu”
を与えればよい。


というわけで、 RealView を使えば問題なくライブラリができてターゲットファイル群とリンクできることになった。


それはいいんだけど、今の所 RealView は使っていないのでやはり gcc で何とかしたい。
TOOLCHAIN_GCC_CS の中の sys.cpp を sys.c にしてみた。
region `ram' overflowed by 96 bytes
やはりエラーだ。
rom の容量オーバーはなくなり、ram もあと少しというところまできた。


次に、 sys.c をプロジェクトから外してみた。
エラーにはならない。
なくてもいい物なのか?
ついでにライブラリもリンクしてみる。(まだライブラリはコールしていない。)
問題ない。
書き込んでみる。(今回は lpc21isp を使った[lpc21isp.exe -wipe -hex !H com1 230400 12000])
動いている。
おお!とうとうここまできた。
あとはライブラリを使って動かしてみることだ。


参照:mbed
環境:LPC800 Mini Kit (LPC810M021FN8)
    + Keil MDK-ARM V4.53
    + LPC800 Support for version 4.60 of Keil MDK-ARM
    + GCC Sourcery CodeBench Lite 2012.09-63
    + mbed SDK
    + lpc21isp Version 1.92