Beware that this post is related to an SDK in maintenance mode
More Info: Consider nRF Connect SDK for new designs
This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

Disable BLE NUS UART

Is there a way to turn off the BLE NUS service once we are done with and turn it back on when we need it? I tried

 

    NRF_UART0->TASKS_STOPTX = 1;
    NRF_UART0->TASKS_STOPRX = 1;
    NRF_UART0->ENABLE = 0;

Seems to have had no effect. I am using the BLE NUS service here, as you can see I turn off my ADC when done with it, I want to do the same to BLE NUS.

void saadc_callback(nrf_drv_saadc_evt_t const *p_event) {
  ////NRF_LOG_INFO("SAADC callback\r\n");
  if (p_event->type == NRF_DRV_SAADC_EVT_DONE) //Capture offset calibration complete event
  {
    ret_code_t err_code;

    LEDS_INVERT(BSP_LED_1_MASK); //Toggle LED2 to indicate SAADC buffer full

    err_code = nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAADC_SAMPLES_IN_BUFFER); //Set buffer so the SAADC can write to it again. This is either "buffer 1" or "buffer 2"
    APP_ERROR_CHECK(err_code);



    static uint16_t adc_value;
    static uint16_t adc_len;

    for (uint8_t i = 0; i < p_event->data.done.size; i++) {
      adc_value = p_event->data.done.p_buffer[i];
      adc_len = sizeof(adc_value);
      err_code = ble_nus_data_send(&m_nus, (uint8_t *)&adc_value, &adc_len, m_conn_handle);
      if ((err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) &&
          (err_code != NRF_ERROR_NOT_FOUND)) {
        APP_ERROR_CHECK(err_code);
      }
    }
		
    nrf_drv_saadc_uninit();                                                     //Unintialize SAADC to disable EasyDMA and save power
    NRF_SAADC->INTENCLR = (SAADC_INTENCLR_END_Clear << SAADC_INTENCLR_END_Pos); //Disable the SAADC interrupt
    NVIC_ClearPendingIRQ(SAADC_IRQn);                                           //Clear the SAADC interrupt if set
    m_saadc_initialized = false;                                                //Set SAADC as uninitialized
  }
}

Or maybe I should just make a notify characteristic to send out my values instead of using UART? I mean does BLE NUS UART use less power than a characteristic e.g. heart rate? 

Parents
  • Hi,

    There is no problem to use the BLE NUS service for any data you may wish to send and receive. The example have been by default setup to take data from the UART peripheral, hence the name BLE NUS. You can safely disable the NRF_UART0 if you don't need it for other purposes. Typically the UART peripheral will draw high current, but the BLE NUS service don't use any current other than when the application actively call ble_nus_data_send() to send data, but that current is the same for all BLE services.

    Best regards,
    Kenneth

Reply
  • Hi,

    There is no problem to use the BLE NUS service for any data you may wish to send and receive. The example have been by default setup to take data from the UART peripheral, hence the name BLE NUS. You can safely disable the NRF_UART0 if you don't need it for other purposes. Typically the UART peripheral will draw high current, but the BLE NUS service don't use any current other than when the application actively call ble_nus_data_send() to send data, but that current is the same for all BLE services.

    Best regards,
    Kenneth

Children
Related