RA4M1マイコンのレジスタ解説⑥ P214端子が使えない!! プロテクトがかかった入力専用端子
この記事の書かれていることは、あまり自信がない人にはおすすめしない。 というのは、今回紹介する内容はP214とP215の入力専用端子についてなのだが、この端子にはなぜがプロテクトがかかっているのだ。
今回の解説はこのP214とP215の入力専用端子にかかっているプロテクトを外して使用可能にするという内容になっている。 なので、不安を感じたり自信がない人にはおすすめしない。 そもそも入力専用端子なので、使い方も制限される。 初めから無いものとしてスルーしてもいいかもしれない。 かくゆう私キャッスルも、設定することはできたが、まだ活用してはいない。
ことの発端は、Arduino UNO R4 MINIMAボードの改造計画の最終盤。
MINIMAボードの改造計画については、このあたりを参照されたし。
P214端子とP215端子にワイヤーをはんだ付けして別途用意したポートに繋げて、確認テストをする。 入力専用端子なので、今までのようにLEDを光らせるLチカ回路では確認できない。 ただ単に5Vの電圧を印加するだけの、回路とは言えないような方法で試した。
しかし、うんともすんとも言わない。 P214端子もP215端子も、電圧を印加しても、PIDRレジスタには何も反映されない。 他の端子に電圧を印加すると、ちゃんと取得できる。
何かおかしい。 絶対におかしい。 別の理由があるはずだ。
というわけで、またもやRA4M1マイコンのユーザーマニュアルとにらめっこすることに。
わかったことを順番に書いていこうと思う。
入力専用端子である
これはすぐにわかる。 RA4M1マイコンのマニュアルの59ページを始め、いたるところに書かれている。 UNO R4 MINIMAやWiFiの回路図にもそのように書かれている。
だからといって、
R_PORT2->PDR_b.PDR14 = 0; //P214端子 入力設定 R_PORT2->PDR_b.PDR15 = 0; //P215端子 入力設定
このように書いても、入力端子としては機能しない。
周辺機能は無し だがXCIN・XCOUTってなんぞ?
では、P214とP215の端子の汎用入出力端子以外の機能は何か。 マニュアルの435ページを見ても何も書かれていない。 なので、周辺機能は持っていない。
だが、マニュアルの67ページの「1.7 端子一覧」を見るとヒントが書かれている。
Arduino UNO R4 MINIMAやWiFiに使われているマイコンR7FA4M1AB3CFMのパッケージは"LQFP64"で、なおかつP214端子のピン番号は'6'、P215端子のピン番号は'5'である。 その条件で表を見ていくと、P214とP215の周辺機能は何も書かれていないが、「電源、システム、クロック、デバッグ、CAC、VBATT」の項目の所には、P214端子は"XCOUT"、P215端子は"XCIN"と書かれている。
これが何か悪さをしているではなかろうか。
XCIN・XCOUTは水晶発振器を接続する端子
XCIN・XCOUTってなんぞやってことでマニュアルを読み進めていくと、136ページ「8. クロック発生回路」にそのことが書かれている。
そこには、「サブクロック発振器(SOSC)」「接続端子:XCIN、XCOUT」の記述が。 つまり、ここにはサブクロック用の水晶発振器を接続する端子なのだ。 発振周波数はド定番の"32.768kHz"。 タイマーや時計などの正確な時間が必要なところ用にメインクロックとは別のサブクロックを使うのはよくあった。 H8やSHなどの懐かしいマイコンでRTCを使いたかったら、このようなサブクロックを別途接続しなければならなかったが、今はマイコン内部で生成できる時代になっているらしい。
なので、このサブクロック発振器(SOSC)に関する所に、P214・P215端子が使えない原因がありそうだ。
サブクロック発振器コントロールレジスタ
というわけで、見つけた。 マニュアル150ページにある「8.2.7 サブクロック発振器コントロールレジスタ(SOSCCR)」だ。 8ビットのレジスタだが、使っているのは0ビット目の1ビットだけ。 それは'0'に設定すればサブクロック発振器が動作し、'1'に設定すればサブクロック発振器が停止するらしい。
確かに、このレジスタの値を読み込んでみると、'0'になっている。 これを'1'にすればよいのだ。
このように書けばいい。
R_SYSTEM->SOSCCR_b.SOSTP = 1; //サブクロック停止
しかし、だがしかし。 このように書いても、P214・P215端子は入力端子としては機能しない。
なぜだ、なぜなんだ。
'1'に設定した後に値を読んでみても'0'のまま。
ここで心が折れそうになる・・・
レジスタライトプロテクションレジスタ これだ!!
サブクロック発振器コントロールレジスタを書き換えることができない理由は、プロテクトがかけられているから。 と気づいたのは、マニュアルとにらめっこし始めて何時間後か。 マニュアル255ページ「12. レジスタライトプロテクション」の項目を見つけた時は旅の終わりを確信したものだ。
そこに、「保護されるレジスタ」の中に「SOSCCR」の記述を発見。
つまり、このレジスタライトプロテクションの機能によってSOSCCRレジスタの書き換えができないようにプロテクトしていたのだ。
具体的な使い方はマニュアル256ページ「12.2.1 プロテクトレジスタ(PRCR)」に書いてあるのだが、これまたコツが必要なのだ。
SOSCCRはクロック発生回路関連レジスタなので、プロテクトレジスタ(PRCR)の0ビット目「PRC0 プロテクトビット0」を「1:書き込み許可」に設定すればいい・・・だけじゃない。
なんとこのプロテクトレジスタ(PRCR)を書き換えるためのパスワードみたいな物ががって、それが8~15ビット目の上位8ビットの「PRKEY[7:0] PRCキーコード」である。 先述の「PRC0 プロテクトビット0」に'1'を設定すると同時に、「PRKEY[7:0] PRCキーコード」に16進数で’A5’を入れないといけないのだ。
それは、このように記述しなければならない。
R_SYSTEM->PRCR = 0x0001; //これではダメ R_SYSTEM->PRCR = 0xa501; //こうしないといけない
まとめ
もはや何の説明をしていたのか忘れるほどいろんなことを書いたのだが、本来の目的はP214とP215の端子を汎用入力端子と使うことだ。
そのためには、
①サブクロック発振器を停止させなければならない。
②サブクロック発振器を停止させるにはプロテクトレジスタで書き換え許可にしなければならない。
③プロテクトレジスタを設定するにはパスコードと共に設定値を代入しなければならない。
という段階を経なければならない。
しかし、プログラムで書くと結構あっさりしたものだ。
R_SYSTEM->PRCR = 0xa501; //プロテクト解除 R_SYSTEM->SOSCCR_b.SOSTP = 1; //サブクロック停止 R_SYSTEM->PRCR = 0xa500; //プロテクト有効 R_PORT2->PDR_b.PDR14 = 0; //P214端子 入力設定 R_PORT2->PDR_b.PDR15 = 0; //P215端子 入力設定
と書くだけで、P214とP215の端子を汎用入力端子と使用することができる。
ただ、端子の感度がいいのかわからんが、プルダウンかプルアップしないとノイズか何かで誤動作する感じである。