ガレスタさんのDIY日記

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

IMXRT1050 Periodic Interrupt Timer : タイマーのチェイン

今回もタイマーの記事です。
PITの基礎に関しては前回のここを読んでいただければいいかと思います。

gsmcustomeffects.hatenablog.com


今回はTimer0とTimer1をチェインさせて長めのインターバルを作っていこうと思います。

When a timer has chain mode enabled, it will only count after the previous timer has expired. So if timer n-1 has counted down to 0, counter n will decrement the value by one. This allows to chain some of the timers together to form a longer timer. The first timer (timer 0) cannot be chained to any other timer.

原文より引用

  • Timer0のカウンタが0になったらTimer1のカウンタを一個下げていく
  • チェイン可能なのは自分の一個下のタイマーのみ(Timer0は不可)

やっていく

前回とあんましやることは変わらずです。
タイマーを一個増やしてホスト側のタイマーでチェインを有効にしてあげるだけです。
ざっと主要コードを示します。

    pit_config_t pitConfig;
    PIT_GetDefaultConfig(&pitConfig);
    PIT_Init(PIT, &pitConfig)
    PIT_SetTimerPeriod(PIT, kPIT_Chnl_1, 49U);//Timer0 100msec*50回分のカウントで割り込み=5sec
    PIT_EnableInterrupts(PIT, kPIT_Chnl_1, kPIT_TimerInterruptEnable);
    PIT_SetTimerChainMode(PIT, kPIT_Chnl_1, 1);//enable = 1
    EnableIRQ(PIT_IRQn);
    PIT_StartTimer(PIT, kPIT_Chnl_1);
    PIT_SetTimerPeriod(PIT, kPIT_Chnl_0, USEC_TO_COUNT(100000U, PIT_SOURCE_CLOCK));
    PIT_StartTimer(PIT, kPIT_Chnl_0);

やってることをまとめると

  1. Timer1のカウンタ設定(ホスト側なので50程度)
  2. Timer1の割り込みを有効
  3. Timer1でチェインを有効
  4. CMSIS_APIにて割り込みを有効
  5. Timer1をスタート
  6. Timer0のカウンタを設定(100msec)
  7. Timer0をスタート

Timer0(100msec)*Timer1(50カウンタ)なので5000msecで割り込みが生成されます。
見れば分かる通りにTimer1のカウンタにかなり余裕があるので1分とか作れると思います。(用途は色々あると思うがEEPROMの自動保存とかにいいかもしれない)

実行例

数秒待って手動ブレークするとちゃんとTimer1がそれっぽい値になっている
f:id:gsmcustomeffects:20180210002247p:plain

f:id:gsmcustomeffects:20180210002258p:plain

すすめてまってると割り込みハンドラにもきちんと入る

f:id:gsmcustomeffects:20180210002354p:plain

まとめ

PITのチェイン機能を試すことができた。
長時間インターバルを構成可能になった

補足

タイマーのチャンネルは

typedef enum _pit_chnl
{
    kPIT_Chnl_0 = 0U, /*!< PIT channel number 0*/
    kPIT_Chnl_1,      /*!< PIT channel number 1 */
    kPIT_Chnl_2,      /*!< PIT channel number 2 */
    kPIT_Chnl_3,      /*!< PIT channel number 3 */
} pit_chnl_t;

この中から選べる。(チェインは1,2,3のみ有効