ガレスタさんのDIY日記

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

GettingStartKinetisVer2

以前こんなの書いたんですけど
gsmcustomeffects.hatenablog.com


いつの間にかNXPになりそしてMCUXpressoSDKなるものが出てIDEも変わったので初心者のためにかきます。
あくまで初心者のためです。強い人はかえってどうぞ

必要なもの

  • FRDMボード
  • MCUXpressoIDE

の二つが必要です。

評価ボードについては定番であるFRDM-K64Fを使っていきたいと思いますので同じようにやりたい方は購入してください。
IDEに関しては此方からダウンロードできます。

MCUXpresso IDE|NXP

SDKのビルド

Kinetisの場合STM32のCubeHALとは違いオンラインで色々選択してSDKをダウンロードして使う仕組みなので先ずはそれをやって行く

mcuxpresso.nxp.com

上記のサイトでNXPアカウントでログインする。

FRDM-K64Fを選択するとこのような画面になる

f:id:gsmcustomeffects:20170705015403p:plain

次にSDK Builderに進んでDownloadをすればSDK関連は終わりです。(ミドルウエアは適宜選んでください

f:id:gsmcustomeffects:20170705015615p:plain

MCUXpressoにSDKを入れていくぞ

まず起動してワークスペースを開くと基本画面が出てくるので下部のSDK部分からさっき落としてきたZipファイルをインポートしてあげます。(右クリックでアーカイブZip)

f:id:gsmcustomeffects:20170705020216p:plain

するとこうなります。

新規プロジェクトを作っていく

New projectをクリックすると先ほど入れたSDKが出てくると思います。(なんかかっこいいw

f:id:gsmcustomeffects:20170705020400p:plain

今回はK64をつかうのでこれ

f:id:gsmcustomeffects:20170705020431p:plain

するとこうなるので適宜選んで進む
f:id:gsmcustomeffects:20170705020530p:plain

ここではUtilityについては割愛

あとはC言語のlib関連とFloating Pointの設定とかしてく

f:id:gsmcustomeffects:20170705020743p:plain

んで終了

ソースコード

書くところは二つあります。
まずはpin_mux.cです。

#include "fsl_common.h"
#include "fsl_port.h"
#include "pin_mux.h"


#define PIN16_IDX                       16u   /*!< Pin number for pin 16 in a port */

#define PIN17_IDX                       17u   /*!< Pin number for pin 17 in a port */

#define PIN22_IDX                       22u   /*!< Pin number for pin 22 in a port */
#define SOPT5_UART0TXSRC_UART_TX      0x00u   /*!< UART 0 transmit data source select: UART0_TX pin */

/*
 * TEXT BELOW IS USED AS SETTING FOR THE PINS TOOL *****************************
BOARD_InitPins:
- options: {coreID: singlecore, enableClock: 'true'}
- pin_list:
  - {pin_num: '62', peripheral: UART0, signal: RX, pin_signal: PTB16/SPI1_SOUT/UART0_RX/FTM_CLKIN0/FB_AD17/EWM_IN}
  - {pin_num: '63', peripheral: UART0, signal: TX, pin_signal: PTB17/SPI1_SIN/UART0_TX/FTM_CLKIN1/FB_AD16/EWM_OUT_b}
 * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR THE PINS TOOL ***
*/

/*FUNCTION**********************************************************************
 * 
 * Function Name : BOARD_InitBootPins
 * Description   : Calls initialization functions.
 * 
 *END**************************************************************************/
void BOARD_InitBootPins(void) {
  BOARD_InitPins();
}


/*FUNCTION**********************************************************************
 *
 * Function Name : BOARD_InitPins
 * Description   : Configures pin routing and optionally pin electrical features.
 *
 *END**************************************************************************/
void BOARD_InitPins(void) {
  CLOCK_EnableClock(kCLOCK_PortB);                           /* Port B Clock Gate Control: Clock enabled */

  PORT_SetPinMux(PORTB, PIN16_IDX, kPORT_MuxAlt3);           /* PORTB16 (pin 62) is configured as UART0_RX */
  PORT_SetPinMux(PORTB, PIN17_IDX, kPORT_MuxAlt3);           /* PORTB17 (pin 63) is configured as UART0_TX */
  PORT_SetPinMux(PORTB, PIN22_IDX, kPORT_MuxAsGpio);
  SIM->SOPT5 = ((SIM->SOPT5 &
    (~(SIM_SOPT5_UART0TXSRC_MASK)))                          /* Mask bits to zero which are setting */
      | SIM_SOPT5_UART0TXSRC(SOPT5_UART0TXSRC_UART_TX)       /* UART 0 transmit data source select: UART0_TX pin */
    );
}

PORTへのクロック供給と22ピンをGPIOにアサインする記述を追加しています。

次にMain.c

#include <stdio.h>
#include "board.h"
#include "pin_mux.h"
#include "clock_config.h"
#include "fsl_gpio.h"
#include "MK64F12.h"

/* TODO: insert other include files here. */

/* TODO: insert other definitions and declarations here. */

/*
 * @brief   Application entry point.
 */
void delay(void)
{
    volatile uint32_t i = 0;
    for (i = 0; i < 800000; ++i)
    {
        __asm("NOP"); /* delay */
    }
}

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

    /* 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);
    }
}

こんな感じです。

デバッグ

デバッガの設定はCMSIS-DAPファームが入ってるならNXPがプラグインでやってくれてるので楽になった

f:id:gsmcustomeffects:20170705021513p:plain

JLINK GDBやOpenOCDでつなぐなら各自設定してほしい。

あとはブレイクしてステップ実行なりでデバッグ機能の確認ができる

f:id:gsmcustomeffects:20170705024340p:plain

その他機能

こういった使い方のほかにサンプルをそのままインポート補助する機能もあるのでそれを使うともっと楽だ(むしろKinetisは豊富なサンプル使ってなんぼですよねw

f:id:gsmcustomeffects:20170705024547p:plain

こんな感じで80個ぐらいサンプルあるので強すぎるとw

まとめ

Kinetisの新しい開発環境を紹介した。

いろいろサンプル増えててあせったw
CMSISの管轄の境界線はどこなんやという感想を持ちましたw
共通化はレジスタ定義のヘッダーとかぐらいにしてくれればわかりやすくていいと思います。