.. highlight:: c
.. _libmaple-timer:

``timer.h``
===========

Timer support.

.. contents:: Contents
   :local:

Types
-----

The timer register map type, unlike that for most other peripherals in
libmaple, is a union rather than a struct.  This is due to the fact
that there are advanced, general purpose, and basic timers.  Thus,
each kind of timer has a register map type, and a ``union
timer_reg_map`` ties it all together.

.. TODO: seperate stm32f1/stm32f2 families correctly

.. doxygenstruct:: timer_adv_reg_map
.. doxygenstruct:: stm32f1::timer_gen_reg_map
.. doxygenstruct:: stm32f2::timer_gen_reg_map
.. doxygenstruct:: timer_bas_reg_map
.. doxygenunion:: timer_reg_map
.. doxygenenum:: timer_type
.. doxygenstruct:: timer_dev
.. doxygenenum:: timer_mode
.. doxygenenum:: timer_channel
.. doxygenenum:: timer_interrupt_id
.. doxygenenum:: timer_dma_base_addr
.. doxygenenum:: timer_oc_mode
.. doxygenenum:: timer_oc_mode_flags

Devices
-------

.. doxygenvariable:: TIMER1
.. doxygenvariable:: TIMER2
.. doxygenvariable:: TIMER3
.. doxygenvariable:: TIMER4
.. doxygenvariable:: TIMER5
.. doxygenvariable:: TIMER6
.. doxygenvariable:: TIMER7
.. doxygenvariable:: TIMER8

Functions
---------

Enabling and Disabling
~~~~~~~~~~~~~~~~~~~~~~

.. doxygenfunction:: timer_init
.. doxygenfunction:: timer_init_all
.. doxygenfunction:: timer_disable
.. doxygenfunction:: timer_disable_all

General Configuration
~~~~~~~~~~~~~~~~~~~~~

.. doxygenfunction:: timer_set_mode
.. doxygenfunction:: timer_foreach

Count and Prescaler
~~~~~~~~~~~~~~~~~~~

.. doxygenfunction:: timer_get_count
.. doxygenfunction:: timer_set_count
.. doxygenfunction:: timer_pause
.. doxygenfunction:: timer_resume
.. doxygenfunction:: timer_generate_update
.. doxygenfunction:: timer_get_prescaler
.. doxygenfunction:: timer_set_prescaler
.. doxygenfunction:: timer_get_reload
.. doxygenfunction:: timer_set_reload

Interrupts
~~~~~~~~~~

.. doxygenfunction:: timer_attach_interrupt
.. doxygenfunction:: timer_detach_interrupt
.. doxygenfunction:: timer_enable_irq
.. doxygenfunction:: timer_disable_irq

Capture/Compare
~~~~~~~~~~~~~~~

.. doxygenfunction:: timer_get_compare
.. doxygenfunction:: timer_set_compare
.. doxygenfunction:: timer_cc_enable
.. doxygenfunction:: timer_cc_disable
.. doxygenfunction:: timer_cc_get_pol
.. doxygenfunction:: timer_cc_set_pol
.. doxygenfunction:: timer_oc_set_mode

DMA
~~~

.. doxygenfunction:: timer_dma_enable_trg_req
.. doxygenfunction:: timer_dma_disable_trg_req
.. doxygenfunction:: timer_dma_enable_req
.. doxygenfunction:: timer_dma_get_burst_len
.. doxygenfunction:: timer_dma_set_burst_len
.. doxygenfunction:: timer_dma_get_base_addr
.. doxygenfunction:: timer_dma_set_base_addr

Register Map Base Pointers
--------------------------

.. doxygendefine:: TIMER1_BASE
.. doxygendefine:: TIMER2_BASE
.. doxygendefine:: TIMER3_BASE
.. doxygendefine:: TIMER4_BASE
.. doxygendefine:: TIMER5_BASE
.. doxygendefine:: TIMER6_BASE
.. doxygendefine:: TIMER7_BASE
.. doxygendefine:: TIMER8_BASE

