LPC800 (12) mbed (5) ライブラリを使う 22013年07月03日 22時35分43秒

うまくいかない時はまず資料集めだ。
あわよくばそのまま使える資料があるかもしれない。


Exporting to offline toolchains
Project to allow offline GCC compilation of code using mbed cloud libraries.
mbed library sources


GCCでmbedの実行ファイルをコンパイル
GCCでmbedの実行ファイルをコンパイル(2)


ARM: Clone of the mbed / 失敗!?
mbed-sdkをLPCXpresso LPC1769で使う(1) 2013


オフライン コンパイル
オフラインコンパイラ Keil uVision4 を使ってみる(その1)
オフラインコンパイラ Keil uVision4 を使ってみる(その2)


これらの資料を見ると、動きそうだ。いや、動かしている人がいる。
しかし、自分でやってみると Export したものはオフライン コンパイルできるが、mbed のソースを集めて最初から作りこもうとするとうまくいかない。
悔しいが mbed はしばらくペンディングだ。


参照: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

LPC800 (13) Clock Test (1)2013年07月11日 22時53分18秒

System PLL block diagram
気を取り直してクロックの動作確認だ。
LPC8xx Clock and PLL Configuration Tool もあるし、µVision4 の Configuration Wizard もあるのでテストは簡単だ。そのほかの条件は
PLL input = 12(MHz) IRC Oscillator
位だろうか。
No.	MainCLK	 MSEL	M	PSEL	P	FCCO	SYSAHB	SystemCLK
	(MHz)	binary		binary		(MHz)	CLKDIV	(MHz)
1	12	00000	1	11	8	192	1	12
2	24	00001	2	10	4	192	1	24
3	60	00100	5	01	2	240	2	30
4	72	00101	6	01	2	288	2	36
5	84	00110	7	00	1	168	2	42
6	96	00111	8	00	1	192	2	48
7	108	01000	9	00	1	216	2	54
8	120	01001	10	00	1	240	2	60

確認する Systemclock は 12MHz から 60MHz を予定している。赤文字はスペックオーバーを意味する。
ここで、スペックをまとめておこう
PLL input	10 MHz to 25 MHz.
MainCLK		100MHz 以下。
FCCO		156 MHz to 320 MHz.
SystemClock	30MHz 以下。



1番から順番に試していく。
3番までは今の所問題ない。
4番36MHz、いける。
5番42MHz、これもokだ。
6番48MHz、動かない。
ここまでか?と思いつつ7番54MHz、動く。
さあ、8番60MHz、動かない。
54MHzが限界か?しかし、気になるのは6番。なぜ動かないんだ?
パラメータを変えて全てスペック内に収めてみる。
No.	MainCLK	 MSEL	M	PSEL	P	FCCO	SYSAHB	SystemCLK
	(MHz)	binary		binary		(MHz)	CLKDIV	(MHz)
9	96	00111	8	00	1	192	4	24



動かない。
M = 8 の時だけ例外的に動かないのだろうか?
User manual にも Errata sheet にも特に記述が無い。
というわけで動作最大 SystemClock は 54 MHz が確認できた。
しかし、もう少しやってみよう。
No.	MainCLK	 MSEL	M	PSEL	P	FCCO	SYSAHB	SystemCLK
	(MHz)	binary		binary		(MHz)	CLKDIV	(MHz)
10	60	00100	5	01	2	240	1	60
11	72	00101 	6	01	2	288	1	72
12	84	00110 	7	00	1	168	1	84

10番60MHz、動く。
え...動くんだ!
じゃあ11番72MHz、動くが一部文字化けする。
これは動かないだろう。12番84MHz、やっぱり動かない。
とうとう、60MHzでも動いた。72MHzは怪しいので動かなかったことにしておこう。それにしてもかなり余裕を見てあるんだ。
正確に言うと本当に動いているかどうかは分からない CLKOUT をオシロスコープででも観測するのが正しい判断の方法かもしれない。


環境: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 (14) Watchdog Oscillator (1)2013年07月12日 22時35分31秒

Watchdog Oscillator を使う
今回は Watchdog Oscillator を main clock として試してみる。
使い方は簡単だ。
system_LPC8xx.c の MAINCLKSEL を WDT Oscillator にして、FREQSEL を 3.4 MHz にする。


コンパイルして、書き込み、Reset 。


青LED が点灯したままだ。
ターミナルに文字出力も無い。
どうしたものかと思っていると青LED が一瞬消えた。
よく観察してみると、約100秒に一回 LED が消えるタイミングがある。
ソースを見ると、LED を点灯させた後シリアルに文字を出力している。
もしかすると文字出力にものすごく時間がかかっているのかもしれない。
ためしに、printf を削除してみると、LED は普通に点滅する。


