前回の記事では MDK-Keil で S32K144 を開発する方法を紹介しましたが、次にこのプロジェクト テンプレートを使用して GPIO LED プログラミングの実験を行っていきます。
1. 開発環境
- S32K144EVB-Q100 開発ボード
- MDK-Keil + Jlink
2. ハードウェア接続
S32K144EVB-Q100 開発ボードの LED の概略図は次のとおりです。
つまり、具体的な接続関係は以下のとおりです。
導かれた | ピン |
---|---|
青 | PTD0 |
赤 | PTD15 |
緑 | PTD16 |
3. GPIO LEDの実験
S32K144の開発には、NXPが公式にドライバライブラリとpalライブラリを提供しており、これらのカプセル化されたAPI関数を使用することで、必要な機能を簡単に実現できます。
しかし、S32K144 のチップ特性をさらに理解するために、レジスタ操作を使用してコードを作成する予定です。
もちろん、これらのアドレス値などを使用してレジスタを操作することはありません。前回の記事で紹介したように、S32K144 SDK には、xxx_hw_access.c/.hファイルなど、レジスタ操作を提供するカプセル化された関数があります。
Driver 層のカプセル化された関数は、これらのファイル xxx_hw_access.c/.h のレジスタ操作関数を呼び出すことによってさらにカプセル化されます。ドライバ層でカプセル化した関数を呼び出さずに、レジスタ操作関数を直接呼び出してコードを書こうと考えています。
3.1 アイデアを書く
- 1. 対応する GPIO ポートのクロックを有効にします。
- 2. PORT モジュールのレジスタを設定し、プルアップ/オープンドレイン/プルダウン モード、ピン多重化モード、ピンが割り込みを有効にするかどうかなどを設定します。
- 3. GPIO モジュール レジスタを構成し、データの入出力方向と GPIO ピン レベル制御を設定します。
3.2 コードの記述
LED の点滅を実現するコードを記述します。
1. LEDピンマクロ定義
/* LED GPIO_Type */
#define LED_GPIO PTD
/* LED PORT_Type */
#define LED_PORT PORTD
/* LED PIN */
#define LED_BLUE_PIN 0U
#define LED_RED_PIN 15U
#define LED_GREEN_PIN 16U
S32K144 の GPIO ピンには、PORT モジュールと GPIO モジュールの 2 つのモジュールが含まれます。
2. LEDピンの初期化コード
/* Enable PORT_D clock */
PCC_SetClockMode(PCC, PORTD_CLK, 1);
/* Configurate PORT register, MUX = GPIO */
PINS_SetMuxModeSel(LED_PORT, LED_GREEN_PIN, PORT_MUX_AS_GPIO);
/* Configures the port pin interrupt/DMA request */
PINS_SetPinIntSel(LED_PORT, LED_GREEN_PIN, PORT_DMA_INT_DISABLED);
/* onfigurate GPIO register, set direction is output */
PINS_GPIO_SetPinDirection(LED_GPIO, LED_GREEN_PIN, 1);
1 つ目は、LED ピン ポート PORTD のクロックを有効にすることです。次に、GPIO 多重化モードを設定し、割り込みと DMA を無効にします。次に、出力方向を出力モードに設定します。
3. 主な機能は次のとおりです。
/* Delay function */
void Delay(volatile uint32_t count)
{
while (count--);
}
int main(void)
{
/* Enable PORT_D clock */
PCC_SetClockMode(PCC, PORTD_CLK, 1);
/* Configurate PORT register, MUX = GPIO */
PINS_SetMuxModeSel(LED_PORT, LED_GREEN_PIN, PORT_MUX_AS_GPIO);
/* Configures the port pin interrupt/DMA request */
PINS_SetPinIntSel(LED_PORT, LED_GREEN_PIN, PORT_DMA_INT_DISABLED);
/* onfigurate GPIO register, set direction is output */
PINS_GPIO_SetPinDirection(LED_GPIO, LED_GREEN_PIN, 1);
while (1)
{
PINS_GPIO_TogglePins(LED_GPIO, (1 << LED_GREEN_PIN));
Delay(0xFFFFF);
}
}
上記のコードをコンパイルしてダウンロードすると、LED が点滅するのが確認できます。