メインクロックの表示 |
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の動作確認 |
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)の設定でボーレートの調整が出来ることがわかり試しました。
文字化けがなかなか解消されない。 |
現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、
0 件のコメント:
コメントを投稿