ようやく、ここまで来た感がある。
タイマーの機能は、複雑なので、機能を理解して、クラスを作るのが難しく、楽しい。
まず、面倒な、データ・レジスタのマッピング・・
これは、SAU(シリアルアレイもそうだったけど)ではまったんだけど、SDR
(シリアル・データ・レジスタ)でも実アドレスが、不規則に並んでいる・・
SAUは8チャネルが2ユニットあるのだけど、SDRだけ、不規則な実アドレスと
なっている。(何でこうなるのか理由は不明だが、仕様なので仕方無い・・)
タイマ・アレイはほぼ同じ構成であるので、テンプレートでクラスを作り、テンプレ
ートパラメーターとして、アドレスのオフセットを加える構成にしてある、しかし、
それだと、不規則なアドレスの変化に対応出来ない為、SDRだけ、別途アドレスを
与えるようにして対応した。
// UOFS: ユニット・オフセット // CHOFS: チャネル・オフセット // DRADR: SDRアドレス template <uint32_t UOFS, uint32_t CHOFS, uint32_t DRADR> struct tau_t { . . . }; typedef tau_t<0x00, 0x00, 0xFFF18> TAU00; typedef tau_t<0x00, 0x02, 0xFFF1A> TAU01; typedef tau_t<0x00, 0x04, 0xFFF64> TAU02; typedef tau_t<0x00, 0x06, 0xFFF66> TAU03; typedef tau_t<0x00, 0x08, 0xFFF68> TAU04; typedef tau_t<0x00, 0x0A, 0xFFF6A> TAU05; typedef tau_t<0x00, 0x0C, 0xFFF6C> TAU06; typedef tau_t<0x00, 0x0E, 0xFFF6E> TAU07;
C++ で作ると、このような、変化に柔軟に対応できて、便利だ、そしてわかり易い。
-----
日本製マイコンのタイマー系は、やはり良く考えられて作られている。
まずは、基本のインターバル・タイマーを使って、矩形波を出力する。
インターバルタイマーの矩形波は、タイミングでトグルするので、設定の半分の周期
となる。
※サンプルでは、TO01端子(ポート1のビット6)40番ピンから、5KHz、
デューティー50%の信号を出力する。
今後、機能追加の過程で、仕様は変わるものと思う。