LPC810メモ:SCTの小さい例(Lチカ2本)

SCTをとにかく使ってみる例。

前提とする環境はこちら→LPC810メモ 共通の準備
SCT全般のメモはこちら→LPC810メモ:SCTimer/PWM (SCT)について

サンプルコード

#include "LPC8xx.h"

int main(void) {
    //  SWMのclockを有効化
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<7);

    //  8番pin(PIO_0)にSCT出力の0番(CTOUT_0) を設定
    //  4番pin(PIO_2)にSCT出力の1番(CTOUT_1) を設定
    //  UM10601 9.5.7 Pin assign register 6
    //  UM10601 9.5.8 Pin assign register 7
    LPC_SWM->PINASSIGN6 = 0x00ffffffUL;
    LPC_SWM->PINASSIGN7 = 0xffffff02UL;

    // RESET 以外の無効化
    LPC_SWM->PINENABLE0 = 0xffffffbfUL;

    // UM10601 10.3 Basic configuration
    // に従って、SCTの準備
    //  SCTのclockを有効化(UM10601 4.6.13 System clock control register)
    LPC_SYSCON->SYSAHBCLKCTRL |= (1<<8);

    // Clear the SCT peripheral reset using the PRESETCTRL register (Table 19).
    LPC_SYSCON->PRESETCTRL &= ~(0x1<<8);
    LPC_SYSCON->PRESETCTRL |= (0x1<<8);

    //. The SCT combined interrupt is connected to slot #8 in the NVIC.
    //. -> 割り込みは使わないから省略

    // . Use the switch matrix to connect the SCT inputs and outputs to pins
    // (see Section 10.4) and internally (see Section 10.5).
    // -> SWMの設定。これは上でやった。

    // 以下、SCTの設定
    // UM10601 10.6.1 SCT configuration register
    LPC_SCT->CONFIG =
           (1 << 0)   // UNIFY = 1 -> 32bit一本で利用する
        |  (1 << 17); // AUTOLIMIT_L = 1 -> matchの0番(後で定義)を、カウントアップの上限とする

    // カウンタにmatchする値を定義
    // UM10601 10.6.20 SCT match reload registers 0 to 4 (REGMODEn bit = 0)
    LPC_SCT->MATCHREL[0].U = 12000000; // クロック12MHzだから1秒 -> 0番とする。
    LPC_SCT->MATCHREL[1].U = 6000000; //   同じく0.5秒 -> 1番とする。
    // AUTOLIMIT_L = 1としてるから、0番の方で自動的に0リセットかかる。

    // 以下、eventの定義
    // UM10601 10.6.22 SCT event state mask registers 0 to 5
    // UM10601 10.6.23 SCT event control registers 0 to 5

    // event0番(match 0、1秒に対応して発生)
    LPC_SCT->EVENT[0].STATE = 0x01; // state0で発生
    LPC_SCT->EVENT[0].CTRL =
         (0 << 0)    // MATCHSEL = 0 -> match 0に対応
      |  (1 << 12);  // COMBMODE = 1 -> match だけに対応

    // event1番(match 1、0.5秒に対応して発生)
    LPC_SCT->EVENT[1].STATE = 0x01; // state0で発生
    LPC_SCT->EVENT[1].CTRL =
         (1 << 0)    // MATCHSEL = 1 -> match 1に対応
      |  (1 << 12);  // COMBMODE = 1 -> match だけに対応

    // 以下、イベントに応じた出力の定義
    // UM10601 10.6.24 SCT output set registers 0 to 3
    // UM10601 10.6.25 SCT output clear registers 0 to 3

    // 出力0番
    LPC_SCT->OUT[0].SET = (1 << 0); // event 0 でset
    LPC_SCT->OUT[0].CLR = (1 << 1); // event 1 でclear

    // 出力1番
    LPC_SCT->OUT[1].SET = (1 << 1); // event 0 でset
    LPC_SCT->OUT[1].CLR = (1 << 0); // event 1 でclear

    // 以上で設定完了、haltを解除してstart
    /// UM10601 10.6.2 SCT control register
    LPC_SCT->CTRL_U &= ~(1 << 2);  // HALT_L = 0

    return 0 ;
}

接続

  • 8番と4番につないだLEDが順番に点滅する。

補足/雑感

  • 最小限の例にしようかと思ったが、LED1個点滅させてるだけだと飽きてきたので、2個にしてみた。
  • 最初は5番pinを使っていたが、5番は電源on時にLOWだとISPモードに入るので、GNDにつながる形にしておくと問題が起こる模様。

みっかぼの無料Androidアプリはこちら。