数か月遅れで、トラ技(2012年10月号)付録マイコンLPC1114を試しています。付録DVDにあったサンプルプログラム「MDK_sample」を修正して、各機能のチェックを行おうと思いました。
第一歩GPIOを確かめてみました。
これが不幸の始まり。
まず、トラ技の記事の「端子配置/機能」(P60、P61)を眺め、パラレルデータインターフェース用に8ビットまたは4ビットのデータポートを確保しようと思いました。
当然、PIO0_0~PIO0_7(ポート0)または、PIO1_0~PIO1_7(ポート1)のいずれかを使うことになります。しかし、PIO0_0、PIO0_1はRESETとISPへの切り替え用となっているので、ポート0はデータポートしては使えないと判断、またPIO1_6、PIO1_7はUART用に使われます、ポート1も使えない、、、、、、、(強引にPIO0_4~PIO0_11で8ビットのデータポートを確保するしかないのかと思いました。)
8ビットデータインターフェースは諦め、一まず、次のように、4ビット(PIO1_0~PIO1_3)のデータポートを実現しようとしました。
1.I/O設定(MDK_sample main.c)
1)LPC_IOCON->PIO1_1 = 0xd0;を追加するがコンパイルエラーが発生次の通り修正
LPC_IOCON->R_PIO1_0 = 0xd1;
LPC_IOCON->R_PIO1_1 = 0xd1;
LPC_IOCON->R_PIO1_2= 0xd1;
LPC_IOCON->SWDIO_PIO1_3 = 0xd1;
2)LPC1114に書き込めど、動かず、
LPC_IOCON->PIOx_yで設定できるGPIOは動作確認できるが、それ以外のGPIOは不能となる。
LPC_IOCON->R_PIOx_yについて、ユーザーマニュアル 6章「I/O設定」を繰り返し読む、レジスタの説明で[R機能]が優先、しかし[R機能]の意味が解らない、、、
LPC_IOCON->SWDIO_PIO1_3について はシリアルワイヤデバッグ(SWD)のピンが優先、したがって、SWDの機能を無効にすればPIO1_3が使えるようになると思いました。
しかし、ユーザマニュアルにSWDを無効にする方法もレジスタの表記も無い。NXPの他のドキュメントを繰るとCRP(Code Read Protection)の機能でSWDを無効に出来そうだと、、、、、
2.CRPの設定
1)アドレス0x000002FCに値0x12345678を書き込む。
startup_LPC11xx.sを以下の用に修正
・・・・・・・・・・・・・・・・・・
IF :LNOT::DEF:NO_CRP
AREA |.ARM.__at_0x02FC|, CODE, READONLY
CRP_Key DCD 0xFFFFFFFF
ENDIF
CRP_Key DCD 0xFFFFFFFF を CRP_Key DCD 0x12345678 に変更
2)FlashMagicでCRP1の設定を確認
FlashMagic ISP/Read Security....でCRP1を確認(通常はCRP is disable)
3)GPIO PIO1_3の出力を調べるが、不調
依然として、High/Lowの出力が出来ない。
4)プログラムのフラッシュの書き込み不能に。
CRPに関するドキュメントでは、CRP1ではプログラムの書き込みは可能なはず、しかしFlashMagicでのプログラム書き込みは不能。またセクタ0の消去は不能(ドキュメント通り)
そこで全消去をしようと思ったが、FlashMagicではそのような機能は無いようです。
5)LPC1114 一つ廃棄
LPC1114を試して1週間、最初の石は不能に、、、
LPC1114について、ネットを調べまくると、多くのソースコードでLPC_IOCON->R_PIO1_0 の設定があります。LPC1114自体 PIO1_0はCRPなどの面倒な設定なしで普通に使えるはず。。。。
問題は「Keil uVision4」でしょうか?「Keil uVision4」でR機能、SWD機能を前提にする環境があるのか、もしかしてGNU GCCを使えば このGPIOの問題は解決か。。。。
3.GCCによる開発
以前LPC2388のプロジェクトをひな形に、付録DVDのサンプルプロジェクトを参考に
1)プログラムソース
main.c
cr_startup_lpc11.c (Rev.01 2011.04.17 Munetomo Maruyama)
system_LPC11xx.c (17. November 2009 by ARM)
2)memory.def
ROM0000.ld(created from nxp_lpc13_c.ld (v3.1.4 (200912230917)) )をリネイム
3)Makefile
コンパイルオプション COMPILE_OPTS = -c -mcpu=cortex-m0 -mthumb
ライブラリディレクトリ LIBRARY_DIRS = -L /usr/local/arm-tools/arm-elf/lib/thumb -L /usr/local/arm-tools/lib/gcc/arm-elf/4.6.3/thumb (GCCのインストールにより適宜に修正)
4)動作確認
今まで沈黙していたPIO1_0につないだLEDが点滅
よし、GCCでのプログラム開発でLPC1114の全てのGPIO入出力に目途がたったと思いました。
しかし、いままで集めたサンプルプロジェクト中から、使えそうなものを修正し、動作の検証を行ったところ、前述の「Keil uVision4」と同じGPIOの不調が起きました。その不調の原因を調べると、どうも使っていたsystem_LPC11xx.cが異なっていたことに気づきました。
実際2つのsystem_LPC11xx.cを比較しても、GPIOの不調が起こるコーディングは見つけ出せない(現在)
さてそうなると、前述の「Keil uVision4」が原因で起こるGPIO不調に疑問、、そこでプロジェクトのsystem_LPC11xx.cを見ると、GPIO不調のGCCプロジェクトのsystem_LPC11xx.cと同じでした。
そこで、system_LPC11xx.cを置き換え、検証すると「Keil uVision4」のGPIOの不調は解消。
まとめ
●LPC1114で R機能、SWD機能の共有ピンの GPIO動作不調はsystem_LPC11xx.cによる。
※「MDK_sample」のsystem_LPC11xx.c に System AHB clock 制御レジスタ (SYSAHBCLKCTRL)の設定を追加するとGPIO は正常に。
追加コード
#define AHBCLKCTRL_Val 0x0001FFFF
LPC_SYSCON->SYSAHBCLKCTRL = AHBCLKCTRL_Val; ....(2013/2/3)
●GCCでのビルド(make)では、コンパイルオプション -mcpu=cortex-m0 -mthumb が必須
またリンクするライブラリ(libc.a等)は thumb配下のライブラリを指定。
(LPC2388ではARM・thumbどちらでも可、LPC1114はthumbのみ可)
●CRP(Code Read Protection)設定 CRP1は現時点で設定しない方がよい。
0 件のコメント:
コメントを投稿