mbed library sources
Fork of mbed-src by
Diff: targets/hal/TARGET_NXP/TARGET_LPC15XX/serial_api.c
- Revision:
- 381:5460fc57b6e4
- Parent:
- 285:31249416b6f9
--- a/targets/hal/TARGET_NXP/TARGET_LPC15XX/serial_api.c Mon Nov 03 10:15:07 2014 +0000 +++ b/targets/hal/TARGET_NXP/TARGET_LPC15XX/serial_api.c Mon Nov 03 10:30:07 2014 +0000 @@ -111,7 +111,11 @@ error("No available UART"); } obj->index = uart_n; - obj->uart = (LPC_USART0_Type *)(LPC_USART0_BASE + (0x4000 * uart_n)); + switch (uart_n) { + case 0: obj->uart = (LPC_USART0_Type *)LPC_USART0_BASE; break; + case 1: obj->uart = (LPC_USART0_Type *)LPC_USART1_BASE; break; + case 2: obj->uart = (LPC_USART0_Type *)LPC_USART2_BASE; break; + } uart_used |= (1 << uart_n); switch_pin(&SWM_UART_TX[uart_n], tx); @@ -216,22 +220,14 @@ /****************************************************************************** * INTERRUPTS HANDLING ******************************************************************************/ -static inline void uart_irq(uint32_t iir, uint32_t index) { - // [Chapter 14] LPC17xx UART0/2/3: UARTn Interrupt Handling - SerialIrq irq_type; - switch (iir) { - case 1: irq_type = TxIrq; break; - case 2: irq_type = RxIrq; break; - default: return; - } - +static inline void uart_irq(SerialIrq irq_type, uint32_t index) { if (serial_irq_ids[index] != 0) irq_handler(serial_irq_ids[index], irq_type); } -void uart0_irq() {uart_irq((LPC_USART0->STAT & (1 << 2)) ? 2 : 1, 0);} -void uart1_irq() {uart_irq((LPC_USART1->STAT & (1 << 2)) ? 2 : 1, 1);} -void uart2_irq() {uart_irq((LPC_USART2->STAT & (1 << 2)) ? 2 : 1, 2);} +void uart0_irq() {uart_irq((LPC_USART0->INTSTAT & 1) ? RxIrq : TxIrq, 0);} +void uart1_irq() {uart_irq((LPC_USART1->INTSTAT & 1) ? RxIrq : TxIrq, 1);} +void uart2_irq() {uart_irq((LPC_USART2->INTSTAT & 1) ? RxIrq : TxIrq, 2);} void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) { irq_handler = handler; @@ -248,7 +244,8 @@ } if (enable) { - obj->uart->INTENSET = (1 << ((irq == RxIrq) ? 0 : 2)); + NVIC_DisableIRQ(irq_n); + obj->uart->INTENSET |= (1 << ((irq == RxIrq) ? 0 : 2)); NVIC_SetVector(irq_n, vector); NVIC_EnableIRQ(irq_n); } else { // disable