diff --git a/include/dap_common.h b/include/dap_common.h
index cea9c2fa35461f3bf6966ceb4c1f6843d90c738c..c858ac97cad8015356e75934906b52f54cb41fe6 100755
--- a/include/dap_common.h
+++ b/include/dap_common.h
@@ -235,10 +235,11 @@ typedef struct dap_log_history_str_s {
 
 #define DAP_INTERVAL_TIMERS_MAX 15
 
-typedef void (*dap_timer_callback_t)(void);
+typedef void (*dap_timer_callback_t)(void *param);
 typedef struct dap_timer_interface {
     void *timer;
     dap_timer_callback_t callback;
+    void *param;
 } dap_timer_interface_t;
 
 #ifdef __cplusplus
@@ -385,7 +386,7 @@ size_t dap_bin2hex(char *a_out, const void *a_in, size_t a_len);
 void dap_digit_from_string(const char *num_str, void *raw, size_t raw_len);
 void dap_digit_from_string2(const char *num_str, void *raw, size_t raw_len);
 
-void *dap_interval_timer_create(unsigned int a_msec, dap_timer_callback_t a_callback);
+void *dap_interval_timer_create(unsigned int a_msec, dap_timer_callback_t a_callback, void *a_param);
 int dap_interval_timer_delete(void *a_timer);
 
 #ifdef __MINGW32__
diff --git a/src/dap_common.c b/src/dap_common.c
index 1e27d944c2054888655dee9721d625dbcac5f2ba..cfbd52714978753e5f265e919c3f617aa5a9c1fd 100755
--- a/src/dap_common.c
+++ b/src/dap_common.c
@@ -827,12 +827,12 @@ static int s_timer_find(void *a_timer)
 static void CALLBACK s_win_callback(PVOID a_arg, BOOLEAN a_always_true)
 {
     UNUSED(a_always_true);
-    s_timers[(int)a_arg].callback();
+    s_timers[(int)a_arg].callback(s_timers[(int)a_arg].param);
 }
 #else
 static void s_posix_callback(union sigval a_arg)
 {
-    s_timers[a_arg.sival_int].callback();
+    s_timers[a_arg.sival_int].callback(s_timers[a_arg.sival_int].param);
 }
 #endif
 
@@ -842,7 +842,7 @@ static void s_posix_callback(union sigval a_arg)
  * \param a_callback Function to be called with timer period
  * \return pointer to timer object if success, otherwise return NULL
  */
-void *dap_interval_timer_create(unsigned int a_msec, dap_timer_callback_t a_callback)
+void *dap_interval_timer_create(unsigned int a_msec, dap_timer_callback_t a_callback, void *a_param)
 {
     if (s_timers_count == DAP_INTERVAL_TIMERS_MAX) {
         return NULL;
@@ -876,6 +876,7 @@ void *dap_interval_timer_create(unsigned int a_msec, dap_timer_callback_t a_call
 #endif
     s_timers[s_timers_count].timer = (void *)l_timer;
     s_timers[s_timers_count].callback = a_callback;
+    s_timers[s_timers_count].param = a_param;
     s_timers_count++;
 #ifdef _WIN32
     LeaveCriticalSection(&s_timers_lock);