You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
3.6 KiB

#include "app_uart.h"
#include "app_ring_buffer.h"
#include "sw_timer.h"
static uart_req_t App_Uart_Read_Req;;
static uint8_t TxBuffer[APP_UART_TX_BUFFER_SIZE];
static uint8_t RxBuffer[APP_UART_RX_BUFFER_SIZE];
static uint8_t RxData;
static RING_BUFFER Tx_RingBuffer;
static RING_BUFFER Rx_RingBuffer;
static int32_t UartError = E_NO_ERROR;
static void App_Uart_Interrupt_Handler(void);
static void App_Uart_Data_Transmit_Check(void);
static void App_Uart_Read_Callback_Initialization(void);
static void App_Uart_Read_Callback(uart_req_t* req, int error);
int fputc( int ch, FILE* f )
{
RingBuffer_Enqueue(&Tx_RingBuffer, ch);
//UART_WriteByte(UART_App_INSTANCE, ch);
return( ch );
}
int32_t App_Uart_Initialization(void)
{
mxc_uart_regs_t* uart = APP_UART_INSTANCE;
const sys_cfg_uart_t sys_uart_cfg =
{
APP_UART_ALTERNATE,
UART_FLOW_DISABLE,
};
/* Initialize the UART */
uart_cfg_t cfg;
cfg.parity = UART_PARITY_DISABLE;
cfg.size = UART_DATA_SIZE_8_BITS;
cfg.stop = UART_STOP_1;
cfg.flow = UART_FLOW_CTRL_DIS;
cfg.pol = UART_FLOW_POL_DIS;
cfg.baud = APP_UART_BUADRATE;
while (!(uart->status & MXC_F_UART_STATUS_TX_EMPTY))
{
;
}
// Initialize the UART
if ((UartError = UART_Init(uart, &cfg, &sys_uart_cfg)) != E_NO_ERROR)
{
return UartError;
}
if(uart == MXC_UART0)
{
NVIC_ClearPendingIRQ(UART0_IRQn);
NVIC_DisableIRQ(UART0_IRQn);
NVIC_SetVector(UART0_IRQn, App_Uart_Interrupt_Handler);
NVIC_EnableIRQ(UART0_IRQn);
}
else if(uart == MXC_UART1)
{
NVIC_ClearPendingIRQ(UART1_IRQn);
NVIC_DisableIRQ(UART1_IRQn);
NVIC_SetVector(UART1_IRQn, App_Uart_Interrupt_Handler);
NVIC_EnableIRQ(UART1_IRQn);
}
UART_ClearFlags (uart, 0xFFFFFFFF);
//MXC_UART_EnableInt (uart, MXC_F_UART_REVA_INT_EN_RX_FIFO_THRESH|MXC_F_UART_REVA_INT_EN_TX_FIFO_ALMOST_EMPTY);
RingBuffer_Initialization(&Tx_RingBuffer, true, APP_UART_TX_BUFFER_SIZE, TxBuffer);
RingBuffer_Initialization(&Rx_RingBuffer, true, APP_UART_RX_BUFFER_SIZE, RxBuffer);
App_Uart_Read_Callback_Initialization();
SW_Timer_Callback_Register(SW_TIMER_RUN_CONTINUE, 0, App_Uart_Data_Transmit_Check);
return E_SUCCESS;
}
static void App_Uart_Read_Callback_Initialization(void)
{
App_Uart_Read_Req.data = &RxData;
App_Uart_Read_Req.len = 1;
App_Uart_Read_Req.callback = App_Uart_Read_Callback;
UART_ReadAsync(APP_UART_INSTANCE, &App_Uart_Read_Req);
}
void App_Uart_Interrupt_Handler(void)
{
UART_Handler(APP_UART_INSTANCE);
}
static void App_Uart_Read_Callback(uart_req_t* req, int error)
{
RingBuffer_Enqueue(&Rx_RingBuffer, RxData);
RingBuffer_Enqueue(&Tx_RingBuffer, RxData);
App_Uart_Read_Callback_Initialization();
}
static void App_Uart_Data_Transmit_Check(void)
{
if(RingBuffer_Get_DataSize(&Tx_RingBuffer) != 0 && UART_Busy(APP_UART_INSTANCE) == E_NO_ERROR)
{
uint8_t TxData;
RingBuffer_GetData(&Tx_RingBuffer, &TxData);
UART_WriteByte(APP_UART_INSTANCE, TxData);
RingBuffer_PopData(&Tx_RingBuffer);
}
}
int32_t App_Uart_Transmit(uint8_t TxData)
{
RingBuffer_Enqueue(&Tx_RingBuffer, TxData);
return true;
}
int32_t App_Uart_Get_Last_Error(void)
{
return UartError;
}
bool App_Uart_Get_Recv_Data(uint8_t* pRxData)
{
if(RingBuffer_Get_DataSize(&Rx_RingBuffer) == 0)
return false;
return RingBuffer_Dequeue(&Rx_RingBuffer, pRxData);
}
int printf_none(const char *fmt, ...)
{
return 0;
}