-1

uC LPC2478 を使用しています。関数UART0に取り組んでいます。しかし、関数 UART0 を作成する必要があります。割り込みの使い方がわからない!

長い文字列を送信し、長い文字列を受信する必要があります。しかし、うまくいきません。しかし、関数 __irq void isr_UART0 (void) に書き込む必要がありますか?

    >     void initUART0 (void)
    >     {
    >       PCONP   |= (1 << 3);                 /* Enable UART0 power                */
    >     
    >       PINSEL0 &= ~0x000000F0;
    >       PINSEL0 |= 0x00000050;
    >     
    >       U0FDR    = 0;                          /* Fractional divider not used       */
    >       U0LCR = 0x83;                       /* 8 bits, no Parity, 1 Stop bit       */
    >       U0DLL = 10;                          /* 115200 Baud Rate @ 12MHz PCLK Clock */
    >     
    >       U0DLM = 0;
    >       U0LCR = 0x03;                       /* DLAB = 0                            */
    >       
    >       U0IER = 0;
    >       
    >       VICVectAddr6 = (U32)isr_UART0;     /* Set Interrupt Vector                */
    >       VICVectCntl6 = 15;                   /* use it for UART1 Interrupt          */
    >       VICIntEnable  = (1  << 6);          /* Enable Interrupt                    */
    >       
    >       U0IER = 0x03;
    >     }
    > 
    >     void sendToUART0 (char *data, int len)
    >     {
    >       int i;
    >       
    >       while (!(U0LSR & (1 << 5)));
    >       for (i = 0; i < len; i++)
    >       {
    >           U0THR = *data;
    >           data++;
    >       }
    >     }
    > 
    >     void readDataAtUART0 (char *ch) { 
    >       //while (!(U0LSR & 0x01));  
    >        while (!(U0LSR & (1 << 0))); 
    >        *ch = U0RBR; 
    >     }
    > 
    >     /* UART1 receive ISR
    >     ******************************************************** */
    >     __irq void isr_UART0 (void) {     
    >       // readDataAtUART0();
    > 
    >               // read and assign the received data 
           VICVectAddr = 0;              /* Acknowledge Interrupt   */ 
    >      }
4

1 に答える 1

0

「しかし、うまくいかない」は問題の非常に悪い説明なので、とにかく -1 です。

「readDataAtUART0();」'void readDataAtUART0 (char *ch)' のシグネチャと一致しないため、このコードはコンパイルされません。割り込みハンドラーにはプロセスまたはスレッドのコンテキストがないため、ハンドラーが通信できるようにするには、少なくとも 1 つのグローバル変数 (この場合は配列ポインター) に頼る必要があります。

U0THR は送信する最初の文字で「プライミング」が必要な場合があるため、TX 割り込みは少し厄介です。これは厄介な場合があり、U0THR が前のバッファ コンテンツの最後の文字を空にしているかどうかを確認するために、tx 割り込みを無効にする必要があります。

コードをコンパイルしてから、rx ハンドラーを最初に動作させるだけです。

于 2014-12-12T13:56:23.957 に答える