Mbed OS Reference
Loading...
Searching...
No Matches
Microsecond Ticker

Low level interface to the microsecond ticker of a target. More...

Modules

 Microsecond Ticker tests
 Tests to validate the proper implementation of the microsecond ticker.
 
 Ticker Hal
 Low level interface to the ticker of a target.
 
 Ticker Tests
 Tests to validate the proper implementation of a ticker.
 

Functions

ticker_irq_handler_type set_us_ticker_irq_handler (ticker_irq_handler_type ticker_irq_handler)
 Set ticker IRQ handler. More...
 
const ticker_data_tget_us_ticker_data (void)
 Get ticker's data. More...
 
void us_ticker_irq_handler (void)
 The wrapper for ticker_irq_handler, to pass us ticker's data. More...
 
void us_ticker_init (void)
 Initialize the ticker. More...
 
void us_ticker_free (void)
 Deinitialize the us ticker. More...
 
uint32_t() us_ticker_read (void)
 Read the current counter. More...
 
void us_ticker_set_interrupt (timestamp_t timestamp)
 Set interrupt for specified timestamp. More...
 
void us_ticker_disable_interrupt (void)
 Disable us ticker interrupt. More...
 
void us_ticker_clear_interrupt (void)
 Clear us ticker interrupt. More...
 
void us_ticker_fire_interrupt (void)
 Set pending interrupt that should be fired right away. More...
 
const ticker_info_tus_ticker_get_info (void)
 Get frequency and counter bits of this ticker. More...
 

Detailed Description

Low level interface to the microsecond ticker of a target.

Defined behavior

Undefined behavior

See also
Microsecond Ticker tests

Compile-time optimization macros

To permit compile-time optimization, particularly of wait_us, the following macros should be defined by a target's device.h:

US_TICKER_PERIOD_NUM, US_TICKER_PERIOD_DEN: These denote the ratio (numerator, denominator) of the ticker period to a microsecond. For example, an 8MHz ticker would have NUM = 1, DEN = 8; a 1MHz ticker would have NUM = 1, DEN = 1; a 250kHz ticker would have NUM = 4, DEN = 1. Both numerator and denominator must be 16 bits or less, but need not be fully simplified.

US_TICKER_MASK: The value mask for the ticker - eg 0x07FFFFFF for a 27-bit ticker.

If any are defined, all 3 must be defined, and the macros are checked for consistency with us_ticker_get_info by test us_ticker_info_test.

Function Documentation

◆ set_us_ticker_irq_handler()

ticker_irq_handler_type set_us_ticker_irq_handler ( ticker_irq_handler_type  ticker_irq_handler)

Set ticker IRQ handler.

Parameters
ticker_irq_handlerIRQ handler to be connected
Returns
previous ticker IRQ handler
Note
by default IRQ handler is set to ticker_irq_handler
this function is primarily for testing purposes and it's not required part of HAL implementation

◆ get_us_ticker_data()

const ticker_data_t * get_us_ticker_data ( void  )

Get ticker's data.

Returns
The microsecond ticker data

◆ us_ticker_irq_handler()

void us_ticker_irq_handler ( void  )

The wrapper for ticker_irq_handler, to pass us ticker's data.

◆ us_ticker_init()

void us_ticker_init ( void  )

Initialize the ticker.

Initialize or re-initialize the ticker. This resets all the clocking and prescaler registers, along with disabling the compare interrupt.

Implementations must tolerate this function being called multiple times, and subsequent calls after the first one shall clear any configured interrupt.

Note
Initialization properties tested by ticker_init_test

Pseudo Code:

{
// Enable clock gate so processor can read TIMER registers
POWER_CTRL |= POWER_CTRL_TIMER_Msk;
// Disable the timer and ensure it is powered down
TIMER_CTRL &= ~(TIMER_CTRL_ENABLE_Msk | TIMER_CTRL_COMPARE_ENABLE_Msk);
// Configure divisors
uint32_t prescale = SystemCoreClock / 1000000;
TIMER_PRESCALE = prescale - 1;
TIMER_CTRL |= TIMER_CTRL_ENABLE_Msk;
// Install the interrupt handler
NVIC_SetVector(TIMER_IRQn, (uint32_t)us_ticker_irq_handler);
NVIC_EnableIRQ(TIMER_IRQn);
}
void us_ticker_irq_handler(void)
The wrapper for ticker_irq_handler, to pass us ticker's data.
void us_ticker_init(void)
Initialize the ticker.