どうやら Watchdog Oscillator を使うとシリアルがおかしくなるらしい。


環境: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 (15) Watchdog Oscillator (2)2013年07月13日 13時57分36秒

Watchdog Oscillator Analog Output Frequency を修正
それにしても Watchdog Oscillator を使うとシリアルがおかしくなるのは使い勝手が悪い。
何とかならないものかと思いドキュメントを調べてみることにする。


ドキュメントの中でまず目に付いたのが LPC800 USART API ROM driver routines 。
節約のためかROMが使えるようだ。


次に、LPC800 USART0/1/2 に目を通す。
特に Baud Rate and Clocking Generation のソースに Watchdog Oscillator を使ってはいけないという記述も無い。


さらに LPC800 Windowed Watchdog Timer (WWDT) と読み進む。
ここにも特に変わった記述は無い。


最後は Watchdog oscillator control register の FREQSEL 。
wdt_osc_clk は 9.3 kHz to 2.3 MHz と書いてある。


収穫らしいものは何もなかった。
またエディタに戻って system_LPC8xx.c を眺めていると wdt_osc_clk の計算が合わない。
どういうことかというと、ドキュメントには 9.3 kHz to 2.3 MHz と書いてあるのに、 system_LPC8xx.c の数字で計算すると 7.8 kHz から 1.7MHz になるのだ。
ドキュメント(UM10601.pdf Rev. 1.2) と system_LPC8xx.c を比べてみると明らかに数字が異なる。おそらく以前の system_LPCxxxx.c を流用したためこのようなことになってしまったのだろう。
ドキュメントに従って system_LPC8xx.c を修正。(修正する部分は3ブロックある)


やっとシリアルも動いた。
分かってみると単純なことだった。
少し満足して、そして脱力感いっぱいの今日この頃。


system_LPC8xx.c

 




環境: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

system_LPCxxxx2013年07月14日 15時46分21秒

system_LPC8xx.c の不具合が分かってそれはそれでよかったのだが、何をベースにしたのか気になった。
model		watchdog oscillator analog output frequency
EM77x		0.5 MHz to 3.4 MHz
LPC11xx		0.6 MHz to 4.6 MHz
LPC12xx		0.5 MHz to 3.4 MHz
LPC13xx		0.6 MHz to 4.6 MHz
LPC17xx		なし


ベースは EM77x か LPC12xx では無いかと思う。
というわけで system_LPC11xx.c と system_LPC13xx.c も修正が必要だ。


しかし、NXP も Keil もなぜ気がつかないんだ。

LPC800 (16) API ROM driver (1)2013年07月15日 10時45分24秒

先日、少し触れたが LPC81x では ROMapi が使えるようなので調べてみることにする。
ROMapi と言えば、Luminary の LM3Sxxxx を思い出すが CMSIS との相性が悪かった。
調べていてすぐに出てきたのが LPCOpen Platform 。このライブラリ 2012 年にリリースされているのでかなり新しい物だ。
サポートしているデバイスは LPC8 LPC11 LPC13 LPC17 LPC18 LPC40 LPC43 となっている。(ついでに、LPC2x シリーズもサポートしてくれればいいのに...)
異なるデバイスでもライブラリを共通に使うのが目的らしい。mbed に似てる気がする。


で、問題の ROMapi は従来のライブラリではサポートしていなかったがこのライブラリからサポートを始めたようだ。
さっそくダウンロード。
でかいね。もちろん LPC8x 以外のライブラリも入っているからだけど。
サポートしているツールチェーンは IAR Keil LPCXpresso


参照:
LPCOpen Platform for NXP LPC Microcontrollers
LPCOpenを使う その1~LPCOpenのサポート状況の確認 & LPCXpresso LPC11U14プロジェクトのインポートとビルド~
LPCOpenを使う その2~ドキュメントを確認する:ライブラリ構成、Example内容/構成、ボード設定~
LPCOpen Platform

LPC800 (17) API ROM driver (2)2013年07月17日 21時22分36秒

lib_board_nxp_mini-kit_810.a
まずは LPCOpen platform を使ってみよう。


①最初にすることは LPC800 Mini-Kit のボード情報を作成すること。
lpc_boards_8xx と書かれているが実際は LPCXpresso LPC812 にカスタマイズされているので、この部分を新規作成する。
\lpcopen\software\lpc_core\lpc_board\boards_8xx\nxp_xpresso_812 の中身を
\lpcopen\software\lpc_core\lpc_board\boards_8xx\nxp_mini-kit_810 にコピーして修正だ。


