Me gustaría usar el controlador Harmony USART en un PIC32MX695F512H usando interrupciones y con soporte de búfer. Después de establecer la configuración adecuada en el Configurador de Armonía MPLAB, el sistema ha generado el ISR para mí ( system_interrupt.c
):
void __ISR(_UART_2_VECTOR, ipl1AUTO) _IntHandlerDrvUsartInstance0(void) {
DRV_USART_TasksTransmit(sysObj.drvUsart0);
DRV_USART_TasksReceive(sysObj.drvUsart0);
DRV_USART_TasksError(sysObj.drvUsart0);
}
Ya que este es un archivo generado, asumo que no debo editarlo. Pero si este es el ISR, ¿cómo puedo asegurarme de que mi código se ejecutará en una interrupción de RX? Quiero recibir los datos recibidos en una función que debo editar.
Tal como lo entiendo, para eso es el controlador de eventos del búfer. Así que puedo hacer lo siguiente (este código está muy simplificado):
void APP_BufferEventHandler(DRV_USART_BUFFER_EVENT bufferEvent,
DRV_USART_BUFFER_HANDLE bufferHandle, uintptr_t context) {
switch (bufferEvent) {
case DRV_USART_BUFFER_EVENT_COMPLETE:
// @todo
break;
case DRV_USART_BUFFER_EVENT_ERROR:
appData.state = APP_ERROR;
break;
case DRV_USART_BUFFER_EVENT_ABORT:
appData.state = APP_ERROR;
break;
}
}
//... in APP_Tasks somewhere:
appData.usartHandle = DRV_USART_Open(DRV_USART_INDEX_0,
DRV_IO_INTENT_READWRITE | DRV_IO_INTENT_NONBLOCKING);
DRV_USART_BufferEventHandlerSet(appData.usartHandle,
APP_BufferEventHandler, 0);
Mis preguntas son:
- ¿Es esta realmente la forma correcta de asegurarse de que se llame a
APP_BufferEventHandler
en una interrupción de RX? - ¿Cómo puedo distinguir entre un evento RX y un evento TX en el controlador de eventos, si el evento es uno de
COMPLETE
,ERROR
yABORT
?