※ ChatGPTを利用し、要約された質問です(原文:マイコンSH-2の割り込みを用いたシリアル通信)
マイコンSH-2の割り込みを用いたシリアル通信 割り込みがかからない症状に悩んでいます
このQ&Aのポイント
マイコンSH-2の割り込みを用いたシリアル通信において、割り込みがかからなくなる症状に悩んでいます。
質問者はSH7144Fの開発環境において、割り込みレベルや割り込みマスクの設定を適切に行っているにもかかわらず、受信割り込みがかかった後、一文字受信しただけで割り込みがかからなくなる症状に遭遇しています。
質問者は割り込みマスクを0にする手続きを追加すると、割り込みが連続してかかり、正常に受信できるようになることを確認しています。しかし、割り込みが終われば割り込みマスクは元に戻るはずであるため、なぜ明示的に割り込みマスクを0にする必要があるのかについて質問しています。
SH7144Fで割り込みを用いたシリアル通信を行っていますが,
途中で割り込みがかからなくなる症状に悩んでいます.
開発環境はHEW上でツールチェインにRenesas SuparH StandardとKPIT GNUSH [ELF]を
組み込んでおり,適宜選んで使っています.
以下,Renesas SuparH Standardで,受信割り込みの場合に限って書かせて頂きます.
少々長くなりますが状況をご説明致します.
最初にSCI1回りの設定を適切に行い,割り込みレベルを15とした後,
set_imask(0)で割り込みレベルを0として割り込みがかかるようにしています.
受信割り込みがかかるとINT_SCI1_RXI1に飛び,
_UBYTE c = SCI1.RDR;
SCI1.SSR.BIT.RDRF = 0;
と直ちにした後,cの内容をバッファに入れ,戻っていますが,一文字受信しただけで
割り込みがかからなくなります.(_UBYTEはtypedefine.hでunsigned charとしています.)
相当悩んだ挙句,INT_SCI1_RXI1の末尾に,
set_imask(0);
を入れてやると連続して割り込みがかかり,うまく受信できるようになっています.
ハードウェアマニュアルを読めば,割り込みがかかるとSRレジスタは退避され,
SCI1の割り込みレベル15の内容がSRレジスタのI0~I3に書き込まれる,とあります.
当然,割り込みが終われば,退避された内容がSRレジスタに戻るので割り込みマスクは
0に戻るもの・・・と解釈していますが,余りにも当たり前なのかハードウェアマニュアルには
明記はされていません.もしかしたら元に戻っていないのでは・・・と,上記のようにいちいちに
割り込みマスクを0にする手続きを追記すると動いている,と言う状況です.
因みに上記の状況はKPIT GNUSH [ELF]を選んだときにも同じです.
更には,送信割り込みのときも上記と同じくset_imask(0)を入れてやると動きます.
そこで質問ですが,
1.SRレジスタは割り込みが終われば元の内容に戻ると解釈していますが,
これで合っているでしょうか.
2.上記1で元に戻るのだとしたら,なぜいちいちset_imask(0)をしてやらないといけない
状況になっているのか・・・考えられる原因をお教えください.
雑多な説明で申し訳ございませんが,どうぞ宜しくお願い致します.<(__)>
お礼
ご指摘の通り,1を読み込んでから0を書き込むことで解決致しました. ありがとうございました. 同じことをされている方がネット上に挙げている幾つかのソースを見て, 私のと比較していたのですが,例えば動くものを見ると, while(!SCI0.SSR.BIT.RDRF); c = SCI0.RDR; SCI0.SSR.BIT.RDRF = 0; となっていて,実はwhileの判定で一度リードしていたことに気付きました. これにより原因はご指摘の通りでありまして,そのようにしましたら無事, 問題無く動くようになりました. 大変大変助かりました.ありがとうございました.