Soy muy nuevo en los chips PIC32 (o cualquier chip PIC) y estoy tratando de crear un controlador de interrupciones para que se llame al UART cuando el UART reciba un byte. Estoy usando el procesador PIC32MX695F512L PIC32 con el compilador C32 2.00 en una placa de desarrollo.
Encontré este código de ejemplo en otro proyecto en línea. Los comentarios me llevaron a creer que esta interrupción se llamaría cada vez que el UART reciba un byte. Agregué un punto de interrupción a esta función y un contador estático para contar cuántas veces se ejecutó esta función.
En otras partes del código fuente, puedo enviar BYTES fuera del UART y mi PC los está reactivando. He intentado enviar BYTES a la UART desde mi PC pero esta función nunca se activa y el contador de funciones ( UART1Info_count
) nunca aumenta.
Código fuente
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
}
Otra información
Mi pregunta
¿Cómo creo un controlador de interrupciones al recibir BYTE a través de UART en PIC32 con el compilador C32 v2.00?
Nota: ejemplo de código fuente actualizado con UART init()
Su código de ejemplo no muestra ninguna inicialización para el UART.
¿Está habilitando la interrupción de recepción para el UART? Necesitas hacer algo como esto:
#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
}
donde FPB se define como la frecuencia de su bus periférico, por ejemplo, 10000000L para 10 MHz.
Luego en main o en otro lugar:
ConfigureUart1();
INTEnableSystemMultiVectoredInt();
INTEnableInterrupts();
Steven Smethurst
crosley
Steven Smethurst
Steven Smethurst