Register Bit Definitions
------------------------

Control register 1 (CR1)
~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_CR1_ARPE_BIT
.. doxygendefine:: TIMER_CR1_DIR_BIT
.. doxygendefine:: TIMER_CR1_OPM_BIT
.. doxygendefine:: TIMER_CR1_URS_BIT
.. doxygendefine:: TIMER_CR1_UDIS_BIT
.. doxygendefine:: TIMER_CR1_CEN_BIT

.. doxygendefine:: TIMER_CR1_CKD
.. doxygendefine:: TIMER_CR1_CKD_1TCKINT
.. doxygendefine:: TIMER_CR1_CKD_2TCKINT
.. doxygendefine:: TIMER_CR1_CKD_4TICKINT
.. doxygendefine:: TIMER_CR1_ARPE
.. doxygendefine:: TIMER_CR1_CKD_CMS
.. doxygendefine:: TIMER_CR1_CKD_CMS_EDGE
.. doxygendefine:: TIMER_CR1_CKD_CMS_CENTER1
.. doxygendefine:: TIMER_CR1_CKD_CMS_CENTER2
.. doxygendefine:: TIMER_CR1_CKD_CMS_CENTER3
.. doxygendefine:: TIMER_CR1_DIR
.. doxygendefine:: TIMER_CR1_OPM
.. doxygendefine:: TIMER_CR1_URS
.. doxygendefine:: TIMER_CR1_UDIS
.. doxygendefine:: TIMER_CR1_CEN

Control register 2 (CR2)
~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_CR2_OIS4_BIT
.. doxygendefine:: TIMER_CR2_OIS3N_BIT
.. doxygendefine:: TIMER_CR2_OIS3_BIT
.. doxygendefine:: TIMER_CR2_OIS2N_BIT
.. doxygendefine:: TIMER_CR2_OIS2_BIT
.. doxygendefine:: TIMER_CR2_OIS1N_BIT
.. doxygendefine:: TIMER_CR2_OIS1_BIT
.. doxygendefine:: TIMER_CR2_TI1S_BIT
.. doxygendefine:: TIMER_CR2_CCDS_BIT
.. doxygendefine:: TIMER_CR2_CCUS_BIT
.. doxygendefine:: TIMER_CR2_CCPC_BIT

.. doxygendefine:: TIMER_CR2_OIS4
.. doxygendefine:: TIMER_CR2_OIS3N
.. doxygendefine:: TIMER_CR2_OIS3
.. doxygendefine:: TIMER_CR2_OIS2N
.. doxygendefine:: TIMER_CR2_OIS2
.. doxygendefine:: TIMER_CR2_OIS1N
.. doxygendefine:: TIMER_CR2_OIS1
.. doxygendefine:: TIMER_CR2_TI1S
.. doxygendefine:: TIMER_CR2_MMS
.. doxygendefine:: TIMER_CR2_MMS_RESET
.. doxygendefine:: TIMER_CR2_MMS_ENABLE
.. doxygendefine:: TIMER_CR2_MMS_UPDATE
.. doxygendefine:: TIMER_CR2_MMS_COMPARE_PULSE
.. doxygendefine:: TIMER_CR2_MMS_COMPARE_OC1REF
.. doxygendefine:: TIMER_CR2_MMS_COMPARE_OC2REF
.. doxygendefine:: TIMER_CR2_MMS_COMPARE_OC3REF
.. doxygendefine:: TIMER_CR2_MMS_COMPARE_OC4REF
.. doxygendefine:: TIMER_CR2_CCDS
.. doxygendefine:: TIMER_CR2_CCUS
.. doxygendefine:: TIMER_CR2_CCPC

Slave mode control register (SMCR)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_SMCR_ETP_BIT
.. doxygendefine:: TIMER_SMCR_ECE_BIT
.. doxygendefine:: TIMER_SMCR_MSM_BIT

