I'm developing a project that use BLE advertise and uart communication with other uC.
The uart part is based on libuarte example. To decrease the current consumption, I think we must uninit uarte before system sleep, then reinitialize it when wakeup.
void uc_deInit()
{
if(uartInited){
nrf_libuarte_async_uninit(&libuarte);
//when uarte inited then uninit, current consumption keep higher about 0.8ma, workarounds below
//@refers https://devzone.nordicsemi.com/f/nordic-q-a/26030/how-to-reach-nrf52840-uarte-current-supply-specification/102605#102605
//If you are using UARTE1 the base address is 0x40028000
*(volatile uint32_t *)0x40002FFC = 0;
*(volatile uint32_t *)0x40002FFC;
*(volatile uint32_t *)0x40002FFC = 1;
}
uartInited = false;
}
void uc_init()
{
ret_code_t err_code;
uc_deInit();
nrf_libuarte_async_config_t nrf_libuarte_async_config = {
.tx_pin = UC_TX_PIN,
.rx_pin = UC_RX_PIN,
.baudrate = UARTE_BAUDRATE_BAUDRATE_Baud1M,
.parity = NRF_UARTE_PARITY_EXCLUDED,
.hwfc = NRF_UARTE_HWFC_DISABLED,
.timeout_us = 100, //86us/byte
.pullup_rx = false,//true,
.int_prio = APP_IRQ_PRIORITY_HIGH
};
err_code = nrf_libuarte_async_init(&libuarte, &nrf_libuarte_async_config, uart_event_handler, (void *)&libuarte);
uartInited = true;
APP_ERROR_CHECK(err_code);
nrf_libuarte_async_enable(&libuarte);
}
Everything works before first sleep, when uc_deInit() executed then uc_init(), the NRF stop receiving but transmit works, I can confirm the UC received the NRF tx packet and response, but uart_event_handler never triggered.
So, what is the correct procedure for my purpose?
Thanks.