>

作成日:2011-5-29

ファンクション/GPIO設定と割り込みの使い方 (LPCXpresso LPC1769)

LPCXPresso LPC1769でLED2のLチカプログラムの作成

今回は、LPCXPresso LPC1769ターゲット上のLED2のLチカプログラムを作成してみます。

まず、LPCXpressoターゲット上のLED2はどのピンに接続されているか調べる必要があります。LPC1700ページ を開きます。"参照回路図(PDF)/ LPCXpresso LPC1769" をクリックすると回路図がダウンロードされます。他に、LPCXpresso SuppoetページEmbedded ArtistsのLPCXPressoページにも回路図やその他情報があります。 Embedded Artistsのページには LPCXpresso LPC1768 の回路図もあります。

回路図を見ると、P0[22] が抵抗を介して LED2 のアノードと繋がっています。LEDのカソードは GND へ落ちていますので、 このポートを High にすると点灯、Low にすると消灯です。

NXPマイコンの資料としては、データシート(DS), ユーザーマニュアル(UM)、 アプリケーションノート(AN), サンプルソース等があります。マイコンの使い方はユーザーマニュアルに書かれています。

ユーザーマニュアルは LPC1700のページにある LPC175x/6x ユーザーマニュアル(PDF)からダウンロードしてください。

ユーザーマニュアルを見てみましょう。
Chapter 8: LPC17xx Pin connect block では、@ピンのファンクション, Aピン・モード, Bオープンドレインの各設定方法が書かれています。これはどのファンクションを使う場合もこの@〜Bを設定ます。

@ピンのファンクション設定:
Table 75.Pin function select register bits.png

Aピン・モード設定:
Table 76.Pin Mode Select register Bits.png

Bオープンドレイン設定
Table 77.Open Drain Pin Mode Select register Bits.png

今回は P0.22 を設定すので、@ピンのファンクション設定 は下記。
Table 80.Pin function select register 1.png

ピン・ファンクションはReset value が "00" なので、デフォルトは GPIO になっています。 ピンモードもデフォルトの on-chip pull-up でOK。 オープンドレインにはしないのでこれもデフォルトでOK。
ですが、今回は練習ですので、後でGPIOへの設定はしてみることにします。
それぞれのレジスタは下記。
Table 88. Pin Mode select register 1.png
Table 94. Open Drain Pin Mode select register 0.png

次はGPIOのレジスタを見てみます。
Table 101.GPIO register map.png

FIODIR (Fast GPIO Port Direction control register): GPIO の入力/出力設定
Table 103.Fast GPIO port Direction register.png

上の表(Table 103)は ビット単位 ですが、 byte(8ビット)単位 や half-word(16ビット)単位 で設定も出来ます、Table 104 参照。

LPCマイコンはちょっと変わっていて、書き込みには SET / CLR(Clear) レジスタを使います。
GPIOの値は PINレジスタです。このレジスタに直接書くことも可能です。
MASKレジスタというに "1" を立てると、読み書きできなくなります。読みだした場合は "0" が返ってきます。
FIOSETの様に最初に"F"ついているのは ARM7の LPC2000ファミリの名残です。LPC2000には FIO(Fast GPIO)というのと普通のGPIOがありました。FIOは、AHBバスに直接接続されているのでスピードが速いです。LPC1700は全てのGPIOが AHBバスに直接つながっています。

GPIO に"High"を書き込み時に使う SETレジスタ:
Table 105.Fast GPIO port output Set registe.png
byte(8ビット)単位, half-word(18ビット)単位 での設定は Tanle 106参照。

GPIO に"Low"を書き込み時に使う CLRレジスタ:
Table 107.Fast GPIO port output Clear register.png
上記はWord(32ビット)単位。 byte(8ビット)単位, half-word(16ビット)単位 での設定は Tanle 108参照。

GPIO の状態を見るときに使う Pin PINレジスタ:
Word単位は
Table 109.Fast GPIO port Pin value register.png

byte / half-word単位は
Table 110.Fast GPIO port Pin value byte and half-word_1.png

Word と byte / half-word でレジスタ名が違うので注意。

次に、LPC17xx.h を見てみます。場所は
LPC17xx.hの場所