.. doxygendefine:: TIMER_SMCR_ETP
.. doxygendefine:: TIMER_SMCR_ECE
.. doxygendefine:: TIMER_SMCR_ETPS
.. doxygendefine:: TIMER_SMCR_ETPS_OFF
.. doxygendefine:: TIMER_SMCR_ETPS_DIV2
.. doxygendefine:: TIMER_SMCR_ETPS_DIV4
.. doxygendefine:: TIMER_SMCR_ETPS_DIV8
.. doxygendefine:: TIMER_SMCR_ETF
.. doxygendefine:: TIMER_SMCR_MSM
.. doxygendefine:: TIMER_SMCR_TS
.. doxygendefine:: TIMER_SMCR_TS_ITR0
.. doxygendefine:: TIMER_SMCR_TS_ITR1
.. doxygendefine:: TIMER_SMCR_TS_ITR2
.. doxygendefine:: TIMER_SMCR_TS_ITR3
.. doxygendefine:: TIMER_SMCR_TS_TI1F_ED
.. doxygendefine:: TIMER_SMCR_TS_TI1FP1
.. doxygendefine:: TIMER_SMCR_TS_TI2FP2
.. doxygendefine:: TIMER_SMCR_TS_ETRF
.. doxygendefine:: TIMER_SMCR_SMS
.. doxygendefine:: TIMER_SMCR_SMS_DISABLED
.. doxygendefine:: TIMER_SMCR_SMS_ENCODER1
.. doxygendefine:: TIMER_SMCR_SMS_ENCODER2
.. doxygendefine:: TIMER_SMCR_SMS_ENCODER3
.. doxygendefine:: TIMER_SMCR_SMS_RESET
.. doxygendefine:: TIMER_SMCR_SMS_GATED
.. doxygendefine:: TIMER_SMCR_SMS_TRIGGER
.. doxygendefine:: TIMER_SMCR_SMS_EXTERNAL

DMA/Interrupt enable register (DIER)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_DIER_TDE_BIT
.. doxygendefine:: TIMER_DIER_CC4DE_BIT
.. doxygendefine:: TIMER_DIER_CC3DE_BIT
.. doxygendefine:: TIMER_DIER_CC2DE_BIT
.. doxygendefine:: TIMER_DIER_CC1DE_BIT
.. doxygendefine:: TIMER_DIER_UDE_BIT
.. doxygendefine:: TIMER_DIER_TIE_BIT
.. doxygendefine:: TIMER_DIER_CC4IE_BIT
.. doxygendefine:: TIMER_DIER_CC3IE_BIT
.. doxygendefine:: TIMER_DIER_CC2IE_BIT
.. doxygendefine:: TIMER_DIER_CC1IE_BIT
.. doxygendefine:: TIMER_DIER_UIE_BIT

.. doxygendefine:: TIMER_DIER_TDE
.. doxygendefine:: TIMER_DIER_CC4DE
.. doxygendefine:: TIMER_DIER_CC3DE
.. doxygendefine:: TIMER_DIER_CC2DE
.. doxygendefine:: TIMER_DIER_CC1DE
.. doxygendefine:: TIMER_DIER_UDE
.. doxygendefine:: TIMER_DIER_TIE
.. doxygendefine:: TIMER_DIER_CC4IE
.. doxygendefine:: TIMER_DIER_CC3IE
.. doxygendefine:: TIMER_DIER_CC2IE
.. doxygendefine:: TIMER_DIER_CC1IE
.. doxygendefine:: TIMER_DIER_UIE

