// UART_DRIVER.C
#ifndef UART_DRIVER_C
#define UART_DRIVER_C
#include "UART_DRIVER.H"
static xSemaphoreHandle xMutexUartDriver;
static xQueueHandle xQueueUartDriverTx;
static xQueueHandle xQueueUartDriverRx;
int InitUART1_driver(void){
if( NULL == ( xMutexUartDriver = xSemaphoreCreateMutex() ) )
return -1;
if( NULL == ( xQueueUartDriverTx = xQueueCreate( 4, sizeof( unsigned int ) ) ) )
return -1;
if( NULL == ( xQueueUartDriverRx = xQueueCreate( 4, sizeof( unsigned int ) ) ) )
return -1;
vQueueAddToRegistry( xMutexUartDriver, ( signed portCHAR * ) "xMutexUartDriver" );
vQueueAddToRegistry( xQueueUartDriverTx, ( signed portCHAR * ) "xQueueUartDriverTx" );
vQueueAddToRegistry( xQueueUartDriverRx, ( signed portCHAR * ) "xQueueUartDriverRx" );
return 0;
}
void OpenUART1_driver(unsigned int config1,unsigned int config2, unsigned int ubrg){
if( pdTRUE == xSemaphoreTake( xMutexUartDriver, portMAX_DELAY ) ){
OpenUART1( config1, config2, ubrg );
ConfigIntUART1( UART_RX_INT_EN & UART_RX_INT_PR7 & UART_TX_INT_EN & UART_TX_INT_PR7 ); // Como trabajar correctamente con los defines de uart.h?
}
return;
}
void CloseUART1_driver(void){
CloseUART1();
ConfigIntUART1( UART_RX_INT_DIS & UART_TX_INT_DIS );// Como trabajar correctamente con los defines de uart.h?
xSemaphoreGive( xMutexUartDriver );
return;
}
unsigned int ReadUART1_driver(void){
unsigned int data;
xQueueReceive( xQueueUartDriverRx, &data, portMAX_DELAY );
return data;
}
void WriteUART1_driver(unsigned int data){
xQueueSend( xQueueUartDriverTx, ( void * ) &data, portMAX_DELAY );
if( uxQueueMessagesWaiting( xQueueUartDriverTx ) ) // ¿¿??
IFS0bits.U1TXIF = 1; // ¿¿??
return;
}
void _ISR __attribute__((interrupt)) _U1RXInterrupt( void ){
//void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt( void ){
unsigned int data;
IFS0bits.U1RXIF = 0; // Clear flag
portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
data = ReadUART1();
xQueueSendFromISR( xQueueUartDriverRx, &data, &xHigherPriorityTaskWoken );
return;
}
void _ISR __attribute__((interrupt)) _U1TXInterrupt( void ){
//void __attribute__((__interrupt__, auto_psv)) _U1TXInterrupt( void ){
unsigned int data;
IFS0bits.U1TXIF = 0; // Clear flag
portBASE_TYPE xTaskWokenByReceive = pdFALSE;
xQueueReceiveFromISR( xQueueUartDriverTx, ( void * ) &data, &xTaskWokenByReceive );
WriteUART1( data );
return;
}
#endif // #ifndef UART_DRIVER_C