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; }
まず、LEDを使用するために、LEDがつながっているポート0の22番ピンの設定をします。
ピンの設定用構造体PINSEL_CFG_Typeは以下のようになっており、これに必要な値を設定してPINSEL_ConfigPinをコールすることにより、そのピンが使えるようになります。
(デフォルト値のままであればそのまま使えますが、一応……)
typedef struct { uint8_t Portnum; /**< Port Number, should be PINSEL_PORT_x, where x should be in range from 0 to 4 */ uint8_t Pinnum; /**< Pin Number, should be PINSEL_PIN_x, where x should be in range from 0 to 31 */ uint8_t Funcnum; /**< Function Number, should be PINSEL_FUNC_x, where x should be in range from 0 to 3 */ uint8_t Pinmode; /**< Pin Mode, should be: - PINSEL_PINMODE_PULLUP: Internal pull-up resistor - PINSEL_PINMODE_TRISTATE: Tri-state - PINSEL_PINMODE_PULLDOWN: Internal pull-down resistor */ uint8_t OpenDrain; /**< OpenDrain mode, should be: - PINSEL_PINMODE_NORMAL: Pin is in the normal (not open drain) mode - PINSEL_PINMODE_OPENDRAIN: Pin is in the open drain mode */ } PINSEL_CFG_Type;
PINSELやGPIOの定義は、DriverLibの中にあるヘッダの定義です。
これらは、解凍したペリフェラルドライバライブラリの中にある、「LPC1700 Peripheral Driver Library Manual.chm」に、どのような命令があってどのような値が設定できるのか、詳しく載っていますので、DriverLibの中身を使う際にはこれを見て下さい。
どのような設定をすればいいかは、ユーザーマニュアルを見て確認します。
ユーザーマニュアルはNXP社のHPから検索してダウンロードできます。
LPC17xx User manualを落として下さい。
落としたら、「Chapter 8: LPC17xx Pin connect block」を開きます。
「Table 74」を見ると、今回使用するP0[22]は「Table 80」に記載があるようなので、そこを見ます。
「Table 80」を見ると、P0[22]は、Function00(0)の時はGPIO(汎用的なI/Oピン)として、Function01(1)の時はRTS1、Function11(3)の時はTD1として動作するように書かれています。
この、RTS1やTD1というのは何かというのは、「Table 73. Pin description」に記載があり、RTS1はUART1という機能のTD1はCAN1という機能の出力ピンとして使えるというのがわかります。
今回は、GPIOとしてこのピンを使いますので、機能は0番を指定する必要があり、PINSEL_CFG_TypeのFuncnumにはPINSEL_FUNC_0(0)を設定します。
PINSEL_CFG_TypeのOpenDrainは、オープンドレインにはしないので、PINSEL_PINMODE_NORMAL(0)を設定します。
PINSEL_CFG_TypeのPinmodeは、内蔵プルアップのままにするので、PINSEL_PINMODE_PULLUP(0)を設定します。
さらに、PortnumはPINSEL_PORT_0で、PinnumがPINSEL_PIN_22なのはいいですね。
詳細については、ユーザーマニュアルの同じ所に載っていますので、確認してみて下さい。
最後に、この構造体を指定してPINSEL_ConfigPinを呼べば、これでP0[22]のピンを使用する準備は整いました。
次に、そのピンに対して、実際に操作を行います。
GPIO_SetDirは、指定したポートの、立てたビットのピンの入出力を設定します。
PINSEL_PORT_0の、PINSEL_PIN_22ビットのピンを、出力(1)用に設定します。
これでH/Lを出力できるようになったので、まずはLEDをON状態に初期化します。
GPIOの命令は、GPIO_SetValueで指定したピンをHighに、GPIO_ClearValueで指定したピンをLowにします。
一つの命令でH/Lを設定するわけではないので、注意が必要です。
ユーザーマニュアルの「Chapter 9: LPC17xx General Purpose Input/Output (GPIO)」を読むと理解が深まると思いますが、GPIOのレジスタには、SETレジスタとCLRレジスタがあり、これをラッパーしているのが前述の命令ということになります。
まずはON状態で初期化するので、GPIO_SetValueにPINSEL_PORT_0の、PINSEL_PIN_22ビットのピンを指定すれば、この時点でLEDが点灯します。