◆ us_ticker_free()

void us_ticker_free ( void  )

Deinitialize the us ticker.

Powerdown the us ticker in preparation for sleep, powerdown, or reset.

After this function is called, no other ticker functions should be called except us_ticker_init(), calling any function other than init is undefined.

Note
This function stops the ticker from counting.

Pseudo Code:

uint32_t us_ticker_free()
{
// Disable timer
TIMER_CTRL &= ~TIMER_CTRL_ENABLE_Msk;
// Disable the compare interrupt
TIMER_CTRL &= ~TIMER_CTRL_COMPARE_ENABLE_Msk;
// Disable timer interrupt
NVIC_DisableIRQ(TIMER_IRQn);
// Disable clock gate so processor cannot read TIMER registers
POWER_CTRL &= ~POWER_CTRL_TIMER_Msk;
}
void us_ticker_free(void)
Deinitialize the us ticker.

◆ us_ticker_read()

uint32_t() us_ticker_read ( void  )

Read the current counter.

Read the current counter value without performing frequency conversions. If no rollover has occurred, the seconds passed since us_ticker_init() was called can be found by dividing the ticks returned by this function by the frequency returned by us_ticker_get_info.

Returns
The current timer's counter value in ticks

Pseudo Code:

uint32_t us_ticker_read()
{
return TIMER_COUNT;
}
uint32_t() us_ticker_read(void)
Read the current counter.

◆ us_ticker_set_interrupt()

void us_ticker_set_interrupt ( timestamp_t  timestamp)

Set interrupt for specified timestamp.

Parameters
timestampThe time in ticks to be set
Note
no special handling needs to be done for times in the past as the common timer code will detect this and call us_ticker_fire_interrupt() if this is the case
calling this function with timestamp of more than the supported number of bits returned by us_ticker_get_info results in undefined behavior.

Pseudo Code:

{
TIMER_COMPARE = timestamp;
TIMER_CTRL |= TIMER_CTRL_COMPARE_ENABLE_Msk;
}
void us_ticker_set_interrupt(timestamp_t timestamp)
Set interrupt for specified timestamp.
uint32_t timestamp_t
Legacy format representing a timestamp in us.
Definition: ticker_api.h:33

◆ us_ticker_disable_interrupt()

void us_ticker_disable_interrupt ( void  )

Disable us ticker interrupt.

Pseudo Code:

{
// Disable the compare interrupt
TIMER_CTRL &= ~TIMER_CTRL_COMPARE_ENABLE_Msk;
}
void us_ticker_disable_interrupt(void)
Disable us ticker interrupt.

◆ us_ticker_clear_interrupt()

void us_ticker_clear_interrupt ( void  )

Clear us ticker interrupt.

Pseudo Code:

{
// Write to the ICR (interrupt clear register) of the TIMER
TIMER_ICR = TIMER_ICR_COMPARE_Msk;
}
void us_ticker_clear_interrupt(void)
Clear us ticker interrupt.

◆ us_ticker_fire_interrupt()

void us_ticker_fire_interrupt ( void  )

Set pending interrupt that should be fired right away.

The ticker should be initialized prior calling this function.

Note: This function might be called from the ticker ISR, in which case it should schedule the ticker ISR to be executed again as soon as it returns.

Pseudo Code:

{
NVIC_SetPendingIRQ(TIMER_IRQn);
}
void us_ticker_fire_interrupt(void)
Set pending interrupt that should be fired right away.

◆ us_ticker_get_info()

const ticker_info_t * us_ticker_get_info ( void  )

Get frequency and counter bits of this ticker.

Pseudo Code:

{
static const ticker_info_t info = {
1000000, // 1 MHz
32 // 32 bit counter
};
return &info;
}
const ticker_info_t * us_ticker_get_info(void)
Get frequency and counter bits of this ticker.
The key size.
Information about the ticker implementation.
Definition: ticker_api.h:53