2013年2月2日土曜日

LPC1114FN28 GPIO でジタバタ

 数か月遅れで、トラ技(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 件のコメント:

コメントを投稿