#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; }