#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チカチカは終了です。~