R8C/1x 発振停止検出機能について

こんにちは、entakeと申します。お世話になっております。

電源起動後、XINクロック(20MHz)に切り替えていますが、万が一XINクロック供給が途絶えた時のために、発振停止検出機能を使おうと考えています。

R8C/1Bのハードウェアマニュアルによると、同機能は、メインクロック発振回路の停止を検出すると、自動的に低速オンチップオシレータ発振設定(cm14=0)&オンチップオシレータ選択(ocd2=1)とし、発振停止検出割り込みにジャンプするようです。

ジャンプした後の動作ですが、「低速オンチップオシレータからメインクロックへの切り替え手順」として同マニュアルに参考フローが載っています。
(1)ocd3でメインクロック復活確認 ※永久ループ
(2)復活後→発振停止検出機能は無効にセット
(3)ocd2でメインクロックに切り替え

⇒この通りに作ると確かに正しく動くのですが、上記(2)を削るとなぜか上手く動きません。(UART通信ができない)

発振停止検出機能を有効にしたまま、動作を継続できればベストなのですが、何かお分かりの方、お願いいたします。
Parents
  • >すと@konさま

    発振停止検出割り込み処理内で、メインクロックの発振を確認後、”発振停止検出機能は無効化”してから、メインクロックに切り替えて、メインルーチンへ戻す。
    メインルーチンでは、常時SFRリフレッシュ処理として、ポート方向レジスタを更新していますが、そこに”発振停止検出機能の有効化”を追加し、ようやく上手くいきました。

    暴走についてですが、ocd2アクセス時のプロテクト解除忘れも一因でした。情けない。。

    また、メインクロックの発振を待っている間は、アラームを出すなどの工夫も大変参考になりました。
    ちなみに、発振待ちのまま30秒経つとWDTリセットがかかるのが盲点でした。
    20MHz動作で0.2秒になるよう設計してある場合、125KHz動作になると、確かに約30秒でWDTカウンタはアンダーフローしますね。
    メインクロック発振確認後は、ソフトウェアリセットで仕切りなおしたかったのですが、無用なイニシャル処理を避けねばならず、何事もなかったかのように戻すのに苦労しました。

    すと@konさまのご意見は、大変参考になりました!
    また何かありましたら、よろしくお願いいたします。
Reply
  • >すと@konさま

    発振停止検出割り込み処理内で、メインクロックの発振を確認後、”発振停止検出機能は無効化”してから、メインクロックに切り替えて、メインルーチンへ戻す。
    メインルーチンでは、常時SFRリフレッシュ処理として、ポート方向レジスタを更新していますが、そこに”発振停止検出機能の有効化”を追加し、ようやく上手くいきました。

    暴走についてですが、ocd2アクセス時のプロテクト解除忘れも一因でした。情けない。。

    また、メインクロックの発振を待っている間は、アラームを出すなどの工夫も大変参考になりました。
    ちなみに、発振待ちのまま30秒経つとWDTリセットがかかるのが盲点でした。
    20MHz動作で0.2秒になるよう設計してある場合、125KHz動作になると、確かに約30秒でWDTカウンタはアンダーフローしますね。
    メインクロック発振確認後は、ソフトウェアリセットで仕切りなおしたかったのですが、無用なイニシャル処理を避けねばならず、何事もなかったかのように戻すのに苦労しました。

    すと@konさまのご意見は、大変参考になりました!
    また何かありましたら、よろしくお願いいたします。
Children
No Data