This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

APP_TIMER_KEEPS_RTC_ACTIVE ignored

Using

- nRF5_SDK_15.0.0_a53641a

- gcc-arm-none-eabi-6-2017-q2-update 6.3.1

If I enable APP_TIMER_KEEPS_RTC_ACTIVE in the sdk config, setup the app timer with this:

    ret = nrf_drv_clock_init();
    APP_ERROR_CHECK(ret);
    ret = nrf_drv_power_init(NULL);
    APP_ERROR_CHECK(ret);

    nrf_drv_clock_lfclk_request(NULL);

    ret = app_timer_init();
    APP_ERROR_CHECK(ret);

app_timer_cnt_get always returns 0.

If I then start a dummy timer, app_timer_cnt_get works fine.

Here is my example, based off of examples/peripheral/uart.

#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include "app_uart.h"
#include "app_error.h"
#include "nrf_delay.h"
#include "nrf.h"
#include "bsp.h"
#if defined (UART_PRESENT)
#include "nrf_uart.h"
#endif
#if defined (UARTE_PRESENT)
#include "nrf_uarte.h"
#endif
#include "app_timer.h"
#include "nrf_drv_clock.h"
#include "nrf_drv_power.h"


#define MAX_TEST_DATA_BYTES     (15U)                /**< max number of test bytes to be used for tx and rx. */
#define UART_TX_BUF_SIZE 256                         /**< UART TX buffer size. */
#define UART_RX_BUF_SIZE 256                         /**< UART RX buffer size. */

void uart_error_handle(app_uart_evt_t * p_event) {
    if (p_event->evt_type == APP_UART_COMMUNICATION_ERROR) {
        APP_ERROR_HANDLER(p_event->data.error_communication);
    } else if (p_event->evt_type == APP_UART_FIFO_ERROR) {
        APP_ERROR_HANDLER(p_event->data.error_code);
    }
}

////Dummy timer stuff
//APP_TIMER_DEF(dummy_timer);
//static void dummy_timer_handler(void * p_context) {
//    UNUSED_PARAMETER(p_context);
//}


static void timers_init(void) {
    ret_code_t ret;

    ret = nrf_drv_clock_init();
    APP_ERROR_CHECK(ret);
    ret = nrf_drv_power_init(NULL);
    APP_ERROR_CHECK(ret);

    nrf_drv_clock_lfclk_request(NULL);

    ret = app_timer_init();
    APP_ERROR_CHECK(ret);

    //// Create Security Request timer.
    //ret = app_timer_create(&dummy_timer,
    //                            APP_TIMER_MODE_REPEATED,
    //                            dummy_timer_handler);
    //APP_ERROR_CHECK(ret);

    //ret = app_timer_start(dummy_timer, APP_TIMER_TICKS(500), NULL);
    //APP_ERROR_CHECK(ret);
}


int main(void) {
    uint32_t err_code;

    bsp_board_init(BSP_INIT_LEDS);

    timers_init();

    const app_uart_comm_params_t comm_params =
      {
          RX_PIN_NUMBER,
          TX_PIN_NUMBER,
          RTS_PIN_NUMBER,
          CTS_PIN_NUMBER,
          APP_UART_FLOW_CONTROL_DISABLED,
          false,
#if defined (UART_PRESENT)
          NRF_UART_BAUDRATE_115200
#else
          NRF_UARTE_BAUDRATE_115200
#endif
      };

    APP_UART_FIFO_INIT(&comm_params,
                         UART_RX_BUF_SIZE,
                         UART_TX_BUF_SIZE,
                         uart_error_handle,
                         APP_IRQ_PRIORITY_LOWEST,
                         err_code);

    APP_ERROR_CHECK(err_code);

    printf("\r\nUART example started.\r\n");

    while (true) {
        for (int i = 0; i < LEDS_NUMBER; i++) {
            bsp_board_led_invert(i);
            nrf_delay_ms(500);
            printf("time: %ld\r\n", app_timer_cnt_get());
        }
    }
}

Related