2013年2月3日日曜日

LPC1114 UART及びメインクロックの確認

トラ技付録LPC1114でUARTの機能を以下の手順で検証しました。
メインクロックの表示


1.プログラムコードの入手
 NXPからサンプルコード「lpc11xx.keil-examples-CMSIS-update.zip」を入手し、以下のプログラムコードを抽出利用しました。
 ・uarttest.c フォルダUART
 ・uart.c、core_cm0.c フォルダCommon/src 
 ・uart.h、type.h フォルダCommon/inc
2.Keil uVision4で新規プロジェクトTestUART01を作成ビルド
 ・上記のサンプルコードファイルをプロジェクトTestUART01に追加
 ・system_LPC11xx.cは、GPIOを試したプロジェクトで使用したものをプロジェクトTestUART01に追加
3.プロジェクトTestUART01をデバッグ
 1)サンプルコードそのままで実行
    ・PCのターミナルソフトでUARTの通信は確認できなかった。
 2)ボーレートを遅くして実行
    ・UARTInit();によるボーレート指定を 115200から9600に変更した。
    ・最初、1)と同様にUARTは沈黙、、、いろいろもがくうちに、たまたま、PCのターミナルソフトのボーレートを115200で試すと、本来のUARTの動作が確認出来ました。


 LPC1114のボーレートが9600、PC側のボーレート115200でUARTの送受信が確認出来ました。
初めてUARTの動作確認
後は、LPC1114側のUART設定かメインクロックの設定の問題と思い、プログラムコードを点検しました。(特にメインクロックの設定はもともとクロックソースとしてシステムクロック(外部)であったのをIRCクロックに変更したので要注意)

 4.プログラムコードsystem_LPC11xx.cの確認
   1)システムPLL 制御レジスタ(SYSPLLCTRL)設定とメインクロック(SystemCoreClock)の計算に誤りと思われるコードがある。

  
 SYSPLLCTRLの設定値は0x00000023で分周比M=4 ポスト分周比P=2となりIRCクロック12MHzではメインクロックは24MHzとなるはず、
 しかしsystem_LPC11xx.cのSystemCoreClockUpdate()で計算されるメインクロックは48MHzとなりました。
 

 計算式
   SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1);はレジスタSYSPLLCTRLのポスト分周比Pが考慮されていない。
 次のように修正した、
   SystemCoreClock = __IRC_OSC_CLK * ((LPC_SYSCON->SYSPLLCTRL & 0x01F) + 1) / (0x01 << ((SYSPLLCTRL_Val & 0x060) >> 5) );

5.system_LPC11xx.c修正の検証
 ひとまずメインクロックの計算式を修正した段階でUARTの検証を行った、当然、計算されるメインクロックは2分の1の 24MHz となるので LPC側のボーレートは2倍になります。PC 側のターミナルソフトのボーレートを230400に設定しました。

その結果は、文字化けが多発、一部の英数XYZ12345がエコーバックで表示出来ている。つまり、ボーレートに若干のずれがあると言うことでしょう。

6.UARTボーレートの調整
 LPC1114とPC側のボーレート設定の不一致は、ひとまず棚上げ、LPC1114のボーレートの調整を行いました。
 ユーザマニュアルでUART 分数分周器レジスタ(U0FDR)の設定でボーレートの調整が出来ることがわかり試しました。

文字化けがなかなか解消されない。
その結果は、DIVADDVALを1に、MULVALを12にした場合 最も文字化けが少なくなるが依然、使用に耐えるレベルにない。



 現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、

0 件のコメント:

コメントを投稿