* updated with changes for serial with interrupt. Working for example 51 in mbed projects.

pull/1214/head
akhilpanayamparambil 2015-06-24 12:09:50 +05:30 committed by Karthik Purushothaman
parent a7b60a4398
commit c59613727e
1 changed files with 19 additions and 21 deletions

View File

@ -235,8 +235,6 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
uint32_t muxsetting = 0;
uint32_t padsetting[4] = {0};
pUSART_S(obj) = EXT1_UART_MODULE;
/* Disable USART module */
disable_usart(obj);
@ -248,21 +246,27 @@ void serial_init(serial_t *obj, PinName tx, PinName rx)
switch (sercom_index) {
case 0:
uart = UART_0;
pUSART_S(obj) = SERCOM0;
break;
case 1:
uart = UART_1;
pUSART_S(obj) = SERCOM1;
break;
case 2:
uart = UART_2;
pUSART_S(obj) = SERCOM2;
break;
case 3:
uart = UART_3;
pUSART_S(obj) = SERCOM3;
break;
case 4:
uart = UART_4;
pUSART_S(obj) = SERCOM4;
break;
case 5:
uart = UART_5;
pUSART_S(obj) = SERCOM5;
break;
}
@ -514,9 +518,10 @@ static inline void uart_irq(SercomUsart *const usart, uint32_t index)
uint16_t interrupt_status;
interrupt_status = usart->INTFLAG.reg;
interrupt_status &= usart->INTENSET.reg;
if (serial_irq_ids[index] != 0) {
if (interrupt_status & SERCOM_USART_INTFLAG_TXC) { // for transmit complete
usart->INTENCLR.reg = SERCOM_USART_INTFLAG_TXC;
usart->INTFLAG.reg = SERCOM_USART_INTFLAG_TXC;
irq_handler(serial_irq_ids[index], TxIrq);
}
/*if (interrupt_status & SERCOM_USART_INTFLAG_DRE) // for data ready for transmit
@ -533,7 +538,7 @@ static inline void uart_irq(SercomUsart *const usart, uint32_t index)
}
}*/
if (interrupt_status & SERCOM_USART_INTFLAG_RXC) { // for receive complete
usart->INTENCLR.reg = SERCOM_USART_INTFLAG_RXC;
usart->INTFLAG.reg = SERCOM_USART_INTFLAG_RXC;
irq_handler(serial_irq_ids[index], RxIrq);
}
}
@ -579,45 +584,41 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
{
IRQn_Type irq_n = (IRQn_Type)0;
uint32_t vector = 0;
uint32_t ctrlb = 0;
disable_usart(obj);
ctrlb = _USART(obj).CTRLB.reg;
switch ((int)pUSART_S(obj)) {
case UART_0:
irq_n = SERCOM0_IRQn;
vector = (uint32_t)&uart0_irq;
vector = (uint32_t)uart0_irq;
break;
case UART_1:
irq_n = SERCOM1_IRQn;
vector = (uint32_t)&uart1_irq;
vector = (uint32_t)uart1_irq;
break;
case UART_2:
irq_n = SERCOM2_IRQn;
vector = (uint32_t)&uart2_irq;
vector = (uint32_t)uart2_irq;
break;
case UART_3:
irq_n = SERCOM3_IRQn;
vector = (uint32_t)&uart3_irq;
vector = (uint32_t)uart3_irq;
break;
case UART_4:
irq_n = SERCOM4_IRQn;
vector = (uint32_t)&uart4_irq;
vector = (uint32_t)uart4_irq;
break;
case UART_5:
irq_n = SERCOM5_IRQn;
vector = (uint32_t)&uart5_irq;
vector = (uint32_t)uart5_irq;
break;
}
if (enable) {
switch (irq) {
case RxIrq:
ctrlb |= (SERCOM_USART_CTRLB_RXEN);
_USART(obj).INTENSET.reg = SERCOM_USART_INTFLAG_RXC;
break;
case TxIrq:
ctrlb |= (SERCOM_USART_CTRLB_TXEN);
_USART(obj).INTENSET.reg = SERCOM_USART_INTFLAG_TXC;
break;
}
NVIC_SetVector(irq_n, vector);
@ -626,16 +627,14 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
} else {
switch (irq) {
case RxIrq:
ctrlb &= ~(SERCOM_USART_CTRLB_RXEN);
break;
_USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_RXC;
break;
case TxIrq:
ctrlb &= ~(SERCOM_USART_CTRLB_TXEN);
_USART(obj).INTENCLR.reg = SERCOM_USART_INTFLAG_TXC;
break;
}
NVIC_DisableIRQ(irq_n);
}
_USART(obj).CTRLB.reg = ctrlb;
enable_usart(obj);
}
@ -644,7 +643,6 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
******************************************************************************/
int serial_getc(serial_t *obj)
{
_USART(obj).INTENSET.reg = SERCOM_USART_INTFLAG_RXC; // test
while (!serial_readable(obj));
return _USART(obj).DATA.reg ;
}