Skip to main content

Timer API

The Timer API provides millisecond-precision timing and a scheduled task queue for periodic operations.

System configuration

Clock settings:
  • System clock: 16 MHz
  • Timer resolution: 1 millisecond
  • Maximum scheduled tasks: 32

Data structures

TimerScheduledTask_t

Defines a scheduled task that executes periodically.
task
void (*task)(void *)
Function pointer to execute
context
void *
Context pointer passed to the task function
interval
uint16_t
Execution interval in milliseconds
ticks
uint16_t
Ticks elapsed since last execution (internal)

Initialization

TimerInit

Initializes the timer system with 1ms resolution.
void TimerInit();
Usage:
TimerInit();
This must be called during system initialization before using any timer functions.

Time functions

TimerGetMillis

Returns milliseconds elapsed since system start.
uint32_t TimerGetMillis();
returns
uint32_t
Milliseconds since initialization (wraps after ~49 days)
Example:
uint32_t start = TimerGetMillis();
// ... perform operation ...
uint32_t elapsed = TimerGetMillis() - start;

TimerDelayMicroseconds

Blocking delay for microsecond-precision timing.
void TimerDelayMicroseconds(uint16_t microseconds);
microseconds
uint16_t
Delay duration in microseconds
This is a blocking delay. Use scheduled tasks for non-blocking operations.

Scheduled tasks

TimerRegisterScheduledTask

Registers a task to execute periodically.
uint8_t TimerRegisterScheduledTask(
    void *task,
    void *context,
    uint16_t interval
);
task
void (*)(void *)
Function to execute periodically
context
void *
Context pointer passed to task function
interval
uint16_t
Execution interval in milliseconds
returns
uint8_t
Task ID (0-31), or TIMER_TASK_DISABLED if queue is full
Example:
void MyPeriodicTask(void *context) {
    IBus_t *ibus = (IBus_t *)context;
    IBusCommandCDCAnnounce(ibus);
}

// Register task to run every 1000ms
uint8_t taskId = TimerRegisterScheduledTask(
    &MyPeriodicTask,
    &ibus,
    1000
);

TimerUnregisterScheduledTask

Unregisters a scheduled task by function pointer.
uint8_t TimerUnregisterScheduledTask(void *task);
task
void *
Function pointer of task to remove
returns
uint8_t
1 if task was found and removed, 0 otherwise

TimerUnregisterScheduledTaskById

Unregisters a scheduled task by ID.
void TimerUnregisterScheduledTaskById(uint8_t taskId);
taskId
uint8_t
Task ID returned from TimerRegisterScheduledTask

TimerProcessScheduledTasks

Processes all scheduled tasks (called from main loop).
void TimerProcessScheduledTasks();
This function is called automatically in the main application loop. You typically don’t need to call it directly.

Task management

TimerResetScheduledTask

Resets the tick counter for a task, restarting its interval.
void TimerResetScheduledTask(uint8_t taskId);
taskId
uint8_t
Task ID to reset

TimerSetTaskInterval

Changes the execution interval of a scheduled task.
void TimerSetTaskInterval(uint8_t taskId, uint16_t interval);
taskId
uint8_t
Task ID to modify
interval
uint16_t
New interval in milliseconds

TimerTriggerScheduledTask

Immediately executes a scheduled task without waiting for its interval.
void TimerTriggerScheduledTask(uint8_t taskId);
taskId
uint8_t
Task ID to trigger
The task’s interval timer is not reset by this function.

Constants

#define TIMER_TASKS_MAX 32          // Maximum number of scheduled tasks
#define TIMER_TASK_DISABLED 0       // Returned when task registration fails

See also

Build docs developers (and LLMs) love