2

問題:一方の値を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)が繰り返し割り込みを生成する最も一般的な理由は何ですか?

4

4 に答える 4

6

割り込みサブルーチンが何度も呼び出される最も一般的な理由は、ルーチンで割り込み要求が確認されないことです。対応するIRQビットをクリアしてもよろしいですか?

UARTのデバッグを容易にするには、最初にUARTをPCに接続し、ターゲットがPCと双方向に通信できることを確認する必要があります。同時に2つのターゲットがある場合、スコープを使用して信号を検査する以外に、どちらのターゲットに問題があるのか​​を判断することはできません。

于 2013-02-22T22:15:55.387 に答える
6

多くのデバイスでは、完了時にISRが単純に再入力されないように、割り込みを明示的にクリアする必要があります。

ほとんどの場合、UARTには割り込みのソースを示すステータスビットがあり、それが何かを教えてくれるかもしれないことを知っていますが、私たちに伝えないとあなたを助けるのは難しくなります。UARTレジスタはデバッガで直接検査できますが、一部のデバイスでは、ビットを読み取る動作によって実際にビットがクリアされる場合があります。これはデバッガにも当てはまります。その可能性に注意してください(データシート/ユーザーを確認してください)。マニュアル)。

一部のUARTでは、ヌルの送信を停止するために送信機を明示的にオフにする必要がありますが、その他のUARTは、データがtxレジスタに配置されると自動的にトリガーされ、必要なビット数がシフトアウトされた後に停止します。部品のデータシート/マニュアルを再度確認してください。PIC32コードが機能していることがわかっている場合、この考えられるエラーはPIC24コードにあるため、適切であると思われます。これは、PIC24からのTxラインでオシロスコープを使用するだけで確認できます。送信している場合は、少なくとも開始/停止ビット遷移(フレーミング)が表示されます。何もない場合、問題はおそらくPIC32側にあります。

スコープを外している間に、ビットタイミングが正しいこと、および実際に115200で送信していることを確認できます。クロッキングを間違えるのは簡単です。これが最初のチェックです。ボーレートが正しくない場合、PIC32はフレーミングエラー割り込みを生成する可能性があり、処理されない場合は無期限に持続する可能性があります。

もう1つの可能性は、送信後、PIC24がラインを「ブレーク」状態のままにし、PIC32UARTが「ラインブレーク」割り込みを生成していることです。そのため、UARTステータスレジスタを調べて割り込みの原因を特定することが重要です。

ご覧のとおり、多くの可能性があります。最も可能性の高いものについては説明したと思いますが、より系統的なデバッグ作業と情報収集が必要です。私もこれであなたを導いたと思います。

于 2013-02-23T08:39:26.413 に答える
1

実施された3つの根本原因がありました...

  • UART1の初期化コードで割り込み優先度を値6に設定しました。
  • 割り込みサービスルーチンの最初の行は、5の割り込み優先度レベルでコーディングされました
  • UARTデータの最初の3バイトがデータストリームから消えていました(これはまだ解決されていません)

これが彼らが問題を引き起こしていたそれほど明白ではない方法です

  • 最初の3バイトは表示されませんでした
  • 4バイト目が表示されました
  • 割り込みヒット(レベル6として)および呼び出された__ISRルーチン
  • __ISRipl5エージェントとして行動していた
  • 最初に実行された命令(おそらくそれ以上、正確にデバッグできませんでした)
  • 最初の命令が終了するとすぐに、「より高い」優先度6の割り込みがすぐに開始されました
  • これにより、同じ割り込みが再び発生しました
  • このプロセスは無限に繰り返されました。
  • 簡単に言うと、StackOverflowが発生しました

修正

これらの2行のコードが互いに一致していることを確認してください...

初期化コードのIPL行、間違った方法、次に正しい方法

     //IPC6bits.U1IP=6; //// Wrong !!! Uart 1 IPL should not be 6 !!!
     
     IPC6bits.U1IP=5;   //// Uart 1 IPL = 5  Correct way; matches __ISR

割り込みサービスルーチン

     void __ISR(_UART1_VECTOR, ipl5) IntUart1Handler(void)  //// Operating as IPL 5
     :
     :
     :
     :
于 2013-02-26T01:17:28.480 に答える
0

設計上の決定が不十分です。両方が同じボード上にある場合、SPIはより実現可能で、はるかに高速でした。

于 2013-07-22T06:45:13.843 に答える