[LPC11U68] fix Uart1-4 irq handling bugs and add Pins P0_14,P0_13 for use with Uart1

pull/1301/head
Bernator 2015-08-17 19:12:28 +02:00
parent 846f487a1a
commit 8f50e1e9ea
1 changed files with 40 additions and 13 deletions

View File

@ -50,6 +50,7 @@ static const PinMap PinMap_UART_TX[] = {
{P1_18, UART_0, 2}, {P1_18, UART_0, 2},
{P1_27, UART_0, 2}, {P1_27, UART_0, 2},
{P1_8 , UART_1, 2}, {P1_8 , UART_1, 2},
{P0_14, UART_1, 4},
{P1_0 , UART_2, 3}, {P1_0 , UART_2, 3},
{P1_23, UART_2, 3}, {P1_23, UART_2, 3},
{P2_4 , UART_3, 1}, {P2_4 , UART_3, 1},
@ -62,6 +63,7 @@ static const PinMap PinMap_UART_RX[] = {
{P1_17, UART_0, 2}, {P1_17, UART_0, 2},
{P1_26, UART_0, 2}, {P1_26, UART_0, 2},
{P1_2 , UART_1, 3}, {P1_2 , UART_1, 3},
{P0_13, UART_1, 4},
{P0_20, UART_2, 2}, {P0_20, UART_2, 2},
{P1_6 , UART_2, 2}, {P1_6 , UART_2, 2},
{P2_3 , UART_3, 1}, {P2_3 , UART_3, 1},
@ -323,22 +325,42 @@ void uart0_irq()
void uart1_irq() void uart1_irq()
{ {
uart_irq((LPC_USART1->STAT & (1 << 2)) ? 2 : 1, 1); if(LPC_USART1->STAT & (1 << 2)){
uart_irq(1, 1);
}
if(LPC_USART1->STAT & (1 << 0)){
uart_irq(2, 1);
}
} }
void uart2_irq() void uart2_irq()
{ {
uart_irq((LPC_USART1->STAT & (1 << 2)) ? 2 : 1, 2); if(LPC_USART2->STAT & (1 << 2)){
uart_irq(1, 2);
}
if(LPC_USART2->STAT & (1 << 0)){
uart_irq(2, 2);
}
} }
void uart3_irq() void uart3_irq()
{ {
uart_irq((LPC_USART1->STAT & (1 << 2)) ? 2 : 1, 3); if(LPC_USART3->STAT & (1 << 2)){
uart_irq(1, 3);
}
if(LPC_USART3->STAT & (1 << 0)){
uart_irq(2, 3);
}
} }
void uart4_irq() void uart4_irq()
{ {
uart_irq((LPC_USART1->STAT & (1 << 2)) ? 2 : 1, 4); if(LPC_USART4->STAT & (1 << 2)){
uart_irq(1, 4);
}
if(LPC_USART4->STAT & (1 << 0)){
uart_irq(2, 4);
}
} }
void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) { void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
@ -349,12 +371,17 @@ void serial_irq_handler(serial_t *obj, uart_irq_handler handler, uint32_t id) {
void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) { void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
IRQn_Type irq_n = (IRQn_Type)0; IRQn_Type irq_n = (IRQn_Type)0;
uint32_t vector = 0; uint32_t vector = 0;
switch ((int)obj->uart) { if(obj->index == 0){
case UART_0: irq_n = USART0_IRQn; vector = (uint32_t)&uart0_irq; break; irq_n = USART0_IRQn; vector = (uint32_t)&uart0_irq;
case UART_1: irq_n = USART1_4_IRQn; vector = (uint32_t)&uart1_irq; break; }
case UART_2: irq_n = USART2_3_IRQn; vector = (uint32_t)&uart2_irq; break; else{
case UART_3: irq_n = USART2_3_IRQn; vector = (uint32_t)&uart3_irq; break; switch ((int)obj->mini_uart) {
case UART_4: irq_n = USART1_4_IRQn; vector = (uint32_t)&uart4_irq; break; case UART_0: irq_n = USART0_IRQn; vector = (uint32_t)&uart0_irq; break;
case UART_1: irq_n = USART1_4_IRQn; vector = (uint32_t)&uart1_irq; break;
case UART_2: irq_n = USART2_3_IRQn; vector = (uint32_t)&uart2_irq; break;
case UART_3: irq_n = USART2_3_IRQn; vector = (uint32_t)&uart3_irq; break;
case UART_4: irq_n = USART1_4_IRQn; vector = (uint32_t)&uart4_irq; break;
}
} }
if (enable) { if (enable) {
@ -368,15 +395,15 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable) {
NVIC_EnableIRQ(irq_n); NVIC_EnableIRQ(irq_n);
} else { // disable } else { // disable
int all_disabled = 0; int all_disabled = 0;
SerialIrq other_irq = (irq == RxIrq) ? (TxIrq) : (RxIrq); SerialIrq other_irq = (irq == RxIrq) ? (RxIrq) : (TxIrq);
if (obj->index == 0) { if (obj->index == 0) {
obj->uart->IER &= ~(1 << irq); obj->uart->IER &= ~(1 << irq);
all_disabled = (obj->uart->IER & (1 << other_irq)) == 0; all_disabled = (obj->uart->IER & (1 << other_irq)) == 0;
} }
else { else {
obj->mini_uart->INTENSET &= ~(1 << ((irq == RxIrq) ? 0 : 2)); obj->mini_uart->INTENCLR = (1 << ((irq == RxIrq) ? 0 : 2));
all_disabled = (obj->mini_uart->INTENSET & (1 << ((other_irq == RxIrq) ? 0 : 2))) == 0; all_disabled = (obj->mini_uart->INTENSET) == 0;
} }
if (all_disabled) if (all_disabled)