Timer

../_images/timer.svg

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

bool timer_init(periph_t timer, const struct timer_cfg *cfg)

Initialize the timer.

Parameters
  • timer[in] a peripheral enumerated in periph_t

  • cfg[in] pointer to the structure with the initial configuration

Returns

true on success

void timer_deinit(periph_t timer)

Deinitialize the timer.

Parameters

timer[in] a peripheral enumerated in periph_t

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)

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
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
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
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
enum timer_direction_t

Values:

enumerator TIMER_DIRECTION_UP
enumerator TIMER_DIRECTION_DOWN

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
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

uint32_t timer_get_frequency(periph_t peri, uint32_t tclk)
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)
void timer_set_counter_alignment_mode(periph_t peri, uint32_t align)
void timer_set_slave_mode(periph_t peri, uint32_t value)