NXP LPC1114 のUART機能検証を続けています。まず、これまでに現れた不具合は、
・LPC1114のUSRT設定
LPC1114側のボーレート115200で PC側ターミナルソフトで文字化けが起こる。
LPC1114側のボーレート9600で、PC側(115200)で正常な通信を確認。
・Systick設定
Systick割り込みインターバルが想定の1/2
ということで、システムクロックの設定について何か問題でもあるのかとも思いました。
もともとNXP他が提供するサンプルソースはSystem Osillator(外付けクリスタル)をクロックソースにしていて、これをIRC Oscillator にして機能検証を行っていました。
そこで、クロックソースをSystem Oscillatorに戻して、これまでの検証を繰り返しました。(手持ちの水晶発振子が8MHzだったのでそれを使用)
LPC1114各レジスタ設定値
<LPC1114 UART設定:ボーレート9600 Systick設定:480000>
システムPLL制御レジスタ(SYSPLLCTRL) 0x25 MSEL:5 (M=6) PSEL:4(P=4)
システムPLLステータスレジスタ(SYSPLLSTAT) 0x01 PLL はロック状態
システムオシレータ制御レジスタ(SYSOSCCTRL) 0x00 オシレータはバイパスされません。/周波数範囲1 ~ 20 MHz
システムPLLクロックソース選択レジスタ(SYSPLLCLKSEL) 0x01 システムオシレータを選択
メインクロックソース選択レジスタ(MAINCLKSEL) 0x03 システムPLL クロック出力を選択
システムAHBクロック分周器レジスタ(SYSAHBCLKDIV) 0x01 1 で分周
システムAHBクロック制御レジスタ(SYSAHBCLKCTRL) 0x1105F
これらの設定でメインクロック48MHz稼働を確認しました。
UARTクロック分周器(UARTCLKDIV) 0x01
UARTライン制御レジスタ(U0LCR) 0x03 8 ビットの文字長/1 ストップビット/パリティなし/DLAB=0
UART分数分周器レジスタ(U0FDR) 0x10 DIVADDVAL=0/MULVAL=1
UARTボーレート分周器レジスタ(U0DLL) 0x00
UARTボーレート分周器レジスタ(U0DLM) 0x05 DL=0x0500
これらのUART設定では、ボーレートは2343となりそう。
BaudRate = 48M/(16*0x0500) = 2343
システムtick カウンタ校正レジスタ(SYSTCKCAL) 0x04 システムtick タイマ校正値0x04
システムタイマリロード値レジスタ(SYST_RVR) 0x752FF RELOAD
システムタイマ校正値レジスタ(SYST_CALIB) 0x04 TENMS=0x04 default値
これらのSystick設定では、Systick割り込み間隔は 20mSになりそう。
Systick割り込み間隔 = 0x752FF/(48M*1/2 ) = 0.02 Sec.
計測内容
・UARTのTX信号を測定すると、ビット巾は約0.1mSであった。
、 実際のUARTのボーレートは、9600であった事が確かめられた。
PC側のボーレート設定9600のターミナルソフトでUART通信を確認。
(PC側ボーレート115200でもUART通信が成立してしまうことを確認、前回、LPC1114側でボーレートを9600に設定すると115200のボーレートになると考えたことは、誤り。)
・Systick割り込みでGPIOのHigh/Lowを出力すると、High、Lowそれぞれの巾は10mSであった。
その他、
UARTでボーレートを115200にした場合やはり、PC側で文字化けを起こした。(前回と同じ)
ボーレートは115200付近であろうと思われ、 UART分数分周器レジスタ(U0FDR)でボーレートの微調整を試しましたが、不調に終わりました。
LPC111xのデータシートでは システムオシレータの範囲は1~25MHzでした、しかしユーザーマニュアルでは一部10MHz~25MHzの表記があります。ドキュメント内、ドキュメント間で整合性がとれていないのではと思います。
まとめ、
サンプルコードを利用したUART設定でボーレートは正しく設定された。ただし、ユーザーマニュアルのレジストリ設定と実際のレジストリ設定で食い違いがあるように思える。
また、Systick設定では、ユーザーマニュアルの「システムtick タイマクロックはシステムクロック1/2」という事は実際と異なると思われる。
現時点でのLPC1114のアプリケーション開発はユーザーマニュアルより、NXP等から提供されるサンプルコードを優先して参考にしたほうがよさそうです。
2013年2月6日水曜日
2013年2月4日月曜日
TI LaunchPad 電子温度計 その後
以前作成した、TI Stellaris LaunchPad 電子温度計の動作確認を行いました。
測定間隔5秒(目盛5分)、温度表示域30~46℃(目盛2℃)
温度設定:40℃、動作:ヒーター、温度調整巾1℃(40.5℃でヒータースイッチOFF、39.5℃以下でヒータースイッチON)
水温は12~13分で上昇、下降を繰り返しました。水温は39.2℃~40.8℃の範囲で変化
●温度調整巾 0.4に変更
(40.2でヒータスイッチOFF、39.8℃以下でスイッチON)
水温は7分で上昇、下降を繰り返しました。水温は39.5℃~40.5℃の範囲で変化。
今回テストした電子温度計は、まあ、観賞魚用の温度コントローラ並みの機能、しかしヒーターのスイッチにリレーを使用、その動作保障は10万回、つまり、7分サイクルの温度調節で8カ月でこの電子温度計の寿命を迎えることになります。
電子温度計に40℃の温度設定をすると、ヒータのスイッチが入り、徐々に水槽の水温が上昇しました。あとは、設定温度+αでスイッチが切れるのドキドキしながら待ちました。さて水温が40℃に到達、しばらくしてヒーターのスイッチが切れました。まず第一段階クリア。
ヒータのスイッチが切れた後、水温は惰性で若干上昇後、緩やかに下降を始めました。設定温度の40℃を切ったところで再度ヒーターのスイッチが入り所定の動作確認が出来ました。
●最初の設定測定間隔5秒(目盛5分)、温度表示域30~46℃(目盛2℃)
温度設定:40℃、動作:ヒーター、温度調整巾1℃(40.5℃でヒータースイッチOFF、39.5℃以下でヒータースイッチON)
水温は12~13分で上昇、下降を繰り返しました。水温は39.2℃~40.8℃の範囲で変化
●温度調整巾 0.4に変更
(40.2でヒータスイッチOFF、39.8℃以下でスイッチON)
水温は7分で上昇、下降を繰り返しました。水温は39.5℃~40.5℃の範囲で変化。
今回テストした電子温度計は、まあ、観賞魚用の温度コントローラ並みの機能、しかしヒーターのスイッチにリレーを使用、その動作保障は10万回、つまり、7分サイクルの温度調節で8カ月でこの電子温度計の寿命を迎えることになります。
2013年2月3日日曜日
LPC1114 システムクロックについて(Systick)
LPC1114FN28のシステムクロック設定の検証を続けています。
今回はSystickタイマの動作を確認することでメインクロックの動作を確認しました。
Systickタイマのサンプルコードは「lpc11xx.keil-examples-CMSIS-update.zip」にあるプロジェクト「systick」のsysticktest.cのみを利用しました。
1.Systick割り込みでGPIOのHigh/Low出力を行い。出力周波数を計測。
1)サンプルコード systicktest.c について
以下のコードで 10mS でSystick割り込みを実現しています。
#define SYSTICK_DELAY (SystemCoreClock/100)
SysTick_Config( SYSTICK_DELAY );
2)割り込みで呼ばれる SysTick_Handler(void)にGPIO PIO1_4のHigh/Low出力を追加。
void SysTick_Handler(void)
{
int i;
TimeTick++;
TimeTick &= 0x7fffffff;
i = TimeTick & 0x01;
GPIOSetValue( 1, 4, i );
}
3)GPIO出力周波数測定。
測定された周波数は40~50Hz。(自作の周波数カウンタでの結果)
Systickの設定を 10μS にして実行 測定周波数 49700Hz
#define SYSTICK_DELAY (SystemCoreClock/100000)
また、メインクロックは48MHzであった。
こkまでの結果をみると、Systick設定、システムクロックの設定で整合性はとれているおもわれる。 。。。。?
※ユーザーマニュアル17章「システムtick タイマ」の記載「システムクロックの周波数の半分に固定されています。」 で SysTick_Config()や、SystickのRELOADに設定される値はコーディング上二分の一される必要があると思われる。
、
今回はSystickタイマの動作を確認することでメインクロックの動作を確認しました。
Systickタイマのサンプルコードは「lpc11xx.keil-examples-CMSIS-update.zip」にあるプロジェクト「systick」のsysticktest.cのみを利用しました。
1.Systick割り込みでGPIOのHigh/Low出力を行い。出力周波数を計測。
1)サンプルコード systicktest.c について
以下のコードで 10mS でSystick割り込みを実現しています。
#define SYSTICK_DELAY (SystemCoreClock/100)
SysTick_Config( SYSTICK_DELAY );
2)割り込みで呼ばれる SysTick_Handler(void)にGPIO PIO1_4のHigh/Low出力を追加。
void SysTick_Handler(void)
{
int i;
TimeTick++;
TimeTick &= 0x7fffffff;
i = TimeTick & 0x01;
GPIOSetValue( 1, 4, i );
}
3)GPIO出力周波数測定。
測定された周波数は40~50Hz。(自作の周波数カウンタでの結果)
Systickの設定を 10μS にして実行 測定周波数 49700Hz
#define SYSTICK_DELAY (SystemCoreClock/100000)
また、メインクロックは48MHzであった。
こkまでの結果をみると、Systick設定、システムクロックの設定で整合性はとれているおもわれる。 。。。。?
※ユーザーマニュアル17章「システムtick タイマ」の記載「システムクロックの周波数の半分に固定されています。」 で SysTick_Config()や、SystickのRELOADに設定される値はコーディング上二分の一される必要があると思われる。
、
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の送受信が確認出来ました。
後は、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にした場合 最も文字化けが少なくなるが依然、使用に耐えるレベルにない。
現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、
メインクロックの表示 |
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)の設定でボーレートの調整が出来ることがわかり試しました。
文字化けがなかなか解消されない。 |
現時点で、システム周りのクロックは理解したつもりだが、まだ、その扱いがしっくりこない、
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は現時点で設定しない方がよい。
第一歩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は現時点で設定しない方がよい。
登録:
投稿 (Atom)