diff --git a/targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c index 47e878062e..2cc458d501 100644 --- a/targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M2351/serial_api.c @@ -85,9 +85,10 @@ static void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable); static int serial_is_rx_complete(serial_t *obj); static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch); -static int serial_is_irq_en(serial_t *obj, SerialIrq irq); #endif +static int serial_is_irq_en(serial_t *obj, SerialIrq irq); + bool serial_can_deep_sleep(void); static struct nu_uart_var uart0_var = { @@ -531,7 +532,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOINT_Msk)) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next read. UART_DISABLE_INT(uart_base, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk)); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, RxIrq)) { + // Call irq_handler() only when RxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, RxIrq); } } @@ -539,7 +541,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & UART_INTSTS_THREINT_Msk) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next write. UART_DISABLE_INT(uart_base, UART_INTEN_THREIEN_Msk); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, TxIrq)) { + // Call irq_handler() only when TxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, TxIrq); } } @@ -1179,6 +1182,8 @@ static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch) } } +#endif // #if DEVICE_SERIAL_ASYNCH + static int serial_is_irq_en(serial_t *obj, SerialIrq irq) { int inten_msk = 0; @@ -1195,8 +1200,6 @@ static int serial_is_irq_en(serial_t *obj, SerialIrq irq) return !! inten_msk; } -#endif // #if DEVICE_SERIAL_ASYNCH - bool serial_can_deep_sleep(void) { bool sleep_allowed = 1; diff --git a/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c index 7ff9ca6ff7..d361d68ca4 100644 --- a/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M451/serial_api.c @@ -81,9 +81,10 @@ static void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable); static int serial_is_rx_complete(serial_t *obj); static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch); -static int serial_is_irq_en(serial_t *obj, SerialIrq irq); #endif +static int serial_is_irq_en(serial_t *obj, SerialIrq irq); + bool serial_can_deep_sleep(void); static struct nu_uart_var uart0_var = { @@ -464,7 +465,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOINT_Msk)) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next read. UART_DISABLE_INT(uart_base, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk)); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, RxIrq)) { + // Call irq_handler() only when RxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, RxIrq); } } @@ -472,7 +474,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & UART_INTSTS_THREINT_Msk) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next write. UART_DISABLE_INT(uart_base, UART_INTEN_THREIEN_Msk); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, TxIrq)) { + // Call irq_handler() only when TxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, TxIrq); } } @@ -1102,6 +1105,8 @@ static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch) } } +#endif // #if DEVICE_SERIAL_ASYNCH + static int serial_is_irq_en(serial_t *obj, SerialIrq irq) { int inten_msk = 0; @@ -1118,8 +1123,6 @@ static int serial_is_irq_en(serial_t *obj, SerialIrq irq) return !! inten_msk; } -#endif // #if DEVICE_SERIAL_ASYNCH - bool serial_can_deep_sleep(void) { bool sleep_allowed = 1; diff --git a/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c b/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c index 6a69e06c71..cfdc75bdcd 100644 --- a/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_M480/serial_api.c @@ -85,9 +85,10 @@ static void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable); static int serial_is_rx_complete(serial_t *obj); static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch); -static int serial_is_irq_en(serial_t *obj, SerialIrq irq); #endif +static int serial_is_irq_en(serial_t *obj, SerialIrq irq); + bool serial_can_deep_sleep(void); static struct nu_uart_var uart0_var = { @@ -519,7 +520,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOINT_Msk)) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next read. UART_DISABLE_INT(uart_base, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk)); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, RxIrq)) { + // Call irq_handler() only when RxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, RxIrq); } } @@ -527,7 +529,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & UART_INTSTS_THREINT_Msk) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next write. UART_DISABLE_INT(uart_base, UART_INTEN_THREIEN_Msk); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, TxIrq)) { + // Call irq_handler() only when TxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, TxIrq); } } @@ -1154,6 +1157,8 @@ static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch) } } +#endif // #if DEVICE_SERIAL_ASYNCH + static int serial_is_irq_en(serial_t *obj, SerialIrq irq) { int inten_msk = 0; @@ -1170,8 +1175,6 @@ static int serial_is_irq_en(serial_t *obj, SerialIrq irq) return !! inten_msk; } -#endif // #if DEVICE_SERIAL_ASYNCH - bool serial_can_deep_sleep(void) { bool sleep_allowed = 1; diff --git a/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c b/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c index df19c2f8a5..3cc41eca42 100644 --- a/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NANO100/serial_api.c @@ -74,9 +74,10 @@ static void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable); static int serial_is_rx_complete(serial_t *obj); static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch); -static int serial_is_irq_en(serial_t *obj, SerialIrq irq); #endif +static int serial_is_irq_en(serial_t *obj, SerialIrq irq); + bool serial_can_deep_sleep(void); static struct nu_uart_var uart0_var = { @@ -426,7 +427,8 @@ static void uart_irq(serial_t *obj) if (uart_base->ISR & (UART_ISR_RDA_IS_Msk | UART_ISR_RTO_IS_Msk)) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next read. UART_DISABLE_INT(uart_base, (UART_IER_RDA_IE_Msk | UART_IER_RTO_IE_Msk)); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, RxIrq)) { + // Call irq_handler() only when RxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, RxIrq); } } @@ -434,7 +436,8 @@ static void uart_irq(serial_t *obj) if (uart_base->ISR & UART_ISR_THRE_IS_Msk) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next write. UART_DISABLE_INT(uart_base, UART_IER_THRE_IE_Msk); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, TxIrq)) { + // Call irq_handler() only when TxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, TxIrq); } } @@ -1003,6 +1006,8 @@ static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch) } } +#endif // #if DEVICE_SERIAL_ASYNCH + static int serial_is_irq_en(serial_t *obj, SerialIrq irq) { int ier_msk = 0; @@ -1019,8 +1024,6 @@ static int serial_is_irq_en(serial_t *obj, SerialIrq irq) return !! ier_msk; } -#endif // #if DEVICE_SERIAL_ASYNCH - bool serial_can_deep_sleep(void) { bool sleep_allowed = 1; diff --git a/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c b/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c index 65d21697d1..c21b65eb39 100644 --- a/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c +++ b/targets/TARGET_NUVOTON/TARGET_NUC472/serial_api.c @@ -85,9 +85,10 @@ static void serial_rx_enable_event(serial_t *obj, int event, uint8_t enable); static int serial_is_rx_complete(serial_t *obj); static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch); -static int serial_is_irq_en(serial_t *obj, SerialIrq irq); #endif +static int serial_is_irq_en(serial_t *obj, SerialIrq irq); + bool serial_can_deep_sleep(void); static struct nu_uart_var uart0_var = { @@ -504,7 +505,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOINT_Msk)) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next read. UART_DISABLE_INT(uart_base, (UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk)); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, RxIrq)) { + // Call irq_handler() only when RxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, RxIrq); } } @@ -512,7 +514,8 @@ static void uart_irq(serial_t *obj) if (uart_base->INTSTS & UART_INTSTS_THREINT_Msk) { // Simulate clear of the interrupt flag. Temporarily disable the interrupt here and to be recovered on next write. UART_DISABLE_INT(uart_base, UART_INTEN_THREIEN_Msk); - if (obj->serial.irq_handler) { + if (obj->serial.irq_handler && serial_is_irq_en(obj, TxIrq)) { + // Call irq_handler() only when TxIrq is enabled ((uart_irq_handler) obj->serial.irq_handler)(obj->serial.irq_id, TxIrq); } } @@ -1148,6 +1151,8 @@ static void serial_check_dma_usage(DMAUsage *dma_usage, int *dma_ch) } } +#endif // #if DEVICE_SERIAL_ASYNCH + static int serial_is_irq_en(serial_t *obj, SerialIrq irq) { int inten_msk = 0; @@ -1164,8 +1169,6 @@ static int serial_is_irq_en(serial_t *obj, SerialIrq irq) return !! inten_msk; } -#endif // #if DEVICE_SERIAL_ASYNCH - bool serial_can_deep_sleep(void) { bool sleep_allowed = 1;