Status register (SR)
~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_SR_CC4OF_BIT
.. doxygendefine:: TIMER_SR_CC3OF_BIT
.. doxygendefine:: TIMER_SR_CC2OF_BIT
.. doxygendefine:: TIMER_SR_CC1OF_BIT
.. doxygendefine:: TIMER_SR_BIF_BIT
.. doxygendefine:: TIMER_SR_TIF_BIT
.. doxygendefine:: TIMER_SR_COMIF_BIT
.. doxygendefine:: TIMER_SR_CC4IF_BIT
.. doxygendefine:: TIMER_SR_CC3IF_BIT
.. doxygendefine:: TIMER_SR_CC2IF_BIT
.. doxygendefine:: TIMER_SR_CC1IF_BIT
.. doxygendefine:: TIMER_SR_UIF_BIT

.. doxygendefine:: TIMER_SR_CC4OF
.. doxygendefine:: TIMER_SR_CC3OF
.. doxygendefine:: TIMER_SR_CC2OF
.. doxygendefine:: TIMER_SR_CC1OF
.. doxygendefine:: TIMER_SR_BIF
.. doxygendefine:: TIMER_SR_TIF
.. doxygendefine:: TIMER_SR_COMIF
.. doxygendefine:: TIMER_SR_CC4IF
.. doxygendefine:: TIMER_SR_CC3IF
.. doxygendefine:: TIMER_SR_CC2IF
.. doxygendefine:: TIMER_SR_CC1IF
.. doxygendefine:: TIMER_SR_UIF

Event generation register (EGR)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_EGR_TG_BIT
.. doxygendefine:: TIMER_EGR_CC4G_BIT
.. doxygendefine:: TIMER_EGR_CC3G_BIT
.. doxygendefine:: TIMER_EGR_CC2G_BIT
.. doxygendefine:: TIMER_EGR_CC1G_BIT
.. doxygendefine:: TIMER_EGR_UG_BIT

.. doxygendefine:: TIMER_EGR_TG
.. doxygendefine:: TIMER_EGR_CC4G
.. doxygendefine:: TIMER_EGR_CC3G
.. doxygendefine:: TIMER_EGR_CC2G
.. doxygendefine:: TIMER_EGR_CC1G
.. doxygendefine:: TIMER_EGR_UG

Capture/compare mode registers, common values
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_CCMR_CCS_OUTPUT
.. doxygendefine:: TIMER_CCMR_CCS_INPUT_TI1
.. doxygendefine:: TIMER_CCMR_CCS_INPUT_TI2
.. doxygendefine:: TIMER_CCMR_CCS_INPUT_TRC

Capture/compare mode register 1 (CCMR1)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_CCMR1_OC2CE_BIT
.. doxygendefine:: TIMER_CCMR1_OC2PE_BIT
.. doxygendefine:: TIMER_CCMR1_OC2FE_BIT
.. doxygendefine:: TIMER_CCMR1_OC1CE_BIT
.. doxygendefine:: TIMER_CCMR1_OC1PE_BIT
.. doxygendefine:: TIMER_CCMR1_OC1FE_BIT

.. doxygendefine:: TIMER_CCMR1_OC2CE
.. doxygendefine:: TIMER_CCMR1_OC2M
.. doxygendefine:: TIMER_CCMR1_IC2F
.. doxygendefine:: TIMER_CCMR1_OC2PE
.. doxygendefine:: TIMER_CCMR1_OC2FE
.. doxygendefine:: TIMER_CCMR1_IC2PSC
.. doxygendefine:: TIMER_CCMR1_CC2S
.. doxygendefine:: TIMER_CCMR1_CC2S_OUTPUT
.. doxygendefine:: TIMER_CCMR1_CC2S_INPUT_TI1
.. doxygendefine:: TIMER_CCMR1_CC2S_INPUT_TI2
.. doxygendefine:: TIMER_CCMR1_CC2S_INPUT_TRC
.. doxygendefine:: TIMER_CCMR1_OC1CE
.. doxygendefine:: TIMER_CCMR1_OC1M
.. doxygendefine:: TIMER_CCMR1_IC1F
.. doxygendefine:: TIMER_CCMR1_OC1PE
.. doxygendefine:: TIMER_CCMR1_OC1FE
.. doxygendefine:: TIMER_CCMR1_IC1PSC
.. doxygendefine:: TIMER_CCMR1_CC1S
.. doxygendefine:: TIMER_CCMR1_CC1S_OUTPUT
.. doxygendefine:: TIMER_CCMR1_CC1S_INPUT_TI1
.. doxygendefine:: TIMER_CCMR1_CC1S_INPUT_TI2
.. doxygendefine:: TIMER_CCMR1_CC1S_INPUT_TRC

Capture/compare mode register 2 (CCMR2)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_CCMR2_OC4CE_BIT
.. doxygendefine:: TIMER_CCMR2_OC4PE_BIT
.. doxygendefine:: TIMER_CCMR2_OC4FE_BIT
.. doxygendefine:: TIMER_CCMR2_OC3CE_BIT
.. doxygendefine:: TIMER_CCMR2_OC3PE_BIT
.. doxygendefine:: TIMER_CCMR2_OC3FE_BIT

.. doxygendefine:: TIMER_CCMR2_OC4CE
.. doxygendefine:: TIMER_CCMR2_OC4M
.. doxygendefine:: TIMER_CCMR2_IC2F
.. doxygendefine:: TIMER_CCMR2_OC4PE
.. doxygendefine:: TIMER_CCMR2_OC4FE
.. doxygendefine:: TIMER_CCMR2_IC2PSC
.. doxygendefine:: TIMER_CCMR2_CC4S
.. doxygendefine:: TIMER_CCMR1_CC4S_OUTPUT
.. doxygendefine:: TIMER_CCMR1_CC4S_INPUT_TI1
.. doxygendefine:: TIMER_CCMR1_CC4S_INPUT_TI2
.. doxygendefine:: TIMER_CCMR1_CC4S_INPUT_TRC
.. doxygendefine:: TIMER_CCMR2_OC3CE
.. doxygendefine:: TIMER_CCMR2_OC3M
.. doxygendefine:: TIMER_CCMR2_IC1F
.. doxygendefine:: TIMER_CCMR2_OC3PE
.. doxygendefine:: TIMER_CCMR2_OC3FE
.. doxygendefine:: TIMER_CCMR2_IC1PSC
.. doxygendefine:: TIMER_CCMR2_CC3S
.. doxygendefine:: TIMER_CCMR1_CC3S_OUTPUT
.. doxygendefine:: TIMER_CCMR1_CC3S_INPUT_TI1
.. doxygendefine:: TIMER_CCMR1_CC3S_INPUT_TI2
.. doxygendefine:: TIMER_CCMR1_CC3S_INPUT_TRC

Capture/compare enable register (CCER)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_CCER_CC4P_BIT
.. doxygendefine:: TIMER_CCER_CC4E_BIT
.. doxygendefine:: TIMER_CCER_CC3P_BIT
.. doxygendefine:: TIMER_CCER_CC3E_BIT
.. doxygendefine:: TIMER_CCER_CC2P_BIT
.. doxygendefine:: TIMER_CCER_CC2E_BIT
.. doxygendefine:: TIMER_CCER_CC1P_BIT
.. doxygendefine:: TIMER_CCER_CC1E_BIT

.. doxygendefine:: TIMER_CCER_CC4P
.. doxygendefine:: TIMER_CCER_CC4E
.. doxygendefine:: TIMER_CCER_CC3P
.. doxygendefine:: TIMER_CCER_CC3E
.. doxygendefine:: TIMER_CCER_CC2P
.. doxygendefine:: TIMER_CCER_CC2E
.. doxygendefine:: TIMER_CCER_CC1P
.. doxygendefine:: TIMER_CCER_CC1E

Break and dead-time register (BDTR)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_BDTR_MOE_BIT
.. doxygendefine:: TIMER_BDTR_AOE_BIT
.. doxygendefine:: TIMER_BDTR_BKP_BIT
.. doxygendefine:: TIMER_BDTR_BKE_BIT
.. doxygendefine:: TIMER_BDTR_OSSR_BIT
.. doxygendefine:: TIMER_BDTR_OSSI_BIT

.. doxygendefine:: TIMER_BDTR_MOE
.. doxygendefine:: TIMER_BDTR_AOE
.. doxygendefine:: TIMER_BDTR_BKP
.. doxygendefine:: TIMER_BDTR_BKE
.. doxygendefine:: TIMER_BDTR_OSSR
.. doxygendefine:: TIMER_BDTR_OSSI
.. doxygendefine:: TIMER_BDTR_LOCK
.. doxygendefine:: TIMER_BDTR_LOCK_OFF
.. doxygendefine:: TIMER_BDTR_LOCK_LEVEL1
.. doxygendefine:: TIMER_BDTR_LOCK_LEVEL2
.. doxygendefine:: TIMER_BDTR_LOCK_LEVEL3
.. doxygendefine:: TIMER_BDTR_DTG

DMA control register (DCR)
~~~~~~~~~~~~~~~~~~~~~~~~~~

.. doxygendefine:: TIMER_DCR_DBL
.. doxygendefine:: TIMER_DCR_DBL_1BYTE
.. doxygendefine:: TIMER_DCR_DBL_2BYTE
.. doxygendefine:: TIMER_DCR_DBL_3BYTE
.. doxygendefine:: TIMER_DCR_DBL_4BYTE
.. doxygendefine:: TIMER_DCR_DBL_5BYTE
.. doxygendefine:: TIMER_DCR_DBL_6BYTE
.. doxygendefine:: TIMER_DCR_DBL_7BYTE
.. doxygendefine:: TIMER_DCR_DBL_8BYTE
.. doxygendefine:: TIMER_DCR_DBL_9BYTE
.. doxygendefine:: TIMER_DCR_DBL_10BYTE
.. doxygendefine:: TIMER_DCR_DBL_11BYTE
.. doxygendefine:: TIMER_DCR_DBL_12BYTE
.. doxygendefine:: TIMER_DCR_DBL_13BYTE
.. doxygendefine:: TIMER_DCR_DBL_14BYTE
.. doxygendefine:: TIMER_DCR_DBL_15BYTE
.. doxygendefine:: TIMER_DCR_DBL_16BYTE
.. doxygendefine:: TIMER_DCR_DBL_17BYTE
.. doxygendefine:: TIMER_DCR_DBL_18BYTE
.. doxygendefine:: TIMER_DCR_DBA
.. doxygendefine:: TIMER_DCR_DBA_CR1
.. doxygendefine:: TIMER_DCR_DBA_CR2
.. doxygendefine:: TIMER_DCR_DBA_SMCR
.. doxygendefine:: TIMER_DCR_DBA_DIER
.. doxygendefine:: TIMER_DCR_DBA_SR
.. doxygendefine:: TIMER_DCR_DBA_EGR
.. doxygendefine:: TIMER_DCR_DBA_CCMR1
.. doxygendefine:: TIMER_DCR_DBA_CCMR2
.. doxygendefine:: TIMER_DCR_DBA_CCER
.. doxygendefine:: TIMER_DCR_DBA_CNT
.. doxygendefine:: TIMER_DCR_DBA_PSC
.. doxygendefine:: TIMER_DCR_DBA_ARR
.. doxygendefine:: TIMER_DCR_DBA_RCR
.. doxygendefine:: TIMER_DCR_DBA_CCR1
.. doxygendefine:: TIMER_DCR_DBA_CCR2
.. doxygendefine:: TIMER_DCR_DBA_CCR3
.. doxygendefine:: TIMER_DCR_DBA_CCR4
.. doxygendefine:: TIMER_DCR_DBA_BDTR
.. doxygendefine:: TIMER_DCR_DBA_DCR
.. doxygendefine:: TIMER_DCR_DBA_DMAR