LPC1769には、基板上に最初からLEDがついています。
なので、これを点滅させてみましょう。
LPC1769のピンアサインについては、インストールされた中にある、Getting StartedのPDFを見てください。
後半の方(P31〜P33あたり)のページに、LPC1769のピンアサインが載っています。
LEDの記載を見ると、P0[22]と書いてあるのがわかります。
これは、ポート0の22番ピンということになります。
このピンの出力を、周期的に変化させてやれば、LEDチカチカが実現できることになります。
まずは、新規プロジェクトを作りましょう。
QuickStartPanelのNew projectから、LPC176Xの「C Project」を選択して、適当なプロジェクト名をつけます。
ここでは、「ledtest01」としました。
MCUはLPC1769を選び、CMSIS Library to link project toは、CMSISv2p00_LPC17XXが選択されていることを確認してください。
Code Read Protectについては、コードを読み出されないようにするためのセキュリティ設定ですので、ここは外しておいて構いません。
プロジェクトが作成されたら、右クリックからプロパティを開きます。
「Project References」は、CMSISv2p00_LPC17xxと、DriverLibの両方にチェックを入れておきましょう。
これで、変数や関数の定義を、プロジェクトをまたいで遡ることが出来ます。
次に、「C/C++ General」の「Paths and Symbols」を開いて、includeとライブラリの設定をします。
まず、IncludesタブのLanguagesがGNU Cのところを選択すると、既に/CMSISv2p00_LPC17xx/incの設定が入っているかと思います。
ここに、/DriverLib/incも追加します。
次に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; }