- 追加された行はこの色です。
- 削除された行はこの色です。
#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とPCをUSBで繋いで、QuickStartPanelのDebugを押します。~
//
//#ref(debug.png,left,nowrap,デバッグ)
//
//初回は、ドライバのインストールなどがあり、時間がかかるかもしれません。~
//待つかキャンセルかを聞かれるダイアログが表示されることもあるようです。~
//また、USBを接続しなおしたりした場合にも、エミュレータ選択ダイアログが表示されることがありますので、その場合は接続しなおして再検索をするといいようです。~
//
//無事に実行できると、自動的にmain関数の先頭でbreakがかかります。~
//Step Over(F6)でステップ実行を行い、最初のGPIO_SetValueでLEDが点灯することが確認できると思います。~
//
//Resume(F8)を押せば、LEDが点滅します。~
//Suspendで、その時実行している箇所で停止します。~
//Terminate(Ctrl+F2)でデバッガは停止し、マイコン自体はそのまま動作します。~
//
//お手軽にIDEでデバッグ出来るのは楽でいいですね。~
//
//#u2b(v1xaoRxPuSY,w=640,h=360)
//
ソースが出来て、ビルドが通ったら、いよいよ実行です。~
以前は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にカーソルをあててみて下さい。~
//ポップアップが表示されて、100000000という数字が値として設定されているのがわかると思います。~
//(このために、SYSTICK_InternalInitじゃなくてSysTick_Configを使用していました)
//
//#ref(scc.png,left,nowrap,SystemCoreClock)
//
//実はこのLPC1769、このままでは100MHzでしか動作していません。~
//LPC1769より前のLPC1768ではよかったのですが、LPC1769は120MHzでの動作が可能ですので、これを修正しておきましょう。~
//
//この設定は、CMSISv2p00_LPC17xxライブラリの方で行われています。~
//CMSISv2p00_LPC17xxプロジェクトのsystem_LPC17xx.cを開いて、PLL0CFG_Valの値を変更します。~
//
// #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チカチカは終了です。~
デバッガで停止中に、SysTick_Configの引数に指定している、SystemCoreClockにカーソルをあててみて下さい。~
ポップアップが表示されて、12000000という数字が値として設定されているのがわかると思います。~
LPC810は30MHzでの動作が可能ですが、デフォルトでは12MHzでの動作となっています。~
LPC1769の時と同様、30MHzで動作させるためには、CMSISライブラリの方をいじる必要があります。~
こちらの詳細につきましては、以下のblogがとてもわかりやすいと思います。~
参考にさせていただきました。
[[人と技術のマッシュアップ-LPCXpressoとLPC800-MAXでマイコンを学ぶ(その5:PLLを使用してクロックアップ!):http://tomowatanabe.hatenablog.com/entry/2013/10/13/101641]]
以上で、LPC810版のLEDチカチカは終了です。~