Seeeduino XIAO (ATSAMD21G18) のTCライブラリ

TCライブラリを作ってみた。

Timer/Counter/PWM/Captureなどの機能がある。イベント連携でタイマーの起動ができ、EICとイベント連携するとGPIO入力信号のカウントやパルス幅計測なども可能だ。PWM出力ではカウンタにより出力ピンが決まるためカウンタIDを指定して割り当てするしかないが、PWM出力以外の用途なら任意の未使用カウンタを割り当てて利用することができるようになっている。

ついでにTCCも調べてみたらTCに波形制御機能を足したような感じで、ほぼTCと同様に使えることが分かったので最近使うことがなかった懐かしのファクトリーメソッドパターンによりTCCも利用できるようにライブラリを拡張してみた。TCCを使う場合でも可能な限りTCと同じ動作になるようにしたつもりだが微妙に違う点は少なからずあるので注意してほしい...

ちなみに、C/C++言語は大昔からの前方参照できないという伝統(互換性)を守り通したおかげでJAVAなどの比較的新しい言語に比べるととても記述しにくい...と改めて思ってしまった今日この頃。

【ATSAMD21G18で利用可能なTC/TCC】
TCC0 24-bit
TCC1 24-bit
TCC2 16-bit
TC3 8/16-bit
TC4 8/16-bit, 32-bit(TC4+TC5)
TC5 8/16-bit

IDを指定しない任意な割り当てでは要求ビット数以上の未使用カウンタを適切に割り当てするようにしてみた。

【8-bit 割り当て順】
TC3
TC5
TC4
TCC2
TCC0
TCC1

【16-bit 割り当て順】
TCC2
TC3
TC5
TC4
TCC0
TCC1

【24-bit 割り当て順】
TCC0
TCC1
TC4

【32-bit 割り当て順】
TC4

【TCFactory – ファクトリ・メソッド・クラスの概要】

TCounterインスタンスを生成する。

IDを指定してTCounterインスタンスを生成する。PWM用。

【TCounter – タイマーカウンターライブラリ・クラスの概要】

※[1]-[4]のどれかひとつを最初に呼び出すこと。

TCounterインスタンスを破棄する。

[1] パルス幅(マイクロ秒)を指定して初期設定する。戻り値でカウンタークロック(Hz)を返す。

[2] 周波数(ヘルツ)を指定して初期設定する。戻り値でカウンタークロック(Hz)を返す。

[3] カウント値を指定して初期設定する。戻り値でカウンタークロック(Hz)を返す。

[4] プリスケーラ値を指定して初期設定する。戻り値でカウンタークロック(Hz)を返す。カウントはMAX値。

カウンタのトップ値を取得する。

割り込みコールバック関数を設定する。

PWMモードのデューティサイクルを設定する。デューティサイクルの分解能は16bit。0(0%)-65536(100%)の範囲を指定する。WAVEGENモードにより指定できないチャネルを指定した場合はfalseを返す。

イベント入力又はキャプチャー入力を設定する。

イベント出力を設定する。

ダウン・カウンター・モードを設定する。

割り込みを設定する。

キャプチャー・チャネルを指定する。

PWM出力先を設定する。指定できない出力ピンを指定した場合はfalseを返す。

カウントを開始する。

カウントを停止する。

カウント動作状態を取得する。

コマンド操作を行う。

デバッグ設定。

カウント値を設定する。

カウント値を取得する。

カウント比較値を設定する。

カウント比較値/キャプチャー値を取得する。

[非互換機能] TOP値を設定する。(TCxは8bitモードのみ有効)

[非互換機能] TOP値を取得する。(TCxは8bitモードのみ有効)

カウンタIDを取得する。

【サンプル・スケッチ】
XIAOのD7ピンに1KHz/50%のPWM出力を行う。

【修正履歴】
2020-11-17
XIAOコンパイル時のみ発生。output(disable)のIOピン禁止処理が間違っていたので修正。

2020-06-15
TCCx/TCxのAPBMASKの規定値がdisableだったのでenableにする設定を追加。調べてみたところArduinoのスタートアップ処理[wiring.c]init()内でenableにしていた。

【ライブラリ】

【参照ライブラリ】
Seeeduino XIAO (ATSAMD21G18) のGPIO速度 (IOBUS.h)
Seeeduino XIAO (ATSAMD21G18) のGCLKライブラリ (gclock.h/gclock.cpp)
Seeeduino XIAO (ATSAMD21G18) のEVSYSライブラリ (eventsys.h/eventsys.cpp)