トランジスタ技術2014年2月号付属のLPC810とプリント基板のセットを使用しますが、これにはLEDがつくようになっています。
なので、これを点滅させてみましょう。
LPC810のピンアサインは、LPC800シリーズのページの下の方にあるリンクの、「LPC81xユーザーマニュアル」に載っています。
LEDは5ピンのPIO0_1につくようになっています。
まずは、新規プロジェクトを作りましょう。
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です。
以下、ソースコード。
まず、最初から作られている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; }
最初に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秒周期の点滅になるようにしています。
簡単ですね。