Timer
Examples
#include "abov/hal/gpio.h"
#include "abov/hal/timer.h"
#include "abov/irq.h"
#define MHZ 1000000U
#define TIMER_SOURCE_CLOCK_MHZ 16U
#define TIMER_COUNTER_WIDTH (1U << 16)
static volatile uint32_t measured_hz;
static void target_timer_gpio_init(void)
{
struct gpio_cfg cfg = {
.mode = GPIO_MODE_PUSHPULL,
.altfunc = true,
.altfunc_number = 1,
};
gpio_open(PERIPH_GPIOB, 0, &cfg);
}
static void capture_timer_gpio_init(void)
{
struct gpio_cfg cfg = {
.mode = GPIO_MODE_INPUT,
.altfunc = true,
.altfunc_number = 1,
};
gpio_open(PERIPH_GPIOA, 7, &cfg);
}
static void set_target_timer_clock_source(void)
{
timer_ll_set_clock_divider(PERIPH_TIMER0, 3); // 16MHz/64 = 250KHz
}
static void target_timer_init(void)
{
target_timer_gpio_init();
timer_init(PERIPH_TIMER0, &(struct timer_cfg) {
.mode = TIMER_MODE_NORMAL,
.frequency = 1000,
.set_clock_source = set_target_timer_clock_source, });
timer_set_reload(PERIPH_TIMER0, 1000 - 1); // every 1-sec
timer_start(PERIPH_TIMER0);
}
static void capture_timer_init(void)
{
capture_timer_gpio_init();
timer_init(PERIPH_TIMER1, &(struct timer_cfg) {
.mode = TIMER_MODE_CAPTURE,
.irq = (timer_event_t)(TIMER_EVENT_CC_0 |
TIMER_EVENT_CC_1 |
TIMER_EVENT_OVERFLOW),
.irq_priority = 3, });
timer_set_edge(PERIPH_TIMER1, TIMER_RISING_EDGE);
timer_start(PERIPH_TIMER1);
}
int main(void)
{
target_timer_init();
capture_timer_init();
while (1) {
uint32_t hz = measured_hz / MHZ;
uint32_t dec = measured_hz % MHZ;
(void)hz;
(void)dec;
}
return 0;
}
void ISR_TIMER1(void)
{
static uint32_t ovf = 0;
timer_event_t event = timer_get_event(PERIPH_TIMER1);
if (event & TIMER_EVENT_OVERFLOW) {
ovf++;
}
if (event & TIMER_EVENT_CC_0) {
uint32_t captured1 =
TIMER_COUNTER_WIDTH - timer_get_cc(PERIPH_TIMER1, 0);
uint32_t captured2 = timer_get_cc(PERIPH_TIMER1, 1) + 1;
uint32_t ticks =
ovf * TIMER_COUNTER_WIDTH + captured1 + captured2;
uint32_t hz = ticks / TIMER_SOURCE_CLOCK_MHZ;
measured_hz = hz;
ovf = 0;
}
if (event & TIMER_EVENT_CC_1) {
}
timer_clear_event(PERIPH_TIMER1, (timer_event_t)
(TIMER_EVENT_OVERFLOW |
TIMER_EVENT_CC_0 |
TIMER_EVENT_CC_1));
}
HAL
Functions
-
struct timer_cfg
- #include <timer.h>
Timer configuration
Public Members
-
timer_mode_t mode
-
uint32_t frequency
-
timer_event_t irq
-
int irq_priority
-
void (*set_clock_source)(void)
-
timer_mode_t mode
LL
Enums
-
enum timer_mode_t
Timer mode type
Values:
-
enumerator TIMER_MODE_NORMAL
-
enumerator TIMER_MODE_PWM
-
enumerator TIMER_MODE_ONESHOT
-
enumerator TIMER_MODE_CAPTURE
-
enumerator TIMER_MODE_NORMAL
-
enum timer_cc_t
Timer pin type
Values:
-
enumerator TIMER_CC_0
-
enumerator TIMER_CC_1
-
enumerator TIMER_CC_2
-
enumerator TIMER_CC_3
-
enumerator TIMER_CC_4
-
enumerator TIMER_CC_1N
-
enumerator TIMER_CC_2N
-
enumerator TIMER_CC_3N
-
enumerator TIMER_CC_4N
-
enumerator TIMER_CC_0
-
enum timer_cc_mode_t
Timer CC mode type
Values:
-
enumerator TIMER_CC_MODE_NONE
-
enumerator TIMER_CC_MODE_ACTIVE_HIGH
-
enumerator TIMER_CC_MODE_ACTIVE_LOW
-
enumerator TIMER_CC_MODE_TOGGLE
-
enumerator TIMER_CC_MODE_LOW
-
enumerator TIMER_CC_MODE_HIGH
-
enumerator TIMER_CC_MODE_PWM_ACTIVE_HIGH
-
enumerator TIMER_CC_MODE_PWM_ACTIVE_LOW
-
enumerator TIMER_CC_MODE_NONE
-
enum timer_event_t
Timer event type
Values:
-
enumerator TIMER_EVENT_NONE
-
enumerator TIMER_EVENT_OVERFLOW
-
enumerator TIMER_EVENT_UNDERFLOW
-
enumerator TIMER_EVENT_CC_0
Capture/Compare Channel interrupt
-
enumerator TIMER_EVENT_CC_1
-
enumerator TIMER_EVENT_CC_2
-
enumerator TIMER_EVENT_CC_3
-
enumerator TIMER_EVENT_CC_4
-
enumerator TIMER_EVENT_UPDATE
-
enumerator TIMER_EVENT_NONE
Functions
-
void timer_reset(periph_t peri)
Reset the timer interface.
This function makes the given timer in the reset default state.
- Parameters
peri – [in] a peripheral enumerated in periph_t
-
void timer_set_mode(periph_t peri, timer_mode_t mode)
Set the timer mode.
- Parameters
peri – [in] a peripheral enumerated in periph_t
mode – [in] one of timer_mode_t
-
void timer_enable_irq(periph_t peri, timer_event_t events)
Enable interrupts on events for a timer.
- Parameters
peri – [in] a peripheral enumerated in periph_t
events – [in] to be enabled
-
void timer_disable_irq(periph_t peri, timer_event_t events)
Disable interrupts on events for a timer.
- Parameters
peri – [in] a peripheral enumerated in periph_t
events – [in] to be disabled
-
void timer_set_clock_divider(periph_t peri, uint32_t div_factor)
Set the timer clock divider.
- Parameters
peri – [in] a peripheral enumerated in periph_t
div_factor – [in] clock divider
-
void timer_set_counter(periph_t peri, uint32_t value)
Set the timer counter.
- Parameters
peri – [in] a peripheral enumerated in periph_t
value – [in] to be written
-
uint32_t timer_get_counter(periph_t peri)
Get the timer counter.
- Parameters
peri – [in] a peripheral enumerated in periph_t
- Returns
timer counter
-
void timer_start(periph_t peri)
Start the timer.
- Parameters
peri – [in] a peripheral enumerated in periph_t
-
void timer_stop(periph_t peri)
Stop the timer.
- Parameters
peri – [in] a peripheral enumerated in periph_t
-
void timer_clear_event(periph_t peri, timer_event_t events)
Clear event flags.
- Parameters
peri – [in] a peripheral enumerated in periph_t
events – [in] to be cleared
-
timer_event_t timer_get_event(periph_t peri)
Read event flags.
- Parameters
peri – [in] a peripheral enumerated in periph_t
- Returns
events
-
void timer_set_prescaler(periph_t peri, uint32_t div_factor)
Set the timer prescaler.
- Parameters
peri – [in] a peripheral enumerated in periph_t
div_factor – [in] prescaler values
-
uint32_t timer_get_prescaler(periph_t peri)
Get the timer prescaler.
- Parameters
peri – [in] a peripheral enumerated in periph_t
-
void timer_set_reload(periph_t peri, uint32_t value)
Set the timer period.
- Parameters
peri – [in] a peripheral enumerated in periph_t
value – [in] to be written
-
uint32_t timer_get_reload(periph_t peri)
Get the timer period.
- Parameters
peri – [in] a peripheral enumerated in periph_t
- Returns
timer period
-
void timer_set_cc(periph_t peri, timer_cc_t cc, uint32_t value)
Set Capture/Compare register.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel
value – [in] to be written to the capture/compare register
-
uint32_t timer_get_cc(periph_t peri, timer_cc_t cc)
Get Capture/Compare register.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel
- Returns
capture/compare value
-
void timer_enable_cc_pin(periph_t peri, timer_cc_t cc)
Enable Capture/Compare pin.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel timer_cc_t
-
void timer_disable_cc_pin(periph_t peri, timer_cc_t cc)
Disable Capture/Compare pin.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel timer_cc_t
-
void timer_set_cc_pin(periph_t peri, timer_cc_t cc, uint32_t value)
Set Capture/Compare pin map.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel timer_cc_t
value – [in] 0 for output, 1 for TI1, 2 for TI2, and 3 for TRC
-
void timer_set_cc_pin_mode(periph_t peri, timer_cc_t cc, timer_cc_mode_t mode)
Set Capture/Compare pin mode.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel timer_cc_t
mode – [in] capture/compare output mode in timer_cc_mode_t
-
void timer_set_cc_pin_polarity(periph_t peri, timer_cc_t cc, bool active_high)
Set Capture/Compare polarity.
- Parameters
peri – [in] a peripheral enumerated in periph_t
cc – [in] a number of capture/compare channel timer_cc_t
active_high – [in] active high on true
-
void timer_enable_cc_preload(periph_t peri, timer_cc_t cc)
-
void timer_disable_cc_preload(periph_t peri, timer_cc_t cc)
-
void timer_enable_cc_fastmode(periph_t peri, timer_cc_t cc)
-
void timer_disable_cc_fastmode(periph_t peri, timer_cc_t cc)
-
void timer_set_cc_prescaler(periph_t peri, timer_cc_t cc, uint32_t value)
-
void timer_set_cc_filter(periph_t peri, timer_cc_t cc, uint32_t value)
-
void timer_set_counter_direction(periph_t peri, timer_direction_t dir)