@@ -1008,7 +1008,7 @@ void serial_free(serial_t *obj)
1008
1008
if (nordic_nrf5_uart_state [instance ].usage_counter == 0 ) {
1009
1009
1010
1010
nrf_uarte_disable (nordic_nrf5_uart_register [instance ]);
1011
-
1011
+
1012
1012
/* Turn NRF_UARTE0_BASE or NRF_UARTE1_BASE power off and on to reset peripheral. */
1013
1013
if (instance == 0 ) {
1014
1014
* (volatile uint32_t * )0x40002FFC = 0 ;
@@ -1022,7 +1022,7 @@ void serial_free(serial_t *obj)
1022
1022
* (volatile uint32_t * )0x40028FFC = 1 ;
1023
1023
}
1024
1024
#endif
1025
-
1025
+
1026
1026
}
1027
1027
}
1028
1028
}
@@ -1273,6 +1273,8 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
1273
1273
struct serial_s * uart_object = obj ;
1274
1274
#endif
1275
1275
1276
+ int instance = uart_object -> instance ;
1277
+
1276
1278
/* Convert Mbed type to Nordic IRQ mask. */
1277
1279
uint32_t type = (irq == TxIrq ) ? NORDIC_TX_IRQ : NORDIC_RX_IRQ ;
1278
1280
@@ -1282,10 +1284,20 @@ void serial_irq_set(serial_t *obj, SerialIrq irq, uint32_t enable)
1282
1284
uart_object -> mask |= type ;
1283
1285
nordic_nrf5_serial_configure (obj );
1284
1286
1287
+ /* It is required by Mbed HAL API to generate TxIrq interrupt when TXD register is empty (also after enabling TxIrq interrupt).
1288
+ Driver uses DMA to perform uart transfer and TxIrq is generated after the transfer is finished.
1289
+ Trigger TxIrq interrupt manually on enabling the TxIrq. */
1290
+ if (irq == TxIrq ) {
1291
+ if (nrf_uarte_event_check (nordic_nrf5_uart_register [instance ], NRF_UARTE_EVENT_TXDRDY )) {
1292
+ nordic_swi_tx_trigger (instance );
1293
+ }
1294
+ }
1285
1295
} else {
1286
1296
1287
1297
uart_object -> mask &= ~type ;
1288
1298
}
1299
+
1300
+
1289
1301
}
1290
1302
1291
1303
/** Get character. This is a blocking call, waiting for a character
0 commit comments