152行目から Pin Connect Block (PINCON) についての構造体です。LPC17xx.h の中を見て、上で述べた設定を ピンのファンクションから順番に行っていきましょう。
/*------------- Pin Connect Block (PINCON) -----------------------------------*/  
typedef struct  
{  
  __IO uint32_t PINSEL0;  
  __IO uint32_t PINSEL1;  
  __IO uint32_t PINSEL2;  
  __IO uint32_t PINSEL3;  
  __IO uint32_t PINSEL4;  
  __IO uint32_t PINSEL5;  
  __IO uint32_t PINSEL6;  
  __IO uint32_t PINSEL7;  
  __IO uint32_t PINSEL8;  
  __IO uint32_t PINSEL9;  
  __IO uint32_t PINSEL10;  
       uint32_t RESERVED0[5];  
  __IO uint32_t PINMODE0;  
  __IO uint32_t PINMODE1;  
  __IO uint32_t PINMODE2;  
  __IO uint32_t PINMODE3;  
  __IO uint32_t PINMODE4;  
  __IO uint32_t PINMODE5;  
  __IO uint32_t PINMODE6;  
  __IO uint32_t PINMODE7;  
  __IO uint32_t PINMODE8;  
  __IO uint32_t PINMODE9;  
  __IO uint32_t PINMODE_OD0;  
  __IO uint32_t PINMODE_OD1;  
  __IO uint32_t PINMODE_OD2;  
  __IO uint32_t PINMODE_OD3;  
  __IO uint32_t PINMODE_OD4;  
  __IO uint32_t I2CPADCFG;  
} LPC_PINCON_TypeDef;  
Table80で、P0.22のピン・ファンクションレジスタは PINSEL1 の [13:12]ビットでしたので、 これに"00b"を書けば、P0.22はGPIOに設定されます。
下記は"11b"を12ビットずらして反転させて"00b"を[13:12]ビットに書き込みます。
LPC_PINCON->PINSEL1  &= (~(3 << 12));  
これは以前使ったLPCXpresso1768_systick Projectと同じです。

他のレジスタも同様な書き方で ユーザーマニュアル と LPC17xx.h 見て、各レジスタを設定してください。

void SysTick_Handler(void){  
}  
1msインターバルでSystick割り込みを作る下記関数も以前のプロジェクトを同じです。
if (SysTick_Config(SystemCoreClock / 1000))
私の作った、1秒で点灯/消灯を繰り返す プログラムは下記。
/* 
=============================================================================== 
 Name        : main.c 
 Author      :  
 Version     : 
 Copyright   : Copyright (C)  
 Description : main definition 
=============================================================================== 
*/  
  
#ifdef __USE_CMSIS  
#include "LPC17xx.h"  
#endif  
  
#include   
#include   
  
// Variable to store CRP value in. Will be placed automatically  
// by the linker when "Enable Code Read Protect" selected.  
// See crp.h header for more information  
__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;  
  
volatile uint32_t msTicks;  // counter for 1ms SysTicks  
  
void SysTick_Handler(void) {  
    msTicks++;  
    if (!(msTicks % 1000)){                 //1秒(1000ms)をカウント  
        if (LPC_GPIO0->FIOPIN  & (1 << 22))  
            LPC_GPIO0 -> FIOCLR = (1 << 22);  
        else  
            LPC_GPIO0 -> FIOSET = (1 << 22);  
    }  
}  
int main(void) {  
    msTicks = 0;  
    // Set P0_22 to 00 - GPIO  
    LPC_PINCON->PINSEL1  &= (~(3 << 12));  
    // Set GPIO - P0_22 - to be output  
    LPC_GPIO0->FIODIR |= (1 << 22);        //出力は"1"、デフォルトは入力の"0"  
    //ここでは、デフォルトでpull-upの設定とオープンドレインではない設定になっているので割愛。  
  
    // Setup SysTick Timer to interrupt at 1 msec intervals  
    if (SysTick_Config(SystemCoreClock / 1000)) {  
        while (1);  // Capture error  
    }  
    while(1) {  
    }  
    return 0 ;  
}

割り込みハンドラはあらかじめ、スタートアップファイル(cr_startup_lpc176x.c)の中に書かれていますので、 他の割り込みハンドラを使う場合も、スタートアップファイル内と同じ名前を使う必要があります。

宣言されている場所は、LPCXpresso IDEの使い方 その2 〜サンプルプロジェクトのインポートとデバッグ〜内で説明した様に、右クリック → Declarations → Project で見つけられます。

作成日:2011-5-29