3色LEDの制御 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Hello Worldのプロジェクトに、LEDを制御するHWの設定と、SWの設定を追加していきます。 ここでは、MCUXpresso IDEに組込まれているConfig Toolsを起動して、設定を行います。 FRDM-MCXN947評価ボードの確認 =================================== D2に搭載されているRGB LEDをGPIOを用いて制御します。 .. image:: image/FRDMMCXN947_connectorLED.png 回路図上のRGB LEDとMCX Nのピンの接続は以下のようになっている。 P_xxは、ピン名 .. image:: image/RGBschematic.png Config Toolsの起動 ==================================== * MCUXpresso IDEの右側のエクスプローラウィンドウから、”Open MCUXpresso Configuratin"ボタンの▽から"Open Pins"クリックして、Config Toolsを起動します。 .. image:: image/runConfigTools.png :scale: 70% * ワーニングメッセージが表示されたばあいは、OKをクリックしてそのまま進めてください。 .. image:: image/warningRunConfig.png :scale: 60% 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の箇所のチェックボックスをチェックします。 .. image:: image/redLEDsetting.png * 緑色のLED制御設定 | 赤色のLED設定と同様に、Package [Pint Bottom]のE11をクリックして、GPIO0の箇所のチェックボックスをチェックします。 .. image:: image/greenLEDSetting.png * 青色のLED制御設定 | 赤色/緑色のLED設定と同様に、Package [Pint Bottom]のC4をクリックして、GPIO1の箇所のチェックボックスをチェックします。 .. image:: image/blueLEDSetting.png * 追加したGPIOの初期設定 | 追加したGPIOの3つの項目を変更します。 1. Identifer: 信号を区別するために入力します。自動的にLabelの項目もアップデートされます。 2. Direction: Outputに設定します。 3. GPIO output initial state: Logical 1に設定します。(初期状態で、LEDは消灯) .. image:: image/gpioInitSetting.png * 設定を反映させる為に、"Update Code"をクリックします。 .. image:: image/updateCode.png * アップデートされるコードと、新規作成されるコードが確認できます。OKをクリックして、ウィンドウを閉じます。 Changeをクリックすると差分を確認することが可能です。 .. image:: image/updateFiles.png GPIOのAPIを用いてLEDを制御 ==================================== * GPIOのドライバをメインソースに、インクルードします。 .. code-block:: C :linenos: :emphasize-lines: 9 #include "fsl_device_registers.h" #include "fsl_debug_console.h" #include "pin_mux.h" #include "clock_config.h" #include "board.h" #include "fsl_clock.h" #include "fsl_gpio.h" // <- このコードを追加 * 次に、LEDをON/OFFの為に、ピンのWriteを行うコーどを追加します。 コンソールに'r'と入力した場合は、赤色LEDが点灯し、'g'は緑、'b'は青が点灯するようにします。 赤色LEDの制御を行うコードを追加します。 ピンがHighの場合は、LEDが消灯し、Lowの場合は、LEDが点灯します。 .. code-block:: c :linenos: :emphasize-lines: 6-11 while (1) { ch = GETCHAR(); PUTCHAR(ch); if('r' == ch) { GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 0); GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 1); GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 1); } } GPIOのWrite APIとして、GPIO_PinWrite()がfsl_gpio.hに用意されています。 .. code-block:: c :linenos: /*! @name GPIO Output Operations */ /*@{*/ /*! * @brief Sets the output level of the multiple GPIO pins to the logic 1 or 0. * * @param base GPIO peripheral base pointer (GPIOA, GPIOB, GPIOC, and so on.) * @param pin GPIO pin number * @param output GPIO pin output logic level. * - 0: corresponding pin output low-logic level. * - 1: corresponding pin output high-logic level. */ static inline void GPIO_PinWrite(GPIO_Type *base, uint32_t pin, uint8_t output) pin_mux.hで、GPIOの定義が行われています。 .. code-block:: c :linenos: /*! @name PORT0_10 (coord B12), LED_RED @{ */ /* Symbols to be used with GPIO driver */ #define BOARD_INITPINS_LED_RED_GPIO GPIO0 /*!<@brief GPIO peripheral base pointer */ #define BOARD_INITPINS_LED_RED_GPIO_PIN 10U /*!<@brief GPIO pin number */ /*! @name PORT0_27 (coord E10), LED_GREEN @{ */ /* Symbols to be used with GPIO driver */ #define BOARD_INITPINS_LED_GREEN_GPIO GPIO0 /*!<@brief GPIO peripheral base pointer */ #define BOARD_INITPINS_LED_GREEN_GPIO_PIN 27U /*!<@brief GPIO pin number */ /*! @name PORT1_2 (coord C4), LED_BLUE @{ */ /* Symbols to be used with GPIO driver */ #define BOARD_INITPINS_LED_BLUE_GPIO GPIO1 /*!<@brief GPIO peripheral base pointer */ #define BOARD_INITPINS_LED_BLUE_GPIO_PIN 2U /*!<@brief GPIO pin number */ * 最後に、緑と青のLEDの制御を追加します。 .. code-block:: c :linenos: :emphasize-lines: 12-23 while (1) { ch = GETCHAR(); PUTCHAR(ch); if('r' == ch) { GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 0); GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 1); GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 1); } else if('g' == ch) { GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 1); GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 0); GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 1); } else if('b' == ch) { GPIO_PinWrite(BOARD_INITPINS_LED_RED_GPIO, BOARD_INITPINS_LED_RED_GPIO_PIN, 1); GPIO_PinWrite(BOARD_INITPINS_LED_GREEN_GPIO, BOARD_INITPINS_LED_GREEN_GPIO_PIN, 1); GPIO_PinWrite(BOARD_INITPINS_LED_BLUE_GPIO, BOARD_INITPINS_LED_BLUE_GPIO_PIN, 0); } } プログラムのビルドと書き込み ================================== * Hello worldのの時と同じように、Buildを行います。 .. image:: image/runBuild.png * Debugを行いプログラムを書き込みます。 .. image:: image/runDebug_Dark.png * 標準出力を確認するために、「Terminal」を選択後、「new terminal」をクリックしてターミナルを開きます。 .. image:: image/terminalWindow_Dark.png * プルダウンメニュから「Serial Terminal」を選び、ボーレートを115200、8-bit、パリティなし、1ストップビットに設定します。 .. image:: image/setBaudrate_Dark.png * ウインドウ上部の「run」アイコンをクリックし、プログラムを実行すると、ターミナルに「Hello World」が表示されます。 .. image:: image/runProgram_Dark.png プログラムの動作確認 ================================= * Terminalに、r g bと打ち込み、LEDが点灯することを確認します。 .. image:: image/checkLED.png .. figure:: image/checkLED.mp4 :class: controls :scale: 70%