6. 3色LEDの制御#

Hello Worldのプロジェクトに、LEDを制御するHWの設定と、SWの設定を追加していきます。 ここでは、MCUXpresso IDEに組込まれているConfig Toolsを起動して、設定を行います。

6.1. FRDM-MCXN947評価ボードの確認#

D2に搭載されているRGB LEDをGPIOを用いて制御します。

_images/FRDMMCXN947_connectorLED.png

回路図上のRGB LEDとMCX Nのピンの接続は以下のようになっている。 P_xxは、ピン名

_images/RGBschematic.png

6.2. Config Toolsの起動#

  • MCUXpresso IDEの右側のエクスプローラウィンドウから、”Open MCUXpresso Configuratin"ボタンの▽から"Open Pins"クリックして、Config Toolsを起動します。

_images/runConfigTools.png
  • ワーニングメッセージが表示されたばあいは、OKをクリックしてそのまま進めてください。

_images/warningRunConfig.png

6.3. GPIOのPin設定#

  • LEDとICの端子は以下のように接続されています。

LED

Pin No

Pin Name

Red

B12

P0_10

Green

E10

P0_27

Blue

C4

P1_2

  • 赤色のLED制御設定

中央のウィンドウのPackage [Pint Bottom]のB12をクリックすると、設定ウィンドウが起動します。GPIO0の箇所のチェックボックスをチェックします。
_images/redLEDsetting.png
  • 緑色のLED制御設定

赤色のLED設定と同様に、Package [Pint Bottom]のE11をクリックして、GPIO0の箇所のチェックボックスをチェックします。
_images/greenLEDSetting.png
  • 青色のLED制御設定

赤色/緑色のLED設定と同様に、Package [Pint Bottom]のC4をクリックして、GPIO1の箇所のチェックボックスをチェックします。
_images/blueLEDSetting.png
  • 追加したGPIOの初期設定

追加したGPIOの3つの項目を変更します。
  1. Identifer: 信号を区別するために入力します。自動的にLabelの項目もアップデートされます。

  2. Direction: Outputに設定します。

  3. GPIO output initial state: Logical 1に設定します。(初期状態で、LEDは消灯)

_images/gpioInitSetting.png
  • 設定を反映させる為に、"Update Code"をクリックします。

_images/updateCode.png
  • アップデートされるコードと、新規作成されるコードが確認できます。OKをクリックして、ウィンドウを閉じます。 Changeをクリックすると差分を確認することが可能です。

_images/updateFiles.png

6.4. GPIOのAPIを用いてLEDを制御#

  • GPIOのドライバをメインソースに、インクルードします。

1 #include "fsl_device_registers.h"
2 #include "fsl_debug_console.h"
3 #include "pin_mux.h"
4 #include "clock_config.h"
5 #include "board.h"
6
7 #include "fsl_clock.h"
8
9 #include "fsl_gpio.h"  // <- このコードを追加
  • 次に、LEDをON/OFFの為に、ピンのWriteを行うコーどを追加します。 コンソールに'r'と入力した場合は、赤色LEDが点灯し、'g'は緑、'b'は青が点灯するようにします。

赤色LEDの制御を行うコードを追加します。 ピンがHighの場合は、LEDが消灯し、Lowの場合は、LEDが点灯します。

 1 while (1)
 2 {
 3     ch = GETCHAR();
 4     PUTCHAR(ch);
 5
 6     if('r' == ch)
 7     {
 8       GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 0);
 9       GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 1);
10       GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 1);
11     }
12 }

GPIOのWrite APIとして、GPIO_PinWrite()がfsl_gpio.hに用意されています。

 1   /*! @name GPIO Output Operations */
 2   /*@{*/
 3
 4   /*!
 5    * @brief Sets the output level of the multiple GPIO pins to the logic 1 or 0.
 6    *
 7    * @param base    GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.)
 8    * @param pin     GPIO pin number
 9    * @param output  GPIO pin output logic level.
10    *        - 0: corresponding pin output low-logic level.
11    *        - 1: corresponding pin output high-logic level.
12    */
13    static inline void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output)

pin_mux.hで、GPIOの定義が行われています。

 1   /*! @name PORT0_10 (coord B12), LED_RED
 2     @{ */
 3
 4   /* Symbols to be used with GPIO driver */
 5   #define BOARD_INITPINS_LED_RED_GPIO GPIO0                /*!<@brief GPIO peripheral base pointer */
 6   #define BOARD_INITPINS_LED_RED_GPIO_PIN 10U              /*!<@brief GPIO pin number */
 7
 8   /*! @name PORT0_27 (coord E10), LED_GREEN
 9     @{ */
10
11   /* Symbols to be used with GPIO driver */
12   #define BOARD_INITPINS_LED_GREEN_GPIO GPIO0                /*!<@brief GPIO peripheral base pointer */
13   #define BOARD_INITPINS_LED_GREEN_GPIO_PIN 27U              /*!<@brief GPIO pin number */
14
15   /*! @name PORT1_2 (coord C4), LED_BLUE
16     @{ */
17
18   /* Symbols to be used with GPIO driver */
19   #define BOARD_INITPINS_LED_BLUE_GPIO GPIO1               /*!<@brief GPIO peripheral base pointer */
20   #define BOARD_INITPINS_LED_BLUE_GPIO_PIN 2U              /*!<@brief GPIO pin number */
  • 最後に、緑と青のLEDの制御を追加します。

 1 while (1)
 2 {
 3     ch = GETCHAR();
 4     PUTCHAR(ch);
 5
 6     if('r' == ch)
 7     {
 8       GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 0);
 9       GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 1);
10       GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 1);
11     }
12     else if('g' == ch)
13     {
14       GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 1);
15       GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 0);
16       GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 1);
17     }
18     else if('b' == ch)
19     {
20       GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 1);
21       GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 1);
22       GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 0);
23     }
24 }

6.5. プログラムのビルドと書き込み#

  • Hello worldのの時と同じように、Buildを行います。

_images/runBuild.png
  • Debugを行いプログラムを書き込みます。

_images/runDebug_Dark.png
  • 標準出力を確認するために、「Terminal」を選択後、「new terminal」をクリックしてターミナルを開きます。

_images/terminalWindow_Dark.png
  • プルダウンメニュから「Serial Terminal」を選び、ボーレートを115200、8-bit、パリティなし、1ストップビットに設定します。

_images/setBaudrate_Dark.png
  • ウインドウ上部の「run」アイコンをクリックし、プログラムを実行すると、ターミナルに「Hello World」が表示されます。

_images/runProgram_Dark.png

6.6. プログラムの動作確認#

  • Terminalに、r g bと打ち込み、LEDが点灯することを確認します。

_images/checkLED.png
_images/checkLED.mp4