Mistake on this page?
Report an issue in GitHub or email us
Modules | Functions
Low Power Ticker

Low level interface to the low power ticker of a target. More...

Modules

 Low Power Ticker tests
 Tests to validate the proper implementation of the low power 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_lp_ticker_irq_handler (ticker_irq_handler_type ticker_irq_handler)
 Set low power ticker IRQ handler. More...
 
const ticker_data_tget_lp_ticker_data (void)
 Get low power ticker's data. More...
 
void lp_ticker_irq_handler (void)
 The wrapper for ticker_irq_handler, to pass lp ticker's data. More...
 
void lp_ticker_init (void)
 Initialize the low power ticker. More...
 
void lp_ticker_free (void)
 Deinitialize the lower power ticker. More...
 
uint32_t lp_ticker_read (void)
 Read the current tick. More...
 
void lp_ticker_set_interrupt (timestamp_t timestamp)
 Set interrupt for specified timestamp. More...
 
void lp_ticker_disable_interrupt (void)
 Disable low power ticker interrupt. More...
 
void lp_ticker_clear_interrupt (void)
 Clear the low power ticker interrupt. More...
 
void lp_ticker_fire_interrupt (void)
 Set pending interrupt that should be fired right away. More...
 
const ticker_info_tlp_ticker_get_info (void)
 Get frequency and counter bits of this ticker. More...
 

Detailed Description

Low level interface to the low power ticker of a target.

Defined behavior

Undefined behavior

Potential bugs

See also
Low Power Ticker tests

Compile-time optimization macros

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

LP_TICKER_PERIOD_NUM, LP_TICKER_PERIOD_DEN: These denote the ratio (numerator, denominator) of the ticker period to a microsecond. For example, a 64kHz ticker would have NUM = 125, DEN = 8; a 4kHz ticker would have NUM = 250, DEN = 1; a 32.768kHz ticker would have NUM = 15625, DEN = 512. Both numerator and denominator must be 32 bits or less. They do not need to be fully simplified, so 32.768kHz could also be NUM = 1000000, DEN = 32768, but more simplification may be a minor speed optimisation, as can matching numerator or denominator with US_TICKER.

LP_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 lp_ticker_get_info by test lp_ticker_info_test.

Function Documentation

const ticker_data_t* get_lp_ticker_data ( void  )

Get low power ticker's data.

Returns
The low power ticker data
void lp_ticker_clear_interrupt ( void  )

Clear the low power ticker interrupt.

Pseudo Code:

1 void lp_ticker_clear_interrupt(void)
2 {
3  // Write to the ICR (interrupt clear register) of the LPTMR
4  LPTMR_ICR = LPTMR_ICR_COMPARE_Msk;
5 }
void lp_ticker_disable_interrupt ( void  )

Disable low power ticker interrupt.

Pseudo Code:

1 void lp_ticker_disable_interrupt(void)
2 {
3  // Disable the compare interrupt
4  LPTMR_CTRL &= ~LPTMR_CTRL_COMPARE_ENABLE_Msk;
5 }
void lp_ticker_fire_interrupt ( void  )

Set pending interrupt that should be fired right away.

Pseudo Code:

1 void lp_ticker_fire_interrupt(void)
2 {
3  NVIC_SetPendingIRQ(LPTMR_IRQn);
4 }
void lp_ticker_free ( void  )

Deinitialize the lower power ticker.

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

After calling this function no other ticker functions should be called except lp_ticker_init(). Calling any function other than init after freeing is undefined.

Note
This function stops the ticker from counting.
const ticker_info_t* lp_ticker_get_info ( void  )

Get frequency and counter bits of this ticker.

Pseudo Code:

1 const ticker_info_t* lp_ticker_get_info()
2 {
3  static const ticker_info_t info = {
4  32768, // 32KHz
5  16 // 16 bit counter
6  };
7  return &info;
8 }
void lp_ticker_init ( void  )

Initialize the low power ticker.

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

Pseudo Code:

1 void lp_ticker_init()
2 {
3  // Enable clock gate so processor can read LPTMR registers
4  POWER_CTRL |= POWER_CTRL_LPTMR_Msk;
5 
6  // Disable the timer and ensure it is powered down
7  LPTMR_CTRL &= ~(LPTMR_CTRL_ENABLE_Msk | LPTMR_CTRL_COMPARE_ENABLE_Msk);
8 
9  // Configure divisors - no division necessary
10  LPTMR_PRESCALE = 0;
11  LPTMR_CTRL |= LPTMR_CTRL_ENABLE_Msk;
12 
13  // Install the interrupt handler
14  NVIC_SetVector(LPTMR_IRQn, (uint32_t)lp_ticker_irq_handler);
15  NVIC_EnableIRQ(LPTMR_IRQn);
16 }
void lp_ticker_irq_handler ( void  )

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

uint32_t lp_ticker_read ( void  )

Read the current tick.

If no rollover has occurred, the seconds passed since lp_ticker_init() was called can be found by dividing the ticks returned by this function by the frequency returned by lp_ticker_get_info.

Returns
The current timer's counter value in ticks

Pseudo Code:

1 uint32_t lp_ticker_read()
2 {
3  uint16_t count;
4  uint16_t last_count;
5 
6  // Loop until the same tick is read twice since this
7  // is ripple counter on a different clock domain.
8  count = LPTMR_COUNT;
9  do {
10  last_count = count;
11  count = LPTMR_COUNT;
12  } while (last_count != count);
13 
14  return count;
15 }
void lp_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 lp_ticker_fire_interrupt() if this is the case
calling this function with timestamp of more than the supported number of bits returned by lp_ticker_get_info results in undefined behavior.

Pseudo Code:

1 void lp_ticker_set_interrupt(timestamp_t timestamp)
2 {
3  LPTMR_COMPARE = timestamp;
4  LPTMR_CTRL |= LPTMR_CTRL_COMPARE_ENABLE_Msk;
5 }
ticker_irq_handler_type set_lp_ticker_irq_handler ( ticker_irq_handler_type  ticker_irq_handler)

Set low power 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
Important Information for this Arm website

This site uses cookies to store information on your computer. By continuing to use our site, you consent to our cookies. If you are not happy with the use of these cookies, please review our Cookie Policy to learn how they can be disabled. By disabling cookies, some features of the site will not work.