さて、低消費電力の話に移りましょうか。実際あまり良く分かっていないのですが、大体合ってそうなので(笑)、記事にしてしまいます。
省電力設定
調べて説明しようと思っていたのですが、こちらのサイトで説明されているので省略しようかな(爆)
まあかる〜くまとめますと、設定用に以下のマクロが用意されています。なお、省電力設定はステータスレジスタに含まれています。
_BIS_SR()
: 指定したステータスレジスタのビットを立て設定する_BIS_SR_IRQ()
: スタックに退避されているステータスレジスタの値を指定された値に変更する(通常 割り込み関数内で使用)
ステータスレジスタ周りの挙動ですが、割り込み発生時に値がスタックポインタに退避→省電力設定解除→処理後スタックからもとに戻ってメインルーチンに帰ってくる、と言った感じなんです。
また、省電力の段階ですが、以下に内容を示します。結構衝撃的なのが LPM1 以降の CPU ディスエーブル ですね。
こんなことやって大丈夫なのか??と思われるかもしれませんが、今回のケースのように、割り込みを待つだけで無限に nop
しているようなプログラムだとこれが適しています。いちいち Instruction Fetch やっててもまぁ無駄ですからね。
CPU ディスエーブルとは言っても、割り込み信号を待っているので上に述べたルーチンで割り込みが入った瞬間に全力で仕事を始めますからご安心を。
ということでソースコードは以下です。先程も述べたように、途中でCPUの動作を停止させているのですから、本来 while(1) {;}
は不要です。
また、CPU の省電力をせずに、さらに無限ループ部を書かずにいてもプログラムは正常に動作しているようでしたので、おそらくスタートアップルーチンに
_start:
; システム固有の初期設定等
call _main
loop:
jump loop
的なものが書かれているんでしょう。知らないですが。
タイマのPWMでLチカ
はい、前半の内容全く関係ないですが、PWM をやってみました。クロックは SMCLK を8分周したもの、カウントは 60000 取りました。相変わらず具体的な周波数が分かっていないのですがご容赦ください。
また、出力ピンですが、おそらく対応するっぽい名前が付いている物で OK っぽいです。実際に波形出てますし(適当)
というわけで TA0.0 という名前のピンを選んで出力しました。
正常動作しています。これでOK。