Q2557-8:タイムベースカウンタ機能 (BlinkLED)
今回のトピック
今回は比較的長い周期のカウントを得意とするタイムベースカウンタ機能と、Lチカプログラム"BlinkLED"での利用状況について解説します。
データシート・ユーザーズマニュアルのPDFを片手にご覧ください。
タイムベースカウンタ(LTBC)
タイムベースカウンタは32kHz系の低速クロックを分周し、1Hz~128Hzまで8種類の信号を生成します。この信号は8ビットのカウントレジスタLTBRから直接読み込んでLOW/HIGHのチェックができるほか、8種類の中から3種類を選んでLTBCINT割り込みを発生させることができます。また、LTBRとは別にLTBRRというリアルタイムクロック(RTC)用の8ビットカウンタもあり、RTCへ供給するクロック源になるほか、LTBR/LTBRRの1Hzまたは2Hzの信号をLTBC0/LTBC1として出力することもできます。
LTBR/LTBRRカウンタレジスタはカウンタをゼロにリセットするために書き込みもできます。データを書き込むと、書き込みデータに関わらずゼロにリセットされる仕組みになっています。
周波数の微調整機能
LTBCは分解能0.119ppm、±488ppmの範囲で周波数の微調整機能を持っていますので、LTBCから出力した波形を正確な発振源と比較して補正することも可能です。ただし、内蔵RC発振器や水晶振動子は周囲温度の影響を受けるため、発振回路の性能を超える精度は保証されません。一般的な水晶振動子の精度は50~100ppm程度、時計に使用する月差15秒の高精度品でも6ppm程度になります。
STOPモードでは使えません
低電力のためにMCUをSTOPモードに入れるとRTCも止まってしまいますので、高精度・低電力を求めるなら外部に専用RTCを設けてしまうのも一つの手かもしれません。
※ただしデバッガをつないでいるとLTBCは動きっぱなしになるので注意してください。
BlinkLEDのLTBCに関する実際の記述
main() → s_initPeri() が起動後のLTBCを設定する部分になります。この関数はmain.cに実装されています。
s_initPeri()の動作の流れ
LTBCを使って8Hzの周期で割り込みを発生させ、割り込みハンドラでは割り込みがあったことをメインルーチンへ伝えるためのフラグを立てています。
| 使用API関数 | やってること |
|---|---|
| __disable_irq() | 割り込み禁止 ARM組み込み関数 |
| irq_tbc0_dis() | タイムベースカウンタ(LTBC)割り込み禁止 |
| tbc_clrLTBR() | タイムベースカウンタ値リセット |
| tbc_setLTI0S() | LTBC割り込みを8Hzで登録 |
| irq_tbc0_clearIRQ() | LTBC割り込みフラグクリア |
| irq_tbc0_ena() | LTBC割り込み有効 |
| __enable_irq() | 割り込み許可 ARM組み込み関数 |
割り込みベクターから割り込みハンドラを呼び出す流れ
startup_ML63Q25x7.cのベクターテーブル → irq_BlinkLED.cのLTBC_IRQHandler() → main.cのsmpl_procTbcInt()
smpl_procTbcInt()ではtbc_getIntStat()で割り込み要因フラグをチェックし、tbc_clearIntStat()でフラグをクリアしています。あわせて、main()から呼び出すs_wait()で割り込みが来たことを示すフラグがセットされるまで無限ループするようになっているので、ループを抜ける条件になるs_flag変数にフラグをセットしています。
s_flag変数はstatic修飾子しかついていませんが、できればvolatile属性を付けておいたほうが安全だと思っています。
今回のまとめ
- LTBCは1Hzから128Hzの8種類の信号を生成する
- 8種類の中から3種類を選択して割り込みを起動することができる
- RTCを動作させる信号も作っており、LTBCのメインカウンタとは別に動作する
- 周波数を微調整できる
- STOPモードではクロックが停止するため使えない
Discussion