Merge pull request #15426 from MaximIntegrated/fix_bug_uart

Fix bug uart
pull/15432/head
Saheer Babu 2023-06-07 11:56:41 +01:00 committed by GitHub
commit f347b89d0d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 94 additions and 100 deletions

View File

@ -67,6 +67,35 @@ static serial_t *objs[MXC_UART_INSTANCES];
static void usurp_pin(PinName, int);
//******************************************************************************
void uart_handler(serial_t *obj)
{
// clear interrupts
volatile uint32_t flags = obj->uart->int_fl;
if (flags & UART_ER_IE) {
// clear error flags
obj->uart->int_fl = UART_ER_IE;
}
if (flags & UART_RX_IE) {
obj->uart->int_fl = UART_RX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, RxIrq);
}
}
if (flags & UART_TX_IE) {
obj->uart->int_fl = UART_TX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, TxIrq);
}
}
}
void uart0_handler(void) { uart_handler(objs[0]); }
void uart1_handler(void) { uart_handler(objs[1]); }
//******************************************************************************
void serial_init(serial_t *obj, PinName tx, PinName rx)
{
@ -106,6 +135,19 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
MXC_UART_Init (obj->uart, DEFAULT_BAUD, obj->map);
//MBED_ASSERT(retval == E_NO_ERROR);
switch (obj->index) {
case 0:
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
NVIC_EnableIRQ(UART0_IRQn);
break;
case 1:
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
NVIC_EnableIRQ(UART1_IRQn);
break;
}
return;
}
void serial_free(serial_t *obj)
@ -158,35 +200,6 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
}
}
//******************************************************************************
void uart_handler(serial_t *obj)
{
// clear interrupts
volatile uint32_t flags = obj->uart->int_fl;
if (flags & UART_ER_IE) {
// clear error flags
obj->uart->int_fl = UART_ER_IE;
}
if (flags & UART_RX_IE) {
obj->uart->int_fl = UART_RX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, RxIrq);
}
}
if (flags & UART_TX_IE) {
obj->uart->int_fl = UART_TX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, TxIrq);
}
}
}
void uart0_handler(void) { uart_handler(objs[0]); }
void uart1_handler(void) { uart_handler(objs[1]); }
//******************************************************************************
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
{
@ -200,22 +213,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
MBED_ASSERT(obj->index < MXC_UART_INSTANCES);
objs[obj->index] = obj;
switch (obj->index) {
case 0:
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
NVIC_EnableIRQ(UART0_IRQn);
break;
case 1:
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
NVIC_EnableIRQ(UART1_IRQn);
break;
default:
MBED_ASSERT(0);
}
// Clear pending interrupts
obj->uart->int_fl = obj->uart->int_fl;
// Set TX Almost Empty level to interrupt when empty
obj->uart->ctrl1 = (MXC_F_UART_THRESH_CTRL_RX_FIFO_DEFAULT_THRESH_VAL | MXC_F_UART_THRESH_CTRL_TX_FIFO_DEFAULT_THRESH_VAL);

View File

@ -63,6 +63,37 @@ static serial_t *objs[MXC_UART_INSTANCES];
static void usurp_pin(PinName, int);
//******************************************************************************
void uart_handler(serial_t *obj)
{
// clear interrupts
volatile uint32_t flags = obj->uart->int_fl;
if (flags & UART_ER_IE) {
// clear error flags
obj->uart->int_fl = UART_ER_IE;
}
if (flags & UART_RX_IE) {
obj->uart->int_fl = UART_RX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, RxIrq);
}
}
if (flags & UART_TX_IE) {
obj->uart->int_fl = UART_TX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, TxIrq);
}
}
}
void uart0_handler(void) { uart_handler(objs[0]); }
void uart1_handler(void) { uart_handler(objs[1]); }
void uart2_handler(void) { uart_handler(objs[2]); }
void uart3_handler(void) { uart_handler(objs[3]); }
//******************************************************************************
void serial_init(serial_t *obj, PinName tx, PinName rx)
{
@ -101,6 +132,27 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
MXC_UART_Init (obj->uart, DEFAULT_BAUD, MXC_UART_APB_CLK, obj->map);
//MBED_ASSERT(retval == E_NO_ERROR);
switch (obj->index) {
case 0:
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
NVIC_EnableIRQ(UART0_IRQn);
break;
case 1:
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
NVIC_EnableIRQ(UART1_IRQn);
break;
case 2:
NVIC_SetVector(UART2_IRQn, (uint32_t)uart2_handler);
NVIC_EnableIRQ(UART2_IRQn);
break;
case 3:
NVIC_SetVector(UART3_IRQn, (uint32_t)uart3_handler);
NVIC_EnableIRQ(UART3_IRQn);
break;
}
return;
}
void serial_free(serial_t *obj)
@ -153,37 +205,6 @@ void serial_format(serial_t *obj, int data_bits, SerialParity parity, int stop_b
}
}
//******************************************************************************
void uart_handler(serial_t *obj)
{
// clear interrupts
volatile uint32_t flags = obj->uart->int_fl;
if (flags & UART_ER_IE) {
// clear error flags
obj->uart->int_fl = UART_ER_IE;
}
if (flags & UART_RX_IE) {
obj->uart->int_fl = UART_RX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, RxIrq);
}
}
if (flags & UART_TX_IE) {
obj->uart->int_fl = UART_TX_IE;
if (obj && irq_handler) {
irq_handler(obj->id, TxIrq);
}
}
}
void uart0_handler(void) { uart_handler(objs[0]); }
void uart1_handler(void) { uart_handler(objs[1]); }
void uart2_handler(void) { uart_handler(objs[2]); }
void uart3_handler(void) { uart_handler(objs[3]); }
//******************************************************************************
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id)
{
@ -197,30 +218,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
MBED_ASSERT(obj->index < MXC_UART_INSTANCES);
objs[obj->index] = obj;
switch (obj->index) {
case 0:
NVIC_SetVector(UART0_IRQn, (uint32_t)uart0_handler);
NVIC_EnableIRQ(UART0_IRQn);
break;
case 1:
NVIC_SetVector(UART1_IRQn, (uint32_t)uart1_handler);
NVIC_EnableIRQ(UART1_IRQn);
break;
case 2:
NVIC_SetVector(UART2_IRQn, (uint32_t)uart2_handler);
NVIC_EnableIRQ(UART2_IRQn);
break;
case 3:
NVIC_SetVector(UART3_IRQn, (uint32_t)uart3_handler);
NVIC_EnableIRQ(UART3_IRQn);
break;
default:
MBED_ASSERT(0);
}
// Clear pending interrupts
obj->uart->int_fl = obj->uart->int_fl;
// Set TX Almost Empty level to interrupt when empty
MXC_UART_SetRXThreshold(obj->uart, 1);