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

Timer handler called immediately on app_timer_start()

On an nRF51822 without the Soft Device, I use the app timers in a driver for a GPS module that uses the UART. Each time I start reading from the UART, I also start a timer with a timeout of 2 seconds. When the timer handler is called, I set a bool to indicate that the read has timed out and the driver continues.

This works just fine for 3 to 5 minutes, but then I notice that the timer is having its handler called immediately after app_timer_start() in every case. I have no idea why.

static app_timer_id_t                  m_gps_response_timeout_timer_id;

In my gps_init(), which is called once only, at the start:

err_code = app_timer_create(&m_gps_response_timeout_timer_id, APP_TIMER_MODE_SINGLE_SHOT, gps_response_timeout_handler);
	APP_ERROR_CHECK(err_code);

Every time I read a sentence from the GPS:

err_code = app_timer_start(m_gps_response_timeout_timer_id, GPS_TIMEOUT, NULL);
APP_ERROR_CHECK(err_code);

...UART stuff, including checking for timeout, in a loop...

err_code = app_timer_stop(m_gps_response_timeout_timer_id);
APP_ERROR_CHECK(err_code);

Header macros:

#define GPS_TIMER_PRESCALER 0
#define GPS_TIMEOUT APP_TIMER_TICKS(2000, GPS_TIMER_PRESCALER)

Timeout handler:

void gps_response_timeout_handler(void * p_context)
{
    UNUSED_PARAMETER(p_context);
    m_gps_response_timed_out = true;
}

I've verified that the timeout handler function is really getting called. Why would this work for a few minutes then stop working? I do have other timers in the same code, but they all have their own timer IDs of course.

Parents Reply
  • Hello @Dave_couling,

    you suggested:

    [In that case I would use a REPEATING timer. In the timeout handler increment a global variable to track the number of times it has timed out. If you set the timer to 1sec timeout, then the counting variable in effect counts the seconds. In the button is released simply stop the timer].

    sir, I am sorry, I am a newbie to this; could you please suggest some example code steps for this implementation~ please.

    Thanks n Regards

Children
No Data
Related