ATXmega32A4Uを使っていて小一時間引っかかった事が有ったのでメモ
マイコンの16bitタイマーを使っていて、タイマーカウントをリセットしたかったので
ASF(AtmelSoftwareFramework)のtc_reset()関数を呼んでカウントリセットを試みたのですが
リセットされませんでした。
tc_restart()関数だとカウントリセットもされるんですが、
当然ながらその後カウントアップが始まります。
で、どうにかカウントを再開させずにカウントだけをリセットできないかゴニョゴニョやって
結局以下のコードを書いて解決しました。
inline void tc_cnt_reset(volatile void *tc) { ((TC0_t *)tc)->CNTL = 0; ((TC0_t *)tc)->CNTH = 0; }
呼ぶ時はこう
tc_cnt_reset(&TCC1);
これでTCC1タイマーのカウントが0になる
※ASFのタイマーカウンターモジュールが入ってないと動きません
関数本体の中身を
((TC0_t *)tc)->CNT = 0;
って書けば一行で済みそうな気もするけど、16bitのレジスタにアクセスするには
まず下位8bitを書いてから上位8bitを書かないといけないらしく、
上記の一行だけではうまくいかない(ややこい)。
ちなみに。
ASFのtc_reset()は内部でCTRLFSETレジスタのCMDビットを弄っているだけっぽいので、
今回はASFは犯人ではないっぽい。