②ライブラリを作成する。
\lpcopen\software\lpc_core\lpc_board\boards_8xx\nxp_mini-kit_810
\lpcopen\software\lpc_core\lpc_chip\chip_8xx
\lpcopen\software\lpc_core\lpc_ip
上記ディレクトリの中身を集めてライブラリ作成。(lib_board_nxp_mini-kit_810.a)
上のスクリーンショットがライブラリの中身だ


③startup と Linker script を用意する。
\lpcopen\applications\lpc8xx\startup_code の中に入れる。
以前用意したものでよいだろう。


④アプリケーションプログラム
\lpcopen\applications\lpc8xx\examples\periph\periph_blinky ここにあるものをそのまま使う。
そして、ライブラリとスタートアップとリンカースクリプト
blinky.c
startup_LPC8xxG++.s
LPC810_rom_gnu.ld
lib_board_nxp_mini-kit_810.a
これをコンパイルして出来上がり。


走らせて見ると LED が点滅する。
うむ。
よしよし。
あ、でもこれではまだ ROMapi 使ってないね。


参照:
 LPCOpenプラットフォーム
 LPCOpen Platform
環境: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
    + lpcopen_v1.03.zip
    + Flash Magic Version 7.50
    + KPIT Cummins GNU-Archive Editor v1.1
    + KPIT Cummins GNU-Map Viewer v1.0

LPC800 (18) API ROM driver (3)2013年07月18日 21時51分54秒

LPC800 Mini Kit USART API ROM Example
LPCOpen platform は下記のボードをすぐ使うためのライブラリのようだ。
NXP Xpresso LPC812
NXP Xpresso LPC11C24
NXP Xpresso LPC11U14
NXP Xpresso LPC1347
NXP Xpresso LPC1769
Embedded Artists LPC1788-DEV-KIT
Embedded Artists LPC4088-DEV-KIT
Hitex Evaluation Board LPC1850
Hitex Evaluation Board LPC4350
Keil MCB1857 
Keil MCB4357 
NGX LPC1830-Xplorer
NGX LPC4330-Xplorer

従って、今回のように LPC800 Mini Kit を使う場合などはボード情報を新たに作成しなければならない。
当然、CQ出版の TRZ1104A(LPC1114/301) を使う場合も同じだろう。


ドキュメントも一緒にダウンロードしていたので読んでみることにする。
と思ったが、ドキュメントの形式が html で、しかも量が半端ではない。
読む前に気持ちが萎えてしまった。
さて、問題の ROMapi は
Power profiles API function
I2C driver routines functions
UART driver routines function
があり、ヘッダーだけ読み込めば使えるようになっている。(と、思う)
まずは \lpcopen\applications\lpc8xx\examples\periph\periph_uart_rom のサンプルを使ってみよう。
コンパイルして、書き込み。
動いている。
さて、ここまで来ると ROMapi を使った物と LPC810 CodeBase を比較してみたいね。


参照:
 LPCOpenプラットフォーム
 LPCOpen Platform
環境: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
    + lpcopen_v1.03.zip
    + lpc21isp Version 1.92
    + KPIT Cummins GNU-Archive Editor v1.1
    + KPIT Cummins GNU-Map Viewer v1.0

フリーの ARM 開発環境 (6)2013年07月20日 11時48分07秒

The free IDE for embedded programming!
フリーの ARM 開発環境 (1) で紹介したが情報が古くなってしまったのでもう一度掲載しておこう。
というのは、最近 YAGARTO を見ていて emIDE を知ったので書き加えたいと思ったのだ。
そして Raisonance の Ride7 + RKit-ARM も free でなくなってしまってからずいぶん時間がたった。
私はまだ使っているが、新たに手に入れようと思っても手に入らない。
手に入るものだけを列挙しよう。
そういえば Renesas Technology も ARM をリリースしたので Kpit もそのうち加わるかもしれない。
Keil	µVision + GCC
	Supported processors:ARM7/ARM9/Cortex-M0-M4

CooCox	CoIDE + GCC
	Supported processors:Cortex-M0-M4

Atollic	TrueSTUDIO Lite
	Supported processors:ARM7/ARM9/Cortex-M0-M4
	32KB code-size limitation (8KB on Cortex™-M0 and Cortex-M1).

Eclipse + GCC

emIDE
	Supported processors:ARM7/ARM9/Cortex-M0-M4

Em::Blocks
	Supported processors:PIC18/PIC32/dsPIC/Cortex-M0-M3
さて、emIDE と EmBlocks は TrueSTUDIO Lite と同じように gcc も含んでいる。
その gcc は (GNU Tools for ARM Embedded Processors) だ。そのうちプロジェクトを作って使い勝手を確かめてみよう。