#analog
#norelated
#contents
* LEDチカチカ(LPC810) [#ve36a221]

** 構成 [#rb39527d]
トランジスタ技術2014年2月号付属のLPC810とプリント基板のセットを使用しますが、これにはLEDがつくようになっています。~
なので、これを点滅させてみましょう。~

LPC810のピンアサインは、[[LPC800シリーズ:http://www.nxp-lpc.com/lpc_micon/cortex-m0+/lpc800/]]のページの下の方にあるリンクの、「LPC81xユーザーマニュアル」に載っています。~
LEDは5ピンのPIO0_1につくようになっています。~

** プロジェクト [#kcb22790]
まずは、新規プロジェクトを作りましょう。~
QuickStartPanelのNew projectから、LPC8xxの「C Project」を選択して、適当なプロジェクト名をつけます。~

MCUはLPC810を選び、CMSIS Core libraryは、CMSIS_CORE_LPC8xxが選択されていることを確認してください。~
Peripheral Driver Libraryは、lpc800_driver_libを選択します。~
DSPLIBは使わないので、Noneのままです。~

MTBの設定はチェックを外して無効にしておきます。~
これはデバッグに使用する機能ですが、トレースデータを保存するためにメモリ領域を食ってしまうため、LPC810はメモリ容量も少ないので、無効にしておきます。~

Code Read Protectについては、コードを読み出されないようにするためのセキュリティ設定ですので、ここも外しておいて構いません。~

プロジェクトが作成されたら、右クリックからプロパティを開きます。~
「Project References」は、CMSIS_CORE_LPC8xxと、lpc800_driver_libの両方にチェックを入れておきましょう。~
これで、変数や関数の定義を、プロジェクトをまたいで遡ることが出来ます。~

ここまでで、プロジェクトの設定は終わりですので、反映させて一旦ビルドをかけてみましょう。~
QuickStartPanelからBuildを実行して、axfファイルが出来上がればOKです。

** ソースコード [#nf8e0b77]
以下、ソースコード。~
まず、最初から作られているmain.cをベースに、以下のincludeを追加します。~

 // TODO: insert other include files here
 #include "lpc8xx_gpio.h"

次に、指定時間waitするためのカウンタをグローバル変数として用意し、そのカウンタをインクリメントする割り込み関数、実際のwaitを行う関数をそれぞれ用意します。~
これは、昔やったやつと同じですね。~

 // TODO: insert other definitions and declarations here
 volatile uint32_t msTicks = 0;
 void SysTick_Handler(void) {
 	msTicks++;
 }
 void systick_delay (uint32_t delayTicks) {
 	uint32_t currentTicks = msTicks;
 	while ((msTicks - currentTicks) < delayTicks);
 }

そして、メイン関数は以下のようになります。~

 int main(void) {
 	// TODO: insert code here
 	SystemCoreClockUpdate();
 
 	GPIOInit();
 	GPIOSetDir(0, 1, 1);
 	GPIOSetBitValue(0, 1, 1);
 
 	SysTick_Config(SystemCoreClock / 1000);
 
 	while(1) {
 		systick_delay(500);
 		GPIOSetBitValue(0, 1, 0);
 		systick_delay(500);
 		GPIOSetBitValue(0, 1, 1);
 	}
 	return 0;
 }

** ソースコード解説 [#debd3503]
最初にSystemCoreClockUpdateという関数を呼んでいますが、これはクロックの変更をした際には、この関数を呼んで、CMSISのグローバル変数であるSystemCoreClockを更新するという働きがあるようです。~
ただ、起動時にはSystemInitでクロックの設定がされるため、それが正しく反映されていれば、呼ばなくても構わないものだと思います。~

今回のペリフェラルドライバライブラリには、前のようなPINSELがないので、ピンの設定は飛ばします。~
まぁ、基本的にはデフォルト値で問題ないことしかしていないので、なくても問題なしです。~

GPIOInitでGPIOの初期化をし、GPIOSetDirでLEDが接続されているPIO0_1のピンを、出力に設定します。~
そして、GPIOSetBitValueで点灯させます。~

GPIOSetDirやGPIOSetBitValueは、実際には最初の引数の0(ポート番号)は使用されていません。~
PIO0しかないので、指定する必要がないけど、互換性のために残しているような感じですかね……。~
とはいえ、以前使用したLPC176X用のライブラリとは、微妙にI/F仕様が異なっているので、中途半端な感じがします。~

次に、SysTick_Configで、1msの割り込みを発生させます。~
これも以前に説明しているので、詳細は割愛します。~

無限ループの中身は、500msのwaitを行うサブ関数を呼んで、1秒周期の点滅になるようにしています。~
簡単ですね。~

** 実行・デバッグ [#mb402324]
ソースが出来て、ビルドが通ったら、いよいよ実行です。~
以前はLPC1769と一体になっているLPC-Linkを使用しましたが、今回はLPC-Link2を買ったのでそれを使います。~
LPC-Link2とPCをUSBで繋いで、さらにLPC-Link2と基板を繋ぎます。

ちなみに、LPC-Link2のジャンパは、RedLinkとしてLPCXpressoで使うためにJP1をOpenに、基板にLPC-Link2から電源を供給するためにJP2をCloseにします。~

繋がったら、QuickStartPanelのDebugを押します。~

無事に実行できると、自動的にmain関数の先頭でbreakがかかります。~
Step Over(F6)でステップ実行を行い、最初のGPIOSetBitValueでLEDが点灯することが確認できると思います。~

Resume(F8)を押せば、LEDが点滅します。~
Suspendで、その時実行している箇所で停止します。~
Terminate(Ctrl+F2)でデバッガは停止し、マイコン自体はそのまま動作します。~

この辺りも前と同じですね。~

#u2b(cTsCXDH9lP4,w=640,h=360)

** クロックの設定 [#ibdc6a5e]
デバッガで停止中に、SysTick_Configの引数に指定している、SystemCoreClockにカーソルをあててみて下さい。~
ポップアップが表示されて、12000000という数字が値として設定されているのがわかると思います。~

LPC810は30MHzでの動作が可能ですが、デフォルトでは12MHzでの動作となっています。~
LPC1769の時と同様、30MHzで動作させるためには、CMSISライブラリの方をいじる必要があります。~

// #define CLOCK_SETUP           1
// #define SCS_Val               0x00000020
// #define CLKSRCSEL_Val         0x00000001
// #define PLL0_SETUP            1
// #define PLL0CFG_Val           0x00050077
// //#define PLL0CFG_Val           0x00050063
// #define PLL1_SETUP            1
// #define PLL1CFG_Val           0x00000023
// #define CCLKCFG_Val           0x00000003
// #define USBCLKCFG_Val         0x00000000
// #define PCLKSEL0_Val          0x00000000
// #define PCLKSEL1_Val          0x00000000
// #define PCONP_Val             0x042887DE
// #define CLKOUTCFG_Val         0x00000000
//
//これで、120MHzで動作するようになりました。~
//こちらの詳細につきましては、以下のblogがとてもわかりやすいと思います。~
//参考にさせていただきました。
//
//[[PS3とLinux、電子工作も-LPCXpresso LPC1769の120MHzクロック設定:http://todotani.cocolog-nifty.com/blog/2011/07/lpcxpresso-lp-1.html]]
//
//以上で、非RTOS版のLEDチカチカは終了です。~
こちらの詳細につきましては、以下のblogがとてもわかりやすいと思います。~
参考にさせていただきました。

[[人と技術のマッシュアップ-LPCXpressoとLPC800-MAXでマイコンを学ぶ(その5:PLLを使用してクロックアップ!):http://tomowatanabe.hatenablog.com/entry/2013/10/13/101641]]

以上で、LPC810版のLEDチカチカは終了です。~


トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS