#####
Timer
#####

About
-----

The ESP32 SoCs contains from 2 to 4 hardware timers.
They are all 64-bit (54-bit for ESP32-C3) generic timers based on 16-bit pre-scalers and 64-bit (54-bit for ESP32-C3)
up / down counters which are capable of being auto-reloaded.

========= ================
ESP32 SoC Number of timers
========= ================
ESP32     4
ESP32-S2  4
ESP32-S3  4
ESP32-C3  2
ESP32-C6  2
ESP32-H2  2
========= ================

Arduino-ESP32 Timer API
-----------------------

timerBegin
**********

This function is used to configure the timer. After successful setup the timer will automatically start.

.. code-block:: arduino

    hw_timer_t * timerBegin(uint32_t frequency);

* ``frequency`` select timer frequency in Hz. Sets how quickly the timer counter is “ticking”.

This function will return ``timer`` structure if configuration is successful.
If ``NULL`` is returned, error occurs and the timer was not configured.

timerEnd
********

This function is used to end timer.

.. code-block:: arduino

    void timerEnd(hw_timer_t * timer);

* ``timer`` timer struct.

timerStart
**********

This function is used to start counter of the timer.

.. code-block:: arduino

    void timerStart(hw_timer_t * timer);

* ``timer`` timer struct.

timerStop
*********

This function is used to stop counter of the timer.

.. code-block:: arduino

    void timerStop(hw_timer_t * timer);

* ``timer`` timer struct.

timerRestart
************

This function is used to restart counter of the timer.

.. code-block:: arduino

    void timerRestart(hw_timer_t * timer);

* ``timer`` timer struct.

timerWrite
**********

This function is used to set counter value of the timer.

.. code-block:: arduino

    void timerWrite(hw_timer_t * timer, uint64_t val);

* ``timer`` timer struct.
* ``val`` counter value to be set.

timerRead
*********

This function is used to read counter value of the timer.

.. code-block:: arduino

    uint64_t timerRead(hw_timer_t * timer);

* ``timer`` timer struct.

This function will return ``counter value`` of the timer.

timerReadMicros
***************

This function is used to read counter value in microseconds of the timer.

.. code-block:: arduino

    uint64_t timerReadMicros(hw_timer_t * timer);

* ``timer`` timer struct.

This function will return ``counter value`` of the timer in microseconds.

timerReadMillis
***************

This function is used to read counter value in milliseconds of the timer.

.. code-block:: arduino

    uint64_t timerReadMillis(hw_timer_t * timer);

* ``timer`` timer struct.

This function will return ``counter value`` of the timer in milliseconds.

timerReadSeconds
****************

This function is used to read counter value in seconds of the timer.

.. code-block:: arduino

    double timerReadSeconds(hw_timer_t * timer);

* ``timer`` timer struct.

This function will return ``counter value`` of the timer in seconds.

timerGetFrequency
*****************

This function is used to get resolution in Hz of the timer.

.. code-block:: arduino

    uint16_t timerGetFrequency(hw_timer_t * timer);

* ``timer`` timer struct.

This function will return ``frequency`` in Hz of the timer.

timerAttachInterrupt
********************

This function is used to attach interrupt to timer.

.. code-block:: arduino

    void timerAttachInterrupt(hw_timer_t * timer, void (*userFunc)(void));

* ``timer`` timer struct.
* ``userFunc`` function to be called when interrupt is triggered.

timerAttachInterruptArg
***********************

This function is used to attach interrupt to timer using arguments.

.. code-block:: arduino

    void timerAttachInterruptArg(hw_timer_t * timer, void (*userFunc)(void*), void * arg);

* ``timer`` timer struct.
* ``userFunc`` function to be called when interrupt is triggered.
* ``arg`` pointer to the interrupt arguments.

timerDetachInterrupt
********************

This function is used to detach interrupt from timer.

.. code-block:: arduino

    void timerDetachInterrupt(hw_timer_t * timer);

* ``timer`` timer struct.

timerAlarm
**********

This function is used to configure alarm value and autoreload of the timer. Alarm is automatically enabled.

.. code-block:: arduino

    void timerAlarm(hw_timer_t * timer, uint64_t alarm_value, bool autoreload, uint64_t reload_count);

* ``timer`` timer struct.
* ``alarm_value`` alarm value to generate event.
* ``autoreload`` enabled/disabled autorealod.
* ``reload_count`` number of autoreloads (0 = unlimited). Has no effect if autorealod is disabled.

Example Applications
********************

There are 2 examples uses of Timer:

Repeat timer example:

.. literalinclude:: ../../../libraries/ESP32/examples/Timer/RepeatTimer/RepeatTimer.ino
    :language: arduino

Watchdog timer example:

.. literalinclude:: ../../../libraries/ESP32/examples/Timer/WatchdogTimer/WatchdogTimer.ino
    :language: arduino
