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 ; }
補足/雑感
- 最小限の例にしようかと思ったが、LED1個点滅させてるだけだと飽きてきたので、2個にしてみた。
- 最初は5番pinを使っていたが、5番は電源on時にLOWだとISPモードに入るので、GNDにつながる形にしておくと問題が起こる模様。