Skip to content

Commit 3b17888

Browse files
authored
Merge pull request #8048 from naveenkaje/upstream_based_uart_fix_for_assert_test
NRF52: serial_api: Use polling for putc
2 parents c48c2ec + 28c63ec commit 3b17888

File tree

2 files changed

+40
-21
lines changed

2 files changed

+40
-21
lines changed

targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_NRF52/serial_api.c

Lines changed: 7 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1439,6 +1439,7 @@ int serial_getc(serial_t *obj)
14391439
*/
14401440
void serial_putc(serial_t *obj, int character)
14411441
{
1442+
bool done = false;
14421443
MBED_ASSERT(obj);
14431444

14441445
#if DEVICE_SERIAL_ASYNCH
@@ -1449,35 +1450,20 @@ void serial_putc(serial_t *obj, int character)
14491450

14501451
int instance = uart_object->instance;
14511452

1452-
/**
1453-
* tx_in_progress acts like a mutex to ensure only one transmission can be active at a time.
1454-
* The flag is modified using the atomic compare-and-set function.
1455-
*/
1456-
bool mutex = false;
1457-
1458-
do {
1459-
uint8_t expected = 0;
1460-
uint8_t desired = 1;
1461-
1462-
mutex = core_util_atomic_cas_u8((uint8_t *) &nordic_nrf5_uart_state[instance].tx_in_progress, &expected, desired);
1463-
} while (mutex == false);
1464-
1465-
/* Take ownership and configure UART if necessary. */
14661453
nordic_nrf5_serial_configure(obj);
1467-
14681454
/* Arm Tx DMA buffer. */
14691455
nordic_nrf5_uart_state[instance].tx_data = character;
14701456
nrf_uarte_tx_buffer_set(nordic_nrf5_uart_register[instance],
14711457
&nordic_nrf5_uart_state[instance].tx_data,
14721458
1);
1473-
1474-
/* Clear ENDTX event and enable interrupts. */
14751459
nrf_uarte_event_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_ENDTX);
1476-
nrf_uarte_int_enable(nordic_nrf5_uart_register[instance], NRF_UARTE_INT_ENDTX_MASK);
1460+
nrf_uarte_task_trigger(nordic_nrf5_uart_register[instance], NRF_UARTE_TASK_STARTTX);
14771461

1478-
/* Trigger DMA transfer. */
1479-
nrf_uarte_task_trigger(nordic_nrf5_uart_register[instance],
1480-
NRF_UARTE_TASK_STARTTX);
1462+
do {
1463+
done = nrf_uarte_event_extra_check(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY);
1464+
} while(done == false);
1465+
1466+
nrf_uarte_event_extra_clear(nordic_nrf5_uart_register[instance], NRF_UARTE_EVENT_TXDRDY);
14811467
}
14821468

14831469
/** Check if the serial peripheral is readable

targets/TARGET_NORDIC/TARGET_NRF5x/TARGET_SDK_14_2/drivers_nrf/hal/nrf_uarte.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,25 @@ __STATIC_INLINE void nrf_uarte_event_clear(NRF_UARTE_Type * p_reg, nrf_uarte_eve
228228
*/
229229
__STATIC_INLINE bool nrf_uarte_event_check(NRF_UARTE_Type * p_reg, nrf_uarte_event_t event);
230230

231+
/**
232+
* @brief Function for checking the state of a specific extra UARTE event.
233+
*
234+
* @param[in] p_reg Pointer to the peripheral registers structure.
235+
* @param[in] event Event to check.
236+
*
237+
* @retval True if event is set, False otherwise.
238+
*/
239+
__STATIC_INLINE bool nrf_uarte_event_extra_check(NRF_UARTE_Type * p_reg, uint32_t event);
240+
241+
/**
242+
* @brief Function for clearing a specific extra UARTE event.
243+
*
244+
* @param[in] p_reg Pointer to the peripheral registers structure.
245+
* @param[in] event Extra event to clear.
246+
*/
247+
248+
__STATIC_INLINE void nrf_uarte_event_extra_clear(NRF_UARTE_Type * p_reg, uint32_t event);
249+
231250
/**
232251
* @brief Function for returning the address of a specific UARTE event register.
233252
*
@@ -456,11 +475,25 @@ __STATIC_INLINE void nrf_uarte_event_clear(NRF_UARTE_Type * p_reg, nrf_uarte_eve
456475

457476
}
458477

478+
__STATIC_INLINE void nrf_uarte_event_extra_clear(NRF_UARTE_Type * p_reg, uint32_t event)
479+
{
480+
*((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event)) = 0x0UL;
481+
#if __CORTEX_M == 0x04
482+
volatile uint32_t dummy = *((volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event));
483+
(void)dummy;
484+
#endif
485+
486+
}
459487
__STATIC_INLINE bool nrf_uarte_event_check(NRF_UARTE_Type * p_reg, nrf_uarte_event_t event)
460488
{
461489
return (bool)*(volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event);
462490
}
463491

492+
__STATIC_INLINE bool nrf_uarte_event_extra_check(NRF_UARTE_Type * p_reg, uint32_t event)
493+
{
494+
return (bool)*(volatile uint32_t *)((uint8_t *)p_reg + (uint32_t)event);
495+
}
496+
464497
__STATIC_INLINE uint32_t nrf_uarte_event_address_get(NRF_UARTE_Type * p_reg,
465498
nrf_uarte_event_t event)
466499
{

0 commit comments

Comments
 (0)