mirror of https://github.com/ARMmbed/mbed-os.git
Fixed interrupt handler in serial_api.c for the Nordic NRF51. The last byte sent in a sequence would not correctly clear the interrupt flag.
parent
29ab478a78
commit
e34e16d311
|
@ -162,14 +162,20 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
void UART0_IRQHandler()
|
void UART0_IRQHandler()
|
||||||
{
|
{
|
||||||
uint32_t irtype = 0;
|
if((NRF_UART0->INTENSET & UART_INTENSET_TXDRDY_Msk) && NRF_UART0->EVENTS_TXDRDY)
|
||||||
|
{
|
||||||
|
uart_irq(1, 0);
|
||||||
|
|
||||||
if((NRF_UART0->INTENSET & 0x80) && NRF_UART0->EVENTS_TXDRDY) {
|
/* Explicitly clear TX flag to prevent interrupt from firing
|
||||||
irtype = 1;
|
immediately after returning from ISR. This ensures that the
|
||||||
} else if((NRF_UART0->INTENSET & 0x04) && NRF_UART0->EVENTS_RXDRDY) {
|
last interrupt in a transmission sequence is correcly handled.
|
||||||
irtype = 2;
|
*/
|
||||||
|
NRF_UART0->EVENTS_TXDRDY = 0;
|
||||||
|
}
|
||||||
|
else if((NRF_UART0->INTENSET & UART_INTENSET_RXDRDY_Msk) && NRF_UART0->EVENTS_RXDRDY)
|
||||||
|
{
|
||||||
|
uart_irq(2, 0);
|
||||||
}
|
}
|
||||||
uart_irq(irtype, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -238,6 +244,18 @@ int serial_getc(serial_t *obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
void serial_putc(serial_t *obj, int c)
|
void serial_putc(serial_t *obj, int c)
|
||||||
|
{
|
||||||
|
/* In interrupt mode, send character immediately. Otherwise, block until
|
||||||
|
UART is ready to receive next character before sending.
|
||||||
|
|
||||||
|
The TXDRDY flag is cleared in interrupt handler to ensure that it is
|
||||||
|
cleared even if there are no more characters to send.
|
||||||
|
*/
|
||||||
|
if (NRF_UART0->INTENSET & UART_INTENSET_TXDRDY_Msk)
|
||||||
|
{
|
||||||
|
obj->uart->TXD = (uint8_t)c;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
while (!serial_writable(obj)) {
|
while (!serial_writable(obj)) {
|
||||||
}
|
}
|
||||||
|
@ -245,6 +263,7 @@ void serial_putc(serial_t *obj, int c)
|
||||||
obj->uart->EVENTS_TXDRDY = 0;
|
obj->uart->EVENTS_TXDRDY = 0;
|
||||||
obj->uart->TXD = (uint8_t)c;
|
obj->uart->TXD = (uint8_t)c;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int serial_readable(serial_t *obj)
|
int serial_readable(serial_t *obj)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue