がれすたさんのDIY日記

電子回路、Python、組み込みシステム開発、自作エフェクターを語るblog

MIMXRT1052CVL5Bを使う際のTips

MIMXRT1052の場合 コンシューマ向けのは600MHz、工業用途の場合528MHz駆動となっている。
MCUXPressoIDEで新規プロジェクトを作った際にはMIMXRT1052DVL6B向けの設定で吐きだされる。
今回はMIMXRT1052CVL5B向けのプロジェクトの設定や変更しないといけな部分を書いておく。

正直いって工業用のSoMとか普通の人は買わないし評価ボード買って使うと思うんであくまで僕自身のメモTipsとして受け取ってくれればうれしいです。
使ってるボードはForlinxのFET1052-C核心板です。

f:id:gsmcustomeffects:20190222005316p:plain
RT1052のSoM

プロジェクトの作成

まずは普通にプロジェクトエクスプローラーを起動してプロジェクトを作ります。
新規プロジェクトはIDEの左下のメニューからNew projectから行えます。

f:id:gsmcustomeffects:20190222010306p:plain
プロジェクトの作成

チップの選択画面でMIMXRT1052CVL5Bに変更するのを忘れないでください。

Nextを押してAdvanced Settingにうつります。

f:id:gsmcustomeffects:20190222013530p:plain
メモリの設定
ここではメモリの大きさとフラッシュドライバの変更を行います。
画像を参考に設定をしてください。

プロジェクトを作成したらいったんビルドしてください

f:id:gsmcustomeffects:20190222013625p:plain
ビルドの結果

ビルドしてメモリが上記のようになっていればOK

SFDPってやつですがSERIAL FLASH DISCOVERABLE PARAMETERSの略でJEDECで規定されている内部パラメータテーブルです。
これに関しては補足しておくと

今までは外部フラッシュを用いるマイコンの場合はNXPがcfxファイルを配っていた。
しかし今回からはフラッシュメモリのSFDP内部レジスタから値を読み込んでflashのサイズだったり自動で解釈してやってくれるスクリプトに変わりました。
これにより多彩な外部フラッシュを提要可能になり設計者のコスト、機能を達成することができるようになるとのことです。
詳しく知りたい方はJEDEC SFDPでググったり、flash各社のデータシートを見るといいと思います。

XIP(eXecute-In-Place)の設定

次にブートに関する設定です。
IMXRT1052の場合内部にROMを持たないため外部フラッシュからブートする必要があります。
その機能のひとつとしてXIPという機能があります。
これはRAM転送なしに外部ROMから直接実行可能にする技術です。
最近では結構多くのマイコンでこの機能が備わっているのでデータシートをいろいろ読んでみると勉強になると思います。

そんなわけでXIPを使うためにはその設定をしないといけないわけです。
設定に必要なファイルはxipってフォルダにあります。
変更しないといけないファイルは

  • evkbimxrt1050_flexspi_nor_config.c
  • fsl_flexspi_nor_boot.h

の二つです。
SDRAMもメーカーが違うのでDCD部分も変更しないといけないんですが今回は使わないのと他社製のSDRAMのdcd配列吐く方法がいまいちわかっていないのでわかったらまた追記します。

evkbimxrt1050_flexspi_nor_config.cの変更

最初は評価ボードについているHyperFlashから起動するようにコンフィグが組まれているのでそれをQspi用に変更するだけです。
FLEXSPI_LUT_SEQってのがメモリの書き込み命令だったり、WriteEnableをトグルさせてます。
この辺の命令コマンドは各社違うので自分が使いたいメモリに合わせて選んであげる必要があります。
今回のはWinbondのメモリなのでこのデータシートの22ページのコマンドテーブルみつつ何してるか確認してみてください。
https://www.winbond.com/resource-files/w25q128jv%20spi%20revc%2011162016.pdf

//const flexspi_nor_config_t hyperflash_config = {
//    .memConfig =
//        {
//            .tag = FLEXSPI_CFG_BLK_TAG,
//            .version = FLEXSPI_CFG_BLK_VERSION,
//            .readSampleClkSrc = kFlexSPIReadSampleClk_ExternalInputFromDqsPad,
//            .csHoldTime = 3u,
//            .csSetupTime = 3u,
//            .columnAddressWidth = 3u,
//            // Enable DDR mode, Wordaddassable, Safe configuration, Differential clock
//            .controllerMiscOption =
//                (1u << kFlexSpiMiscOffset_DdrModeEnable) | (1u << kFlexSpiMiscOffset_WordAddressableEnable) |
//                (1u << kFlexSpiMiscOffset_SafeConfigFreqEnable) | (1u << kFlexSpiMiscOffset_DiffClkEnable),
//            .sflashPadType = kSerialFlash_8Pads,
//            .serialClkFreq = kFlexSpiSerialClk_133MHz,
//            .sflashA1Size = 64u * 1024u * 1024u,
//            .dataValidTime = {16u, 16u},
//            .lookupTable =
//                {
//                    // Read LUTs
//                    FLEXSPI_LUT_SEQ(CMD_DDR, FLEXSPI_8PAD, 0xA0, RADDR_DDR, FLEXSPI_8PAD, 0x18),
//                    FLEXSPI_LUT_SEQ(CADDR_DDR, FLEXSPI_8PAD, 0x10, DUMMY_DDR, FLEXSPI_8PAD, 0x06),
//                    FLEXSPI_LUT_SEQ(READ_DDR, FLEXSPI_8PAD, 0x04, STOP, FLEXSPI_1PAD, 0x0),
//                },
//        },
//    .pageSize = 512u,
//    .sectorSize = 256u * 1024u,
//    .blockSize = 256u * 1024u,
//    .isUniformBlockSize = true,
//};

const flexspi_nor_config_t Qspiflash_config =
{
    .memConfig =
    {
        .tag = FLEXSPI_CFG_BLK_TAG,
        .version = FLEXSPI_CFG_BLK_VERSION,
        .readSampleClkSrc = kFlexSPIReadSampleClk_LoopbackInternally,
        .csHoldTime = 3u,
        .csSetupTime = 3u,
        .deviceModeCfgEnable = true,
        .deviceModeType = 1,//Quad Enable command
        .deviceModeSeq.seqNum = 1,
        .deviceModeSeq.seqId = 4,
        .deviceModeArg = 0x000200,//Set QE
        .deviceType = kFlexSpiDeviceType_SerialNOR,
        .sflashPadType = kSerialFlash_4Pads,
        .serialClkFreq = kFlexSpiSerialClk_100MHz,//80MHz for Winbond, 100MHz for GD, 133MHz for ISSI
        .sflashA1Size = 16u * 1024u * 1024u,//4MBytes
        .dataValidTime = {16u, 16u},
        .lookupTable =
        {
//         //Fast Read Sequence
//         [0]  = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x0B, RADDR_SDR, FLEXSPI_1PAD, 0x18),
//         [1]  = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_1PAD, 0x08, READ_SDR, FLEXSPI_1PAD, 0x08),
//         [2]  = FLEXSPI_LUT_SEQ(JMP_ON_CS, 0, 0, 0, 0, 0),
           //Quad Input/output read sequence
           [0] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0xEB, RADDR_SDR, FLEXSPI_4PAD, 0x18),
           [1] = FLEXSPI_LUT_SEQ(DUMMY_SDR, FLEXSPI_4PAD, 0x06, READ_SDR, FLEXSPI_4PAD, 0x04),
           [2] = FLEXSPI_LUT_SEQ(0, 0, 0, 0, 0, 0),
           //Read Status
           [1*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x05, READ_SDR, FLEXSPI_1PAD, 0x04),
           //Write Enable
           [3*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x06, STOP, 0, 0),
           //Write status
           [4*4] = FLEXSPI_LUT_SEQ(CMD_SDR, FLEXSPI_1PAD, 0x01, WRITE_SDR, FLEXSPI_1PAD, 0x2),
	 },
    },
    .pageSize = 256u,
    .sectorSize = 4u * 1024u,
};

fsl_flexspi_nor_boot.hの変更

flashのサイズがboard.hから呼ばれるようになっているのでそれを変更します。

f:id:gsmcustomeffects:20190222015331p:plain
フラッシュサイズの設定

クロックの設定

クロックツールを開きます。
そして先ほど作ったプロジェクトの設定をします。

f:id:gsmcustomeffects:20190222020331p:plain
クロックツールの設定

次にメインクロックを設定していきます。

f:id:gsmcustomeffects:20190222020726p:plain
クロックツールの設定2

次にグラフィカル画面にいきます。
そこでメインクロックの部分が青くハイライトされているのでいじれるとこのLOCKマークを解除して最終的なコアクロックのところに528MHz(MIMXRT1052CVL5Bでいう最大値)を入力します。

f:id:gsmcustomeffects:20190222021527p:plain
コアクロックの設定

するとツールが適切値を計算して出してくれます。(変更したくない部分がある場合はLOCKを忘れずに

f:id:gsmcustomeffects:20190222022230p:plain
設定値の確認

これでクロックの設定は終わりなので上のほうにあるUpdate Projectをクリックしてコードを吐きだします。

f:id:gsmcustomeffects:20190222022350p:plain
コードの出力

以上でクロックの設定終わりです。

実行してみる。

画像に示す点が確認できればうまく動いていることになる。

f:id:gsmcustomeffects:20190222023102p:plain
デバッグ中の様子

Advanced topic

上記の例では面白くないのでタイマー使ってLチカプログラムを動作させるまでやってみる。
PITのライブラリを追加する

f:id:gsmcustomeffects:20190222030140p:plain
PITライブラリの追加

まずはピンツールで設定をする。

f:id:gsmcustomeffects:20190222024331p:plain
GPIO1をルーティング

ピンの細かい設定

f:id:gsmcustomeffects:20190222024852p:plain
GPIOの設定

パッケージの変更

f:id:gsmcustomeffects:20190222024514p:plain
CVL5に変更

終ったらUpdate Projectをクリックして終了

クロックツールでPITクロックを設定
f:id:gsmcustomeffects:20190222032843p:plain
終ったらUpdate Projectをクリックして終了

次にペリフェラルツールでPITの設定していく。

f:id:gsmcustomeffects:20190222025630p:plain
PITの設定

コードを書く

void PIT_1_IRQHANDLER(){
	GPIO_PortToggle(GPIO1, 1u << 9U);
	PIT_ClearStatusFlags(PIT, kPIT_Chnl_0,kPIT_TimerFlag);
}
int main(void) {

  	/* Init board hardware. */
    BOARD_InitBootPins();
    BOARD_InitBootClocks();
    BOARD_InitBootPeripherals();
  	/* Init FSL debug console. */
    BOARD_InitDebugConsole();

    PRINTF("Hello World\n");

    /* Force the counter to be placed into memory. */
    volatile static int i = 0 ;
    /* Enter an infinite loop, just incrementing a counter. */
    while(1) {
        i++ ;
    }
    return 0 ;
}

あとはLチカしてたらOK

参考

gsmcustomeffects.hatenablog.com

gsmcustomeffects.hatenablog.com

別のタイマーでもできるのでGPTについて知りたい方はこれ
gsmcustomeffects.hatenablog.com