ガレスタさんのDIY日記

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

Kinetis K64 GPIOメモ

GPIOいじるときにすぐ忘れるのでメモしておこうとおもった。

KSDK V2を使った場合で説明する

流れとしては

  1. PORTにクロック供給
  2. PINMUXの設定(GPIOへ設定)
  3. ピン方向の設定(構造体の定義)
  4. ピン方向の設定(InitAPIのコール)
  5. ピン操作APIのコール

こうなる。
さっそく見ていこうと思う

クロック供給

static inline void CLOCK_EnableClock(clock_ip_name_t name)っていうAPIがそれに値します。

引数としてnameが渡されますがそれはマクロで定義されています。

f:id:gsmcustomeffects:20170706002952p:plain

なので使う際は以下のように記述します。

CLOCK_EnableClock(kCLOCK_PortB);

PINMUXについて

最近のマイコンでは定番ですがピンの機能設定をします。
だいたいのマイコンでは初期がGPIOなので問題ないですがこいつの場合見ての通りデフォがADCとかDisableとかになってるんで設定してあげます。

f:id:gsmcustomeffects:20170706003658p:plain

K64の評価ボードではRGBLEDがついているんですがREDを使いたいのでPORTBの22番目を設定してあげることになります。
f:id:gsmcustomeffects:20170706003937p:plain


実際にはstatic inline void PORT_SetPinMux(PORT_Type *base, uint32_t pin, port_mux_t mux)というAPIでPINMUXを設定できます。

PORT_SetPinMux(PORTB, PIN22_IDX, kPORT_MuxAsGpio);

のように書くとピン機能の設定ができます。
第一引数と第二引数でPTB22を指定してます。

第三引数はALTファンクションなのでデータシート見て決めます

f:id:gsmcustomeffects:20170706004529p:plain

このようにALT1がそれにあたるのでマクロでもそのようになっています。

f:id:gsmcustomeffects:20170706004614p:plain

べたでやるならPin Control Resistorをセットしていく作業になります。

f:id:gsmcustomeffects:20170706005014p:plain

MUXフィールドに001をアサインする

f:id:gsmcustomeffects:20170706005133p:plain

ピン方向の設定(構造体の定義)

この作業についてはAPIリファレンスのGPIO項目にかかれています。
struct gpio_pin_config_tという構造体がそれにあたるんですがこれはリファレンスの説明が一番わかりやすくていいです

f:id:gsmcustomeffects:20170706005443p:plain

このようにOutputにしたい場合はkGpioDigitalOutputって定義してLogic部分は0でも1でもいいと思います。
尚構造体定義は以下のようになっています
f:id:gsmcustomeffects:20170706005739p:plain

ピン方向の設定(APIコール)

void GPIO_PinInit(GPIO_Type *base, uint32_t pin, const gpio_pin_config_t *config)っていうAPIをコールしてあげるだけです。

GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PIN, &led_config);

こう書けばいいんですがもっとわかりやすく書けば

GPIO_PinInit(GPIOB, 22U, &led_config);

GPIOBがポインタ型で渡されてなくない?って思った方のために
f:id:gsmcustomeffects:20170706010141p:plain

第三引数は先ほど作った構造体を投げるだけです。

ここでいじってるレジスタはPORT DATA Direction Resistorです

f:id:gsmcustomeffects:20170706010437p:plain

中身を見るとINかOUTかで判断してPDDRを操作してるだけ。
f:id:gsmcustomeffects:20170706011253p:plain

ピン操作APIのコール

ここまで来たらあとは以下のどれかを呼ぶだけです

f:id:gsmcustomeffects:20170706010701p:plain

反転専用レジスタがあるのでこれでもLチカは行けるw

GPIOB->PTOR = 1u << 22U;

f:id:gsmcustomeffects:20170706011010p:plain

ソース

int main(void)
{
    /* Define the init structure for the output LED pin*/
    gpio_pin_config_t led_config = {
        kGPIO_DigitalOutput, 0,
    };

   //GPIO_Type GPIOB;

    /* Board pin, clock, debug console init */
    BOARD_InitPins();
    BOARD_BootClockRUN();
    BOARD_InitDebugConsole();

    /* Print a note to terminal. */

    /* Init output LED GPIO. */
    GPIO_PinInit(BOARD_LED_RED_GPIO, BOARD_LED_RED_GPIO_PIN, &led_config);

    while (1)
    {
        delay();
       // GPIO_TogglePinsOutput(BOARD_LED_RED_GPIO, 1u << BOARD_LED_RED_GPIO_PIN);
        GPIOB->PTOR = 1u << 22U;

    }
}

まとめ

KinetisマイコンのGPIOについて紹介した。
一応かなり噛み砕いたけどわかりにくかったらコメントしてくれれば!