#analog
#norelated
#contents
* LEDチカチカ(非RTOS) [#i8a730b4]

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

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

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

#ref(ledpin.png,left,nowrap,LEDピンアサイン)

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


//#u2b(fc-vW6RD1Co,w=480,h=385)


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

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

#ref(ledproject.png,left,nowrap,LEDプロジェクト設定)

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

#ref(prjref.png,left,nowrap,プロジェクト参照)

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

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

#ref(includs.png,left,nowrap,Includeパス設定)

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

#ref(libraries.png,left,nowrap,ライブラリ設定)

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

#ref(libpaths.png,left,nowrap,ライブラリパス設定)

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

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


** ソースコード [#g8126864]
以下、ソースコード。~
まず、最初から作られている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