LEDチカチカ(LPC810)

構成

トランジスタ技術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秒周期の点滅になるようにしています。
簡単ですね。

実行・デバッグ

ソースが出来て、ビルドが通ったら、いよいよ実行です。
以前は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)でデバッガは停止し、マイコン自体はそのまま動作します。

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

クロックの設定

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

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

こちらの詳細につきましては、以下のblogがとてもわかりやすいと思います。
参考にさせていただきました。

人と技術のマッシュアップ-LPCXpressoとLPC800-MAXでマイコンを学ぶ(その5:PLLを使用してクロックアップ!)

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


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-05-01 (木) 22:05:21 (3873d)