LEDチカチカ(非RTOS)

構成

LPC1769には、基板上に最初からLEDがついています。
なので、これを点滅させてみましょう。

LPC1769のピンアサインについては、インストールされた中にある、Getting StartedのPDFを見てください。
後半の方(P31〜P33あたり)のページに、LPC1769のピンアサインが載っています。

LEDの記載を見ると、P0[22]と書いてあるのがわかります。
これは、ポート0の22番ピンということになります。

LEDピンアサイン

このピンの出力を、周期的に変化させてやれば、LEDチカチカが実現できることになります。

プロジェクト

まずは、新規プロジェクトを作りましょう。
QuickStartPanelのNew projectから、LPC176Xの「C Project」を選択して、適当なプロジェクト名をつけます。
ここでは、「ledtest01」としました。

MCUはLPC1769を選び、CMSIS Library to link project toは、CMSISv2p00_LPC17XXが選択されていることを確認してください。
Code Read Protectについては、コードを読み出されないようにするためのセキュリティ設定ですので、ここは外しておいて構いません。

LEDプロジェクト設定

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

プロジェクト参照

次に、「C/C++ General」の「Paths and Symbols」を開いて、includeとライブラリの設定をします。

まず、IncludesタブのLanguagesがGNU Cのところを選択すると、既に/CMSISv2p00_LPC17xx/incの設定が入っているかと思います。
ここに、/DriverLib/incも追加します。

Includeパス設定

次にLibrariesタブの設定ですが、ここもすでに、CMSISv2p00_LPC17xxの設定が入っていると思います。
同様に、DriverLibを追加します。
ここは、「DriverLib」と記載するだけにしておいて下さい。

ライブラリ設定

最後に、Libraries Pathsの設定も同様にします。

ライブラリパス設定

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

「Project References」で指定した、CMSISv2p00_LPC17xxと、DriverLibのそれぞれのインクリメンタルビルドが行われてから、ledtest01のビルドが行われます。

ソースコード

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

// TODO: insert other include files here
#include "lpc17xx_pinsel.h"
#include "lpc17xx_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
	PINSEL_CFG_Type pincfg;	// ピン設定構造体
	uint32_t state = 0;

	// LED初期化
	pincfg.Funcnum = PINSEL_FUNC_0;
	pincfg.OpenDrain = PINSEL_PINMODE_NORMAL;
	pincfg.Pinmode = PINSEL_PINMODE_PULLUP;
	pincfg.Portnum = PINSEL_PORT_0;
	pincfg.Pinnum = PINSEL_PIN_22;
	PINSEL_ConfigPin(&pincfg);
	GPIO_SetDir(PINSEL_PORT_0, (1 << PINSEL_PIN_22), 1 );
	GPIO_SetValue(PINSEL_PORT_0, (1 << PINSEL_PIN_22));

	SysTick_Config(SystemCoreClock / 1000);

	while (1) {
		systick_delay(500);
		state = GPIO_ReadValue(PINSEL_PORT_0);
		GPIO_ClearValue(PINSEL_PORT_0, state & (1 << PINSEL_PIN_22));
		GPIO_SetValue(PINSEL_PORT_0, ~state & (1 << PINSEL_PIN_22));
	}
	return 0;
}

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS