I'm trying to enable UART in a mesh application with SDK 15.1.0 and mesh SDK 3.3.0. This seems to be a real nightmare and I'm not sure why Nordic has so many different HAL libraries to drive the same peripheral. As an example, for a UART application you can use:
component/libraries/uart/app_uart.c
modules/nrfx/drivers/nrfx_uart.c
These seem to be accomplishing the same thing with different variability of functionality, backwards compatibility, etc. The problem is in integration\nrfx\legacy\nrf_drv_uart.c which has a function that depends on the inclusion of bot nrfx_uarte_init and nrfx_uart_init.
ret_code_t nrf_drv_uart_init(nrf_drv_uart_t const * p_instance,
nrf_drv_uart_config_t const * p_config,
nrf_uart_event_handler_t event_handler)
{
uint32_t inst_idx = p_instance->inst_idx;
m_handlers[inst_idx] = event_handler;
m_contexts[inst_idx] = p_config->p_context;
#if defined(NRF_DRV_UART_WITH_UARTE) && defined(NRF_DRV_UART_WITH_UART)
#ifdef NRF52840_XXAA
if (inst_idx == 1)
{
ASSERT(p_config->use_easy_dma);
}
#endif
nrf_drv_uart_use_easy_dma[inst_idx] = p_config->use_easy_dma;
#endif
nrf_drv_uart_config_t config = *p_config;
config.p_context = (void *)inst_idx;
ret_code_t result = 0;
if (NRF_DRV_UART_USE_UARTE)
{
result = nrfx_uarte_init(&p_instance->uarte,
(nrfx_uarte_config_t const *)&config,
event_handler ? uarte_evt_handler : NULL);
}
else if (NRF_DRV_UART_USE_UART)
{
result = nrfx_uart_init(&p_instance->uart,
(nrfx_uart_config_t const *)&config,
event_handler ? uart_evt_handler : NULL);
}
return result;
}
If you include both those files you have a " multiple definition of `UARTE0_UART0_IRQHandler'" error between nrfx_uarte and nrfx_uart, but you can't build nrf_drv_uart in the first place without both of these.