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
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()
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();
Steven Smethurst
trosley
Steven Smethurst
Steven Smethurst