問題:一方の値をUARTに送信すると、もう一方のUARTでヌルが発生します。
- - 詳細 - -
これらは両方ともPICプロセッサ(PIC24とPIC32)です
どちらもプリント回路基板に配線されています。
それらは、それぞれがそれらの中にあるUARTモジュールの1つを介して通信しています。
それらは(表面上;ドキュメントによると)両方とも115200 bps、8-N-1用に構成されています
ハンドシェイク、CTSの有効化、RTSの有効化はありません。私はただバイトを配線に入れているだけで、それらは出て行きます。
(これらは短い4バイトのコマンドと応答で、かなりきれいに収まります)
PIC32は80MHzになります。
PIC24のF[cy]= 14745600
つまり、14.7456MHzになります
PIC24は4バイトを送信します(特定のコマンドシーケンス)
UARTの割り込みサービスルーチンにブレークポイントを設定すると、PIC32にnullが表示され、最初の4つの後に(PIC32コード)ブレークポイントで繰り返しヒットが表示され、引き続きnullが表示されます(PIC24以降は意味があります)。何も送信していません)
つまり、理由がない場合、UARTは繰り返し割り込みを生成しているように見えます
私はPIC32側でコードを書いていませんでした、そして私はそれがどのように機能するかを毎日学んでいます。
次に、コードを実行するだけで、必然的に次のような行になります。
52570 1D01_335C 9D01_335C _general_execption_handler sdbbp 0x0
私はそこに着くとき、
- 原因レジスタは保持します
0080181C
- EPCレジスタは保持します
9D00F228
- SPレジスタは保持します
9F8FFFA0
これは時計仕掛けのように起こったので、私は__ISRが止まらないのではないかと疑った。MpLabは私にこれを見せてくれました...
432:
433: //*********************************************************//
434: void __ISR(_UART1_VECTOR, ipl5) IntUart1Handler(void) //MCU communication port
435: {
9D00F204 415DE800 rdpgpr sp,sp
9D00F208 401A7000 mfc0 k0,EPC
9D00F20C 401B6000 mfc0 k1,Status
9D00F210 27BDFF88 addiu sp,sp,-120
9D00F214 AFBA0074 sw k0,116(sp)
9D00F218 AFBB0070 sw k1,112(sp)
9D00F21C 7C1B7844 ins k1,zero,1,15
9D00F220 377B1400 ori k1,k1,0x1400
9D00F224 409B6000 mtc0 k1,Status
9D00F228 AFBF0064 sw ra,100(sp) ;<<<-------EPC register always points here
9D00F22C AFBE0060 sw s8,96(sp)
9D00F230 AFB9005C sw t9,92(sp)
9D00F234 AFB80058 sw t8,88(sp)
9D00F238 AFAF0054 sw t7,84(sp)
9D00F23C AFAE0050 sw t6,80(sp)
9D00F240 AFAD004C sw t5,76(sp)
9D00F244 AFAC0048 sw t4,72(sp)
9D00F248 AFAB0044 sw t3,68(sp)
9D00F24C AFAA0040 sw t2,64(sp)
9D00F250 AFA9003C sw t1,60(sp)
9D00F254 AFA80038 sw t0,56(sp)
9D00F258 AFA70034 sw a3,52(sp)
9D00F25C AFA60030 sw a2,48(sp)
9D00F260 AFA5002C sw a1,44(sp)
9D00F264 AFA40028 sw a0,40(sp)
9D00F268 AFA30024 sw v1,36(sp)
9D00F26C AFA20020 sw v0,32(sp)
9D00F270 AFA1001C sw at,28(sp)
9D00F274 00001012 mflo v0
9D00F278 AFA2006C sw v0,108(sp)
9D00F27C 00001810 mfhi v1
9D00F280 AFA30068 sw v1,104(sp)
9D00F284 03A0F021 addu s8,sp,zero
数値をもう少し詳しく見てみると、その時点で、FFA0(SPの下位16ビット)に100(0x64)を追加すると、0x10004が得られます。これは、4が多すぎると推測しています。
PICマニュアルDS61143E-50ページには、命名法が意味することSW Store Word Mem[Rs+offset> = Rt
が記載されており、他の専門家によると、原因レジスタは、ロードまたはストアでのバス例外のコードであるEXCCODEビットが7であると言っています。
または、私はここで完全に推測しています(これについて専門家の知識を得たいと思います)何かが何かをクリアしておらず、intハンドラーで無限の再帰に遭遇しています。
これらすべてが理にかなっています。
質問
誰かがこのようなintが繰り返し私を襲う最も一般的な理由を提案できますか?
UARTからの偽のヌルの間に、この無限に生成されたintと何らかの形で関連している可能性のある共通の関係を見ている人はいますか?私も正しい方向に進んでいますか?
あなたの答えでは、UARTからIntを確認する方法を教えてください。私はPIC24でそれをどのように行うかを知っています(私はそのコードをASMで完全に書きました)が、PIC32のCでこれがどのように行われるかはわかりません。組み立ては大丈夫です。インライン化します。私はここに書かなかったコードを扱っています、そして私はあなたの答えに感謝します
UART(この場合は#1)が繰り返し割り込みを生成する最も一般的な理由は何ですか?