Interrupt-Behandlung für einen UART auf PIC32 mit C32 v2.00-Compiler

Ich bin sehr neu bei PIC32-Chips (oder irgendwelchen PIC-Chips) und versuche, einen Interrupt-Handler für den UART zu erstellen, der aufgerufen werden soll, wenn der UART ein Byte empfängt. Ich verwende den PIC32MX695F512L PIC32-Prozessor mit C32 2.00-Compiler auf einem Entwicklungsboard.

Ich habe diesen Beispielcode in einem anderen Projekt online gefunden. Die Kommentare ließen mich glauben, dass dieser Interrupt immer dann aufgerufen würde, wenn der UART ein Byte empfängt. Ich habe dieser Funktion einen Haltepunkt und einen statischen Zähler hinzugefügt, um zu zählen, wie oft diese Funktion ausgeführt wurde.

In anderen Teilen des Quellcodes kann ich BYTES aus dem UART senden und werden von meinem PC wiederbelebt. Ich habe versucht, BYTES von meinem PC an den UART zu senden, aber diese Funktion wird nie ausgelöst und der Funktionszähler ( UART1Info_count) wird nie erhöht.

Quellcode

static BYTE UART1Info_LastByteRXed ;
static UINT32 UART1Info_count ; // Init elsewhere 

BOOL Uart_Connect ( ) {

    UART1Info_count = 0 ; 
    UART1Init();

    UARTConfigure       (UART1, UART_ENABLE_PINS_TX_RX_ONLY);
    UARTSetFifoMode     (UART1, UART_INTERRUPT_ON_RX_NOT_EMPTY);
    UARTSetLineControl  (UART1, UART_DATA_SIZE_8_BITS | UART_PARITY_NONE | UART_STOP_BITS_1 );
    UARTSetDataRate     (UART1, GetPeripheralClock(), 9600) ;
    UARTEnable          (UART1, UART_ENABLE_FLAGS(UART_PERIPHERAL | UART_RX | UART_TX));

    INTEnable           (INT_SOURCE_UART_RX(UART1), INT_ENABLED);
    INTEnable           (INT_SOURCE_UART_TX(UART1), INT_ENABLED);


    // Set Interrupt priorities    
    INTSetVectorPriority    (INT_VECTOR_UART(UART1), INT_PRIORITY_LEVEL_2);
    INTSetVectorSubPriority (INT_VECTOR_UART(UART1), INT_SUB_PRIORITY_LEVEL_0);

    // configure for multi-vectored mode
    INTConfigureSystem      (INT_SYSTEM_CONFIG_MULT_VECTOR);
    INTEnableInterrupts     ();

    Rs485RxLineConfig();
    Rs485TxLineConfig();
    Rs485TxDisable();
    Rs485RxEnable();

    return TRUE ;
}

#define __UART_1_ISR    __ISR(_UART_1_VECTOR, ipl4)
void __UART_1_ISR  UART_1_InterruptRoutine(void)
{
    UART1Info_count++ ; 
    IFS0CLR = _IFS0_U1RXIF_MASK;
    UART1Info_LastByteRXed = UART1ReceivedValue();
    UART1TransmitTestASCIICharacters( (UART1Info_LastByteRXed+1), 1); //reflect back character, incremented by 1
}

Andere Informationen

  • Prozessor: PIC32MX695F512L
  • Compiler: C32 v2.00
  • IDE: MPLAB X-IDE

Meine Frage

Wie erstelle ich einen Interrupt-Handler beim Empfang von BYTE über UART auf PIC32 mit dem C32 v2.00-Compiler?

Hinweis: Aktualisiertes Quellcodebeispiel mit UART init()

Antworten (1)

Ihr Beispielcode zeigt keine Initialisierung für den UART.

Aktivieren Sie den Empfangsinterrupt für den UART? Sie müssen so etwas tun:

#define BAUDRATE1       (115200)     // the desired BaudRate
#define BRATE1    (FPB/4/BAUDRATE1) 
#define UART1_CONFIG1   UART_EN|UART_BRGH_FOUR      // defaults to 8,N,1
#define UART1_CONFIG2   UART_RX_ENABLE|UART_TX_ENABLE|UART_INT_RX_CHAR              // only RX interrupts

void ConfigureUart1(void)
{
    OpenUART1(UART1_CONFIG1, UART1_CONFIG2, BRATE1); // approx 115200 baud
}

wobei FPB als Ihre periphere Busfrequenz definiert ist, zB 10000000L für 10 MHz.

Dann in main oder woanders:

ConfigureUart1();
INTEnableSystemMultiVectoredInt();         
INTEnableInterrupts();
Ich glaube, ich aktiviere den Empfangsinterrupt für den UART. Ich habe meine Frage mit meiner Initialisierungsfunktion für den UART aktualisiert
@Steven, um zu sehen, ob Ihr Problem mit den Interrupts zusammenhängt oder ob der UART überhaupt Zeichen empfängt, können Sie versuchen, einen Aufruf von UARTReceivedDataIsAvailable(UART1)) in eine while(1)-Schleife und einen Haltepunkt auf eine wahre Rückkehr zu setzen, die a anzeigt Charakter wurde empfangen.
@tcroskey Sie haben Recht, die Funktion UARTReceivedDataIsAvailable() gibt niemals true zurück, selbst wenn ich Bytes über das Kabel von meinem PC an mein Gerät sende. Okay, jetzt muss ich herausfinden, warum das passiert. Danke
@tcroskey Ich habe eine neue Frage zu diesem Thema erstellt. electronic.stackexchange.com/questions/21484/…