diff --git a/targets/TARGET_Maxim/TARGET_MAX32660/serial_api.c b/targets/TARGET_Maxim/TARGET_MAX32660/serial_api.c index 6667883235..7452f21e83 100644 --- a/targets/TARGET_Maxim/TARGET_MAX32660/serial_api.c +++ b/targets/TARGET_Maxim/TARGET_MAX32660/serial_api.c @@ -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); diff --git a/targets/TARGET_Maxim/TARGET_MAX32670/serial_api.c b/targets/TARGET_Maxim/TARGET_MAX32670/serial_api.c index 8554dce187..76abac7ef7 100644 --- a/targets/TARGET_Maxim/TARGET_MAX32670/serial_api.c +++ b/targets/TARGET_Maxim/TARGET_MAX32670/serial_api.c @@ -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);