LPC810メモ:SCTimer/PWM (SCT)について

SCTimer/PWM (SCT)という高機能タイマはLPC810の特徴的な機能らしい。ベテランな方々のブログを見ると、高機能すぎて使いにくいという評価の模様。

こういうのを使えたらかっこいい気がするので、ちょっとがんばってみたい。
まずはユーザマニュアル(UM10601)を見て、何ができる機能なのか書き出してみる。

  • 基本的にはタイマである。クロックに従ってカウントアップされていき、上限に達したら0リセットされる。
  • 「上限に達したら0リセット」の他にも、「上限に達したら逆にカウントダウンされて0に戻る」という、「bidirectionalモード」も選択できる。
    • 10.6.2 SCT control register -> BIDIR_[LH]
  • 「1クロックで1カウントアップ」でなく「nクロックで1カウントアップ」に設定することもできる。
    • 10.6.2 SCT control register -> PRE_[LH]
  • 32bitのタイマ1本としても使えるし、16bitのタイマ2本(H/Lに分割)して使うこともできる。
    • 10.6.1 SCT configuration register -> UNIFY
  • SWMを使って、入力pin最大4本と、出力pin最大4本に対応付けることができて、後述するeventにて利用することができる。
    • 10.4 Pin description
    • 9.5.6 Pin assign register 5
    • 9.5.7 Pin assign register 6
    • 9.5.8 Pin assign register 7
  • 「event」を6個まで定義できる。eventは、指定された条件で発生し、指定された処理を起こす。
  • eventの発生条件には、以下のようなものを指定できる。複数組み合わせも可能。
    • カウンタが指定された値にmatchした場合(matchは5個まで定義できる)
      • 10.6.18 SCT match registers 0 to 4 (REGMODEn bit = 0)
      • 10.6.20 SCT match reload registers 0 to 4 (REGMODEn bit = 0)
      • 10.6.23 SCT event control registers 0 to 5 -> MATCHSEL
    • 入力pin(たぶん出力pinも)の状態が指定されたパターンになった場合
      • 10.6.23 SCT event control registers 0 to 5 -> OUTSEL,IOSEL,IOCOND
  • eventの結果としては、以下のような処理を指定できる。
    • 出力pinのset,clear
      • 10.6.24 SCT output set registers 0 to 3
      • 10.6.25 SCT output clear registers 0 to 3
    • カウンタの0リセット(またはカウントダウンへの方向転換)
      • 10.6.3 SCT limit register
    • タイマをstart、stop、halt
      • 10.6.4 SCT halt condition register
      • 10.6.5 SCT stop condition register
    • 割り込みを発生させる
      • 10.6.14 SCT flag enable register
    • eventが発生した瞬間のカウンタの値を記録する
      • 10.6.19 SCT capture registers 0 to 4 (REGMODEn bit = 1)
      • 10.6.21 SCT capture control registers 0 to 4 (REGMODEn bit = 1)

上記の機能の一部を使えば、PWMが容易に実現できるので、SCTimer/PWMと呼んでいるらしい。
たとえば、0から100までカウントアップするように設定し、50にmatchしたら出力pinをset、100にmatchしたら出力pinをclearするようにeventを設定する。すると、周期的にhigh/lowが切り替えられることになるので、PWMとして機能する。

なお、上記で挙げた他に「state」というものがある。

  • 「state」というレジスタがあり、0または1の値を取る。
    • 10.6.8 SCT state register
    • LHそれぞれ5bitあるが、多分0または1以外を設定すべきでない。理由は次。
  • 前述のeventは、実は指定されたstate値の時しか発生しない。
    • 10.6.22 SCT event state mask registers 0 to 5
    • 0,1の場合に発生する/しないを指定できる。2以上の場合に発生するようには指定できない模様なので、stateは0,1以外を設定すべきでない。
  • eventが発生条件した場合に、stateを変更することができる。
    • 10.6.23 SCT event control registers 0 to 5 -> STATELD,STATEV

これにより、state = 0 or 1の2状態からなる簡易的なステートマシンを構成することができる。

2状態だと限定されすぎている気がするが、AN11538の「Table 1. SCTimer/PWM resources for each family」によると、上位のMCUであれば、stateの5bitすべてを使った32状態の本格的なステートマシンを作れる模様。

次回からサンプル作る。

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