ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

MIMXRT1050-EVKでスイッチ入力を使う手順

今回は今後よく使うであろうスイッチ入力をやって行く。
まずボードにあるタクトスイッチは以下の四つである

SW2 ON/OFFスイッチ
SW3 リセット
SW4 デバッガチップリセット or bootloader mode
SW8 ユーザースイッチ

ここで SW2はON/OFFスイッチになっておりOFF状態で押すと電源がONになる面白い機能
一方ON状態で短く押すと割り込み生成ができるらしいw
あと長押し5秒でOFFできる。(何だこのゲーム機見たいな機能w

おっと脱線しました・・・・・・・

要はSW8(GPIO5-00)を使うってことですね。
場所はチップの左上にあるやつです。

f:id:gsmcustomeffects:20180119214134p:plain
早速やっていこう

使い方

プログラムの冒頭でコンフィグ構造体の設定をしてあげる。

typedef struct _gpio_pin_config
{
    gpio_pin_direction_t  direction;     /*!< Specifies the pin direction. */
    uint8_t outputLogic; /*!< Set a default output logic, which has no use in input */
    gpio_interrupt_mode_t interruptMode; /*!< Specifies the pin interrupt mode, a value of @ref gpio_interrupt_mode_t. */
} gpio_pin_config_t;

構造体が上記のようなメンバなのでこういう感じに設定してあげる。
ボタンはGNDに繋がっていてるのでこうやって設定する。(ピンのプルアップはこのあと説明

    gpio_pin_config_t sw_config = {
        kGPIO_DigitalInput, 0,
        kGPIO_IntFallingEdge,
    };

次にPINMUXの設定をする。
これは手打ちでやるべきでないのでMCUXpressoのピンコンフィグツールで行った方が無難
f:id:gsmcustomeffects:20180119231707p:plain

ピンのプルアップ抵抗値だったりヒステリシスだったり色々柔軟なことができる。(リファレンスマニュアル:Chapter 32
General Purpose Input/Output (GPIO)を参照)
f:id:gsmcustomeffects:20180119234248p:plain
それでコードを吐くとこうなる。

void BOARD_InitPins(void) {
  CLOCK_EnableClock(kCLOCK_Iomuxc);           /* iomuxc clock (iomuxc_clk_enable): 0x03u */
  CLOCK_EnableClock(kCLOCK_IomuxcSnvs);       /* iomuxc_snvs clock (iomuxc_snvs_clk_enable): 0x03u */

  IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_B0_12_LPUART1_TX,        /* GPIO_AD_B0_12 is configured as LPUART1_TX */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
  IOMUXC_SetPinMux(
      IOMUXC_GPIO_AD_B0_13_LPUART1_RX,        /* GPIO_AD_B0_13 is configured as LPUART1_RX */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
  IOMUXC_SetPinMux(
      IOMUXC_SNVS_WAKEUP_GPIO5_IO00,          /* WAKEUP is configured as GPIO5_IO00 */
      0U);                                    /* Software Input On Field: Input Path is determined by functionality */
  IOMUXC_SetPinConfig(
      IOMUXC_GPIO_AD_B0_12_LPUART1_TX,        /* GPIO_AD_B0_12 PAD functional properties : */
      0x10B0u);                               /* Slew Rate Field: Slow Slew Rate
                                                 Drive Strength Field: R0/6
                                                 Speed Field: medium(100MHz)
                                                 Open Drain Enable Field: Open Drain Disabled
                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
                                                 Pull / Keep Select Field: Keeper
                                                 Pull Up / Down Config. Field: 100K Ohm Pull Down
                                                 Hyst. Enable Field: Hysteresis Disabled */
  IOMUXC_SetPinConfig(
      IOMUXC_GPIO_AD_B0_13_LPUART1_RX,        /* GPIO_AD_B0_13 PAD functional properties : */
      0x10B0u);                               /* Slew Rate Field: Slow Slew Rate
                                                 Drive Strength Field: R0/6
                                                 Speed Field: medium(100MHz)
                                                 Open Drain Enable Field: Open Drain Disabled
                                                 Pull / Keep Enable Field: Pull/Keeper Enabled
                                                 Pull / Keep Select Field: Keeper
                                                 Pull Up / Down Config. Field: 100K Ohm Pull Down
                                                 Hyst. Enable Field: Hysteresis Disabled */
}

あとはInit

GPIO_PinInit(GPIO5, 0, &sw_config);//GPIO5の0ピン

ここでやっとconfig構造体を渡す。
同じ設定使いたかったら構造体の使い回しできるし結構いい設計だと思う。
普通に使うならここで終了。GPIO_PinWrite,Readなりを呼んで使える。

割り込みを使う場合

割り込みの場合はIRQAPIで該当ポートを有効にする。

EnableIRQ(GPIO5_Combined_0_15_IRQn);

な感じで設定。
割り込み番号はデータシートかMIMXRT1052.hを参照

そのあとにGPIO_PinInitをコール(GPIO_SetPinInterruptConfigというAPIをInit内で呼んでいる為)

あとはMaskレジスタの設定をして終わり

GPIO_PortEnableInterrupts(GPIO5, 1U << 0U);

スイッチ押したときこのようにブレークが入ればOK
f:id:gsmcustomeffects:20180119233958p:plain