2016年12月28日

オープンソースのKiCADでLPC824のDIP化基板を作ってみる(28) スイッチを使ってみる(1)

さて、GPIOのInputとしてスイッチを使ってみたいと思います。

ぱっとみたところ、LPCOpenのサンプルの中に入力が見つかりません。
おそらく、LED用の出力コードの周辺に入力のライブラリも用意されているはず、ということで探してみます。

lib_lpc_boards_8xxのboard.cに
以下の関数がありmす。

/* Initialize the LEDs on the NXP LPC824 LPCXpresso Board */
static void Board_LED_Init(void)
{
 int i;
 for (i = 0; i < LEDSAVAIL; i++) {
  Chip_GPIO_SetPinDIROutput(LPC_GPIO_PORT, 0, ledBits[i]);
  Chip_GPIO_SetPinState(LPC_GPIO_PORT, 0, ledBits[i], true);
 }
}
Chip_GPIO_SetPinDIROutputがある、ということはInputもあるはず。

Chip_xxxで始まるのは
lib_lpc_chip_82xにふくまれます。



検索したらgpio_8xx.hにいました。
ヘッダの中でインライン記述していますね。

STATIC INLINE void Chip_GPIO_SetPinDIROutput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
#ifdef CHIP_LPC82X
 pGPIO->DIRSET[port] = 1UL << pin;
#else
 pGPIO->DIR[port] |= 1UL << pin;
#endif
}
/**
 * @brief Set GPIO direction for a single GPIO pin to an input
 * @param pGPIO : The base of GPIO peripheral on the chip
 * @param port : GPIO port to set (supports port 0 only)
 * @param pin  : GPIO pin to set direction on as input
 * @return Nothing
 */
STATIC INLINE void Chip_GPIO_SetPinDIRInput(LPC_GPIO_T *pGPIO, uint8_t port, uint8_t pin)
{
#ifdef CHIP_LPC82X
 pGPIO->DIRCLR[port] = 1UL << pin;
#else
 pGPIO->DIR[port] &= ~(1UL << pin);
#endif
}

ついでに、入力値を読む関数も探しておきます。
特定ポートの値をtrue/falseで返してくれる関数のようです。
STATIC INLINE bool Chip_GPIO_ReadPortBit(LPC_GPIO_T *pGPIO, uint32_t port, uint8_t pin)
{
 return (bool) pGPIO->B[port][pin];
}

chipのライブラリ関数はアプリ側から直接呼べます。

Lチカのmainを書き換えてみます。

ボタンを押されたらGNDになるので、0。
それ以外はプルアップで1。
状態が変わったらカウントアップ。というコードです。

int main(void)
{
  static int pin_state = 0;
  int prev_state;
  static int count = 0;
   
 SystemCoreClockUpdate();
 Board_Init();
 Board_LED_Set(0, false);
  Chip_GPIO_SetPinDIRInput(LPC_GPIO_PORT, 0, 1);
 
 /* Enable SysTick Timer */
 SysTick_Config(SystemCoreClock / TICKRATE_HZ);
        prev_state = Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, 1);
      
       
 /* Loop forever */
 while (1) {
  //__WFI();
          pin_state = Chip_GPIO_GetPinState(LPC_GPIO_PORT, 0, 1);
          if(pin_state != prev_state)
          {
            prev_state = pin_state;
            count++;
          }
         
 }
}

countとpin_stateをライブウォッチに登録します。
実行して、ボタンを押して観測してみます。

Image 357.png

なぜかpin_stateが1っぱなしで変わりません。。

ちょっと調査をしてみます。
posted by EWRXJP at 12:00| Comment(0) | TrackBack(0) | NXP | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック