ガレスタさんのDIY日記

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

IMXRT1050 Periodic Interrupt Timer 基礎編

Twitterなどでリンクハイライト表記になってしまうので今回からIMXって表記に変えました。
RT1050で検索されれば引っかかるので特に問題ないでしょう。

PIT(Periodic Interrupt Timer)

Periodic(周期的な)タイマーです。
Kinetisの頃からあったペリフェラルなのでそちらに慣れている方は問題ないでしょう

まとめると

  • DMA,割り込み生成可能
  • 独立タイマー
  • IO連携機能はなし(単純な内部カウンタのみをもつため理解しやすい)
  • タイマチェイン機能(連結)

その他面白いなとおもったのは動作させたままcounter periodの変更をできる点ですかね
f:id:gsmcustomeffects:20180205223116p:plain

SDKを見た感じPITは0~3の4つ使えるらしい

Tips(簡単な説明)

とりあえずデータシートにはexampleコンフィグが書いてある。

  1. MCR[MDIS]ビットを0にしてモジュールを無効にする。
  2. LDVAL registerを設定する
  3. TCTRL1[TIE]を設定して割り込みを有効
  4. TCTRL1[TEN]を1にしてタイマースタート

LDVALのセット値の決め方だが
リファレンスマニュアルではモジュールクロックが50MHz前提で説明している。
LDVAL trigger = (period / clock period) -1

ClockPeriod = 50MHz = 20nS

Period = 任意msec(5.12msecにした)

これで計算すると255999(0x0003E7FF)になる。

あとはTIE,TENを設定するだけ。
これだとレジスタセット前提になるのでSDKでのやり方を書いてく。

当ブログではまだCCMの説明してないのでクロックの設定は割愛させてください
普通に説明できるんだけどレジスタに0x形式で直接代入する脳筋SDKなので解説しても何も得はない。

SDKでの設定例

  1. PITの構造体の初期化
  2. Clockセット
  3. Init
  4. Period設定
  5. 割り込み設定
  6. タイマースタート

PIT構造体の初期化

pit_config_t pitConfig;

ぶっちゃけメンバが一個しかいないのでこれいるのか説
f:id:gsmcustomeffects:20180205232934p:plain

Clock

クロックはAPIがあるのでそれを使う

    CLOCK_SetMux(kCLOCK_PerclkMux, 1U);
    CLOCK_SetDiv(kCLOCK_PerclkDiv, 0U);

init

Initも簡単

先ほどの構造体にデフォルト値を取得してセット

PIT_GetDefaultConfig(&pitConfig);

InitAPIをコール

PIT_Init(PIT, &pitConfig);

第一引数はPITだがこいつはレジスタのベースアドレスなのでこう書けばOK
モジュール番号はあとで設定する

Period設定

カウンタもAPIがある

PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, USEC_TO_COUNT(5120U, CLOCK_GetFreq(kCLOCK_OscClk)));

baseアドレスとタイマーチャンネルとピリオドの背定をしている。
ここでUSEC_TO_COUNTとあるがただのマクロなので特に難しくない

#define USEC_TO_COUNT(us, clockFreqInHz) (uint64_t)((uint64_t)us * clockFreqInHz / 1000000U)
  • us : タイマーの割り込み周期uSec
  • clockFreqInHz : タイマーのモジュールクロック

普通にこういうマクロがあるので特に計算する必要もなく自動計算されてセットしてくれる。

割り込み設定

PIT_EnableInterrupts(PIT, kPIT_Chnl_0, kPIT_TimerInterruptEnable);
EnableIRQ(PIT_IRQn);

モジュール側の割り込み有効とCMSISAPIでの割り込み有効をしているだけ

タイマースタート

スタートはAPI呼ぶだけ

PIT_StartTimer(PIT, kPIT_Chnl_0);

実行してみる

あとは普通にハンドラの定義してブレークがかかればOKだ

f:id:gsmcustomeffects:20180206000007p:plain

まとめ

PITの使い方を理解した。
かなり単純な仕組みなので初心者が扱うタイマーとしてはかなり良いと思う。

今後はGPTや高機能タイマーもやっていきたい