がれすたさんのDIY日記

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

2019年版 STM32環境構築方法

以前よりSTM32について結構な数の記事を書いてきました。
最近ではAtollicTrueStudioが無料になったり、CubeMXが5.0になったり
いろいろ変わった経緯もあり2019年版と題して新しく書いたほうが良いのでは?となったわけです。

そんなわけで僕なりの2019年度版環境構築を書いてみたという記事です。


目次的なやつ

AtollicTrueStudioのインストール

まずIDE統合開発環境)についてですがAtollicTrueStudioを使うのでそれのインストールをしていきます。
Macの人はSW4STM32しかないけど・・・Eclipseなので同じように進めればいいと思う。

atollic.com

上記のサイトに行き、ダウンロードしてもらってあとはインストールしてもらえればいいと思う

CubeMXのインストール

STM32にはマイコンを楽に使うためのライブラリ群がありSTはそれをCubeFxx(xxは数字F7ならCubeF7のような感じ)と呼んでいる。
んでそいつを内包しGUIペリフェラルを設定するためのツールとしてCubeMXというものを提供している。

www.st.com

ページの下のほうにダウンロードリンクがあるのでダウンロードする(登録が必要だったはず
んでインストール

STM32CubeProgのインストール

以前STM32Utilityとして提供していたものとその周辺のソフトが一体になった書き込みソフトとしてSTM32CubeProgが新しく提供された
デバッガとつながらくなった時に何かと便利なのでこれも入れておくのがいいでしょう

www.st.com


評価ボードを買う

次に実際に動かすハードウエアの話
STM32では格安評価ボードとしてNucleoというプラットフォームを提供している。

f:id:gsmcustomeffects:20190311010721p:plainf:id:gsmcustomeffects:20190311010644p:plainf:id:gsmcustomeffects:20190311010616p:plain
STM32 評価ボード

もちろんNucleo以外にもEVALボードやDiscoveryボードというものを用意しているがどちらかというともとからできる人向けのプラットフォーム感がある。

そんなわけで何でもいいんで好きなNucleoボードを買ってください

僕は秋月でも買えるしブレッドボードでも使えるSTM32F303K8をチョイスしてこれで説明していきます。
STM32 Nucleo Board STM32F303K8: マイコン関連 秋月電子通商-電子部品・ネット通販

CubeMXを起動する。

ここからが実際の作業です

起動するとこの画面が出てきます
f:id:gsmcustomeffects:20190311020003p:plain

Access to board selectorをクリックしてくださいそうするとこの画面が開きます。

f:id:gsmcustomeffects:20190311020131p:plain
ボードセレクト画面

次に303K8を探して選ぶとこの画面になると思います。

f:id:gsmcustomeffects:20190311020558p:plain
ボードインフォメーション

そうしましたら赤枠のStartprojectをクリックして進みます。

そうするとこういう画面が出てきます

f:id:gsmcustomeffects:20190311021026p:plain
基本画面

今回はLEDをちかちかしてみたいと思うのでピンの設定をしていきます。
PB3をアウトプットに設定、デバッグピンも設定

f:id:gsmcustomeffects:20190311024446p:plain
ピンの設定

ここでPB3に設定しているのはボード上のLEDを光らせる為です

f:id:gsmcustomeffects:20190312220730p:plain
Nucleo32の回路図(UM1956)

次にクロックの設定です。
まあ初期設定でも動くには動くんですがせっかくやるのでいじり方だけでも覚えておきましょう。
ここではメインクロックを64MHzにしています。

f:id:gsmcustomeffects:20190311021627p:plainf:id:gsmcustomeffects:20190311021923p:plain
クロックの設定(クリックで拡大できます)

次にプロジェクトの設定をします

f:id:gsmcustomeffects:20190311022511p:plainf:id:gsmcustomeffects:20190311022445p:plain
プロジェクトの設定

次にGenerateCodeをクリックしてコードを出力してください
上手くできていればこんな感じにファイルができているはずです
f:id:gsmcustomeffects:20190311023102p:plain

Atollic TrueStudioを起動する。

そうしましたら次はAtollicTrueStudioを起動します。

そして上部メニューからFile/インポートを選択し先ほど作ったプロジェクトをインポートする。

まずはプロジェクトをビルドする

f:id:gsmcustomeffects:20190311023705p:plain
プロジェクトのビルド

ビルドに成功しましたらコード追加します

f:id:gsmcustomeffects:20190311024815p:plain
コードの記述

次にデバッグボタンをクリックします。

f:id:gsmcustomeffects:20190311024922p:plain
デバッグボタンのクリック

そうすると画面が切り替わります。
画像に従ってブレークポイントを設定してあげてプログラムを進めるボタンを押してあげれば500msごとにプログラムが止まりボード上のLD3が光ったり消えたりすると思う
f:id:gsmcustomeffects:20190311025250p:plain

以上で入門は終了!

所感

2019年版の入門を書いたけど日に日にまじで楽になってるね。

軽いQ&A
Q:自分でチップ買ってきてそれに対して書き込むにはどうしたらよいの?
A:別途デバッガが必要です。

語弊があるので補足しておくとNucleo64やNucleo144はSTLINKV2-1ってのがついてるんで外部チップに向けてもデバッグしたり書き込んだりできる。

Q:どんなデバッガがあるの?おすすめは?
A:STLINKV2かV3

2018年まではSTLINKV2が主流だったけど2019年になってV3が出たので今はこれがお勧めです。

f:id:gsmcustomeffects:20190311030017p:plain
STLINKV3

ARMマイコンなので別のメーカー製のでも書き込みやデバッグはできますがSTM32CubeProgが使えるの考えると純正がいいです。

Q:STM32CubeProgは何が出来んの?
A:デバッガのファームウエアをアップデートしたり、書き込みしたりその他オプションをいじったりできます

繋いだ時こんな感じです
f:id:gsmcustomeffects:20190311030334p:plain

Q:他参考になる情報とかは?
A:僕のまとめサイトペリフェラルの説明はしてます

結構前にかいた記事もあるので適宜読み替えてくれればいいと思います。
開発環境の使い方は変わったけどAPIレベルではそんなに変わってないので以下のサイトは役立つはず

gsmcustomeffects.github.io

MIMXRT10xx series dcd table Tips part2

前回は解釈の仕方を書いたので今回はクロックに絞って全容をつらつら書く感じ。
ぶっちゃけ前回の記事で必要なことは書いたのでこれは読みたい人が読んでくれればいい。そんなmini tips的なやつ

本記事の環境は以下の通りです。

  • MIMXRT1050-EVK
  • SDK ver 2.5

クロックの設定

DCD tableを先頭から見ていくとdcd tableの0x09 ~ 0x57 bytes でクロック設定をしている。

dcd byte reg address reg name value
0x09~0x0F 0x400FC068 CCM_CCGR0 0xFFFFFFFF
0x10~0x17 0x400FC06C CCM_CCGR1 0xFFFFFFFF
0x18~0x1F 0x400FC070 CCM_CCGR2 0xFFFFFFFF
0x20~0x27 0x400FC074 CCM_CCGR3 0xFFFFFFFF
0x28~0x2F 0x400FC078 CCM_CCGR4 0xFFFFFFFF
0x30~0x37 0x400FC07C CCM_CCGR5 0xFFFFFFFF
0x38~0x3F 0x400FC080 CCM_CCGR6 0xFFFFFFFF
0x40~0x47 0x400D8030 CCM_ANALOG_PLL_SYS 0x00002001
0x48~0x4F 0x400D8100 CCM_ANALOG_PFD_528 0x001D0000
0x50~0x57 0x400FC014 CCM_CBCDR 0x00010D40

DCD tableにおけるクロックの設定を書きだすとこんな感じ

そしてこのTipで操作するクロックを示すとこんな感じ

f:id:gsmcustomeffects:20190301020411p:plain
本記事で操作する部分を示した図

CCM_CCGR(CCM Clock Gating Register)

CCM_CCGR0~CCM_CCGR6はクロックゲートレジスタのことで各モジュールのクロックを個別にON/OFFできる。
モジュールごとに2bit設けられてて設定値による効果は以下の画像の通り

f:id:gsmcustomeffects:20190228004604p:plain
Clock Activity Description

MIMXRT10xxの場合ペリフェラルが大量にあるので少し大変だがDCDでは全部ONにしているみたい。
except STOP modeとあるのでSTOPモード以外でクロックはONである。

CCM_ANALOG_PLL_SYS(Analog System PLL Control Register)

次にCCM_ANALOG_PLL_SYSの部分を見ていく

f:id:gsmcustomeffects:20190228020449p:plain
CCM_ANALOG_PLL_SYS
f:id:gsmcustomeffects:20190228020624p:plain
CCM_ANALOG_PLL_SYSn field descriptions

DCDtableにおけるセット値は0x00002001である。

ビットごとに分解してみていくと

BYPASSビットが0なのでPLLのバイパスはしないすなわちPLLを使用する設定。
BYPASS_CLK_SRCが00なので24MHzオシレータを使用する。
ENABLEが1なのでPLL出力が有効
DIV_SELECTが1なのでFout=Fref*22となる。

ここでCCM_ANALOG_PLL_SYS_NUMおよびDENOMというレジスタがあるがノーケアのためPOR(Power On Reset)初期値が使われFref * (22+(0/18))となり結局528MHzとなる。

この項で操作してるモジュールを示すとこんな感じ

f:id:gsmcustomeffects:20190301025840p:plain
CCM_ANALOG_PLL_SYS関連モジュール

CCM_ANALOG_PFD_528(528MHz Clock (PLL2) Phase Fractional Divider Control Register)

次にCCM_ANALOG_PFD_528を見ていく
PFDクロック生成のための設定をするレジスタで、fractional dividerの設定などができる。

bitごとの概要を以下の画像に示す。

f:id:gsmcustomeffects:20190301011808p:plain
CCM_ANALOG_PFD_528n register definition

PFDx_CLKGATEは1でOFF,0でON
PFDx_STABLEはread only bitで診断専用ビット。fractional dividerが有効になると値が反転する。
PFDx_FRACはfractional dividerの値

528*18/PFDx_FRAC where PFDx_FRAC is in the range 12-35.とあるので12~35の値を入れればいい

DCDtableにおけるセット値は0x001D0000であるためPFD2の部分をセットしてることになる。

field name[bit] set value description
PFD2_CLKGATE[23] 0b0 PFD2の有効
PFD2_STABLE[22] 0b0 read onlyのため関係ない
PFD2_FRAC[21-16] 0b011101 PFDx_FRAC =29

これで 528*18/29 = 327.72[MHz]となる。

CCM_CBCDR(CCM Bus Clock Divider Register)

最後にCCM Bus Clock Divider Registerについてである。
SEMCモジュールに一番近い部分のブロックでありクロックセレクトおよび分周器の設定が可能

f:id:gsmcustomeffects:20190301212223p:plain
CCM_CBCDR field descriptions


見たところ7種類ぐらい設定できるとこがある。
操作可能な部分を図で示すと以下の画像のようになる。

赤で示した部分がコア関連のクロック設定。
青で示す部分がSEMC関連。

f:id:gsmcustomeffects:20190301212508p:plain
CCM_CBCDRで操作可能なモジュール

DCD tableにおける設定値は0x00010D40となっている。

これもビットごとに分解して見ていこう

field name[bit] set value description
Reserved[31-30] 0b00 none
PERIPH_CLK2_PODF[29-27] 0b000 000なのでdivide by 1
Reserved[26] 0b0 none
PERIPH_CLK_SEL[25] 0b0 0なのでpre_periph_clk_selをセレクト
Reserved[24-19] 0b000000 none
SEMC_PODF[18-16] 0b001 001なのでdivide by 2
AHB_PODF[12-10] 0b011 011なのでdivide by 4
IPG_PODF[9-8] 0b01 01なのでdivide by 2
SEMC_ALT_CLK_SEL[7] 0b0 0なのでPLL2 PFD2がSEMC root clockとして使われる
SEMC_CLK_SEL[6] 0b1 1なのでSEMC alternative clock がSEMC clock root
Reserved[5-0] 0b000000 none

ここで上のほうは無視するとしてSEMCを見ていきます。
SEMC_ALT_CLK_SELでPLL2 PFD2、SEMC_CLK_SELでSEMC alternative clockとあるのでこのように選ばれます。

f:id:gsmcustomeffects:20190301230521p:plain
セレクターの動き

SEMC_PODFがdivide by 2なので327.72/2 = 163.86MHzとなる。
SEMCのスペックは166MHzなのでほぼ最大値でセットされるということがわかる。

f:id:gsmcustomeffects:20190301230336p:plain
SEMCのスペック

これでクロックの設定は終了。
冒頭にあるようにそのまま全容をつらつら書きましたがいかがでしたか?

正直起動関連部分なのでこういうのは公式が書いてほしいものですが
本記事で少しでも力になれれば幸いという感じです。

もちろんDCDは1000byte近くあるのでこの後にピン設定などが続きますので今後はそれを書いていこうと思います。

memo

クロックのPower modeには

  • RUN mode
  • WAIT mode
  • STOP mode

がある

詳細についてはリファレンスマニュアルのChapter 13 Clock Controller Module (CCM)を参照

ref

MIMXRT1050のリファレンスマニュアルの

  • Chapter 13 Clock Controller Module (CCM)
  • Chapter 23 External Memory Controllers
  • Chapter 24 Smart External Memory Controller

MIMXRT10xx series dcd table Tips part1

MIMXRT10xxシリーズは内部ROMを持たないわけで起動するのにひと手間かかる。

MIMXRT10xxにはIVT(image ventor table)なるものがあってそいつを設定してあげる必要がある。
そうすることで内部ROMのブートローダー(IMXRTの内蔵ブートローダーのこと)が値を解釈して起動およびそれに必要なペリフェラルの初期化をやってくれる。

f:id:gsmcustomeffects:20190224004034p:plain
Image Vector Table

主な設定はSDKが行ってくれるのだがいくつかはユーザーがケアしないといけない部分もある。
以下に示す2つがおおまかにユーザーケアが必要な部分である。(評価ボードを使う場合何もいじらなくていい

  • 外部フラッシュの初期化
  • 外部SDRAM制御用のSEMCコントローラレジスタセット

評価ボードにない外部フラッシュを使う場合オペレーションコマンドが互換の場合は容量のセットだけでよいが違う場合はフラッシュコンフィグをいじらないといけない。
フラッシュコンフィグに関しては以下の記事でも触れているしNXP Communityで同様な質問がいくつかあるのでそちらを参考にするといいだろう
gsmcustomeffects.hatenablog.com


同様にSDRAMもそうでチップによって容量も違えば動作条件も違う
SDRAMの場合はDCD(Device Configuration Data)テーブルをセットすることで起動時に必要なSEMCレジスタをセットする事が可能である。
SDRAMに関数を配置したり、SDRAM上に変数を配置したりする場合この機能を使うことで実現可能である。
そんなわけで今回はDCDに特化してTipsをまとめる。

DCD(Device Configuration Data )

Upon reset, the chip uses the default register values for all peripherals in the system.
However, these settings typically are not ideal for achieving the optimal system performance and there are even some peripherals that must be configured before they can be used.
The DCD is a configuration information contained in the program image (external to the ROM) that the ROM interprets to configure various peripherals on the chip.
For example, some components (such as SDRAM) require some sequence of register programming as a part of the configuration before it is ready to be used. The DCD featurecan be used to program the SEMC register to the optimal settings.

  • リセットされると、チップはシステム内のすべての周辺機器に対してデフォルトのレジスタ値を使用する。
  • 実際には初期レジスタ値の使用は最適ではない可能性がある。
  • SDRAMのようなコンポーネントでは一連の設定レジスタが必要である。
  • DCDはプログラムイメージ(ROMの外部)に含まれる構成情報である。

説明はこのぐらいにして実際のサンプルを見てみると

f:id:gsmcustomeffects:20190224010523p:plain
evkbimxrt1050_sdram_ini_dcd.cの一部

すげーわかりにくい

NXP本家もそういった設定ツール用意してないから自分用ってことで解釈の仕方をメモしておきます。

コマンドの種類

というわけでバイト列を解釈するためにコマンドの解説をします。
コマンドには

  • Write Command
  • Check Command
  • NOP Command

の3つがあります。

Write Command

格納はビッグエンディアンです。

f:id:gsmcustomeffects:20190224011035p:plain
Write command format

f:id:gsmcustomeffects:20190224011529p:plain
parameter format

f:id:gsmcustomeffects:20190224011623p:plain
flag format

  • TAG : 0xCC
  • length : 2byte(big endian)
  • parameter : 1byte(flag[7-3],byte[2-0])
  • Address : 4byte(registerのアドレス)
  • value : 書き込む値(or bitマスク)

flagだけ特殊で3bit目がMask、4bit目がSetを意味する。

Check Command

f:id:gsmcustomeffects:20190224011842p:plain
Check command format

f:id:gsmcustomeffects:20190224011913p:plain
parameter format

f:id:gsmcustomeffects:20190224011935p:plain
flag format

  • TAG : 0xCF
  • length : 2byte(big endian)
  • parameter : 1byte(flag[7-3],byte[2-0])
  • Address : 4byte(registerのアドレス)
  • Mask : bitマスク
  • count : オプションのカウント数

カウントが指定されていない場合、このコマンドは終了条件が満たされるまで無期限にポーリングします。 count = 0の場合、このコマンドはNOPと同じように動作します。

NOP Command

f:id:gsmcustomeffects:20190224012419p:plain
NOP Command format

  • TAG : 0xC0
  • length : 2byte(big endian 4に固定)
  • Undefined: 1byte なんでもいい

実際に読み進めていく

/*
 * Copyright 2017 NXP
 * All rights reserved.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#include "evkbimxrt1050_sdram_ini_dcd.h"

/* Component ID definition, used by tools. */
#ifndef FSL_COMPONENT_ID
#define FSL_COMPONENT_ID "platform.drivers.xip_board"
#endif

#if defined(XIP_BOOT_HEADER_ENABLE) && (XIP_BOOT_HEADER_ENABLE == 1)
#if defined(XIP_BOOT_HEADER_DCD_ENABLE) && (XIP_BOOT_HEADER_DCD_ENABLE == 1)
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) || defined(__GNUC__)
__attribute__((section(".boot_hdr.dcd_data")))
#elif defined(__ICCARM__)
#pragma location = ".boot_hdr.dcd_data"
#endif
/*************************************
 *  DCD Data
 *************************************/
const uint8_t dcd_data[] = {
    /*0000*/ DCD_TAG_HEADER,
    0x04,//length
    0x30,//length
    0x41,//version

    0xCC,//write command
    0x03,//length
    0xAC,//length -> 940byte
    0x04,//param
    0x40,//add[31-24]
    0x0F,//add[23-16]
    0xC0,//add[15-8]
    0x68,//add[7-0]     -> (0x400FC068) -> CCM Clock Gating Register 0 (CCM_CCGR0)
    0xFF,//レジスタの値もbig endianで格納
    0xFF,
    0xFF,
    0xFF,

    /*0010*/ 0x40,//add[31-24]
    0x0F,//add[23-16]
    0xC0,//add[15-8]
    0x6C,//add[7-0]      -> (0x400FC06C) -> CCM Clock Gating Register 1 (CCM_CCGR1)
    0xFF,
    0xFF,
    0xFF,
    0xFF,


//このあと900byteぐらい続くけどあとは略
};
#else
/*************************************
 *  DCD Data
 *************************************/
const uint8_t dcd_data[] = {0x00};
#endif /* XIP_BOOT_HEADER_DCD_ENABLE */
#endif /* XIP_BOOT_HEADER_ENABLE */

最初の4byteはDCDタグとdcdの全体のテーブル長さ、versionを表している

num data description
1 0xD2 DCD_TAG
2 0x04 length
3 0x30 length
4 0x41 version

lengthからdcd tableは0x430(1072bytes)の長さであるとわかる。

次が

num data description
1 0xCC write command
2 0x03 length
3 0xAC length
4 0x04 parameter
5 0x40 add[31-24]
6 0x0F add[23-16]
7 0xC0 add[15-8]
8 0x68 add[7-0]
9 0xFF value
10 0xFF value
11 0xFF value
12 0xFF value


コマンドはwrite command
長さは0x3AC(940bytes)
書き込みアドレスはCCM Clock Gating Register 0 (CCM_CCGR0)(0x400FC068)
であるとわかる。

リセット値が0xFFFFなのでそのままってことになる。

f:id:gsmcustomeffects:20190225210816p:plain
CCM_CCGR0
940bytesとあるので、あとは連続してaddress,valueが続いていく感じ。

見た感じクロックに関するレジスタを順繰りに設定していって最後の方でSEMCのレジスタいじってCheck Command を送っている感じ。
興味のある方がいたら例に従って見ていくといいだろう。

MCUXpressoIDE ライブラリ変更方法(ex. redlib->newlib)

library変更もProject setting項目からできる

f:id:gsmcustomeffects:20190223154025p:plain
libraryの変更

プロジェクトのsetting画面からもできる(プロジェクトを右クリック->propertyをクリック)

f:id:gsmcustomeffects:20190223154559p:plain

newlibを使うとmalloc関連もできる。

f:id:gsmcustomeffects:20190223154117p:plain
malloc.hの利用

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