Contiki 3.x
Files | Functions

Implementation of the clock module for the cc2538. More...

Files

file  clock.c
 Clock driver implementation for the TI cc2538.
 

Functions

void clock_init (void)
 Arch-specific implementation of clock_init for the cc2538. More...
 
CCIF clock_time_t clock_time (void)
 Get the current clock time. More...
 
void clock_set_seconds (unsigned long sec)
 Set the value of the platform seconds. More...
 
CCIF unsigned long clock_seconds (void)
 Get the current value of the platform seconds. More...
 
void clock_wait (clock_time_t i)
 Wait for a given number of ticks. More...
 
void clock_delay_usec (uint16_t dt)
 Delay a given number of microseconds. More...
 
void clock_delay (unsigned int i)
 Obsolete delay function but we implement it here since some code still uses it.
 
static void update_ticks (void)
 Update the software clock ticks and seconds. More...
 
void clock_adjust (void)
 Adjust the clock following missed SysTick ISRs. More...
 
void clock_isr (void)
 The clock Interrupt Service Routine. More...
 

Detailed Description

Implementation of the clock module for the cc2538.

To implement the clock functionality, we use the SysTick peripheral on the cortex-M3. We run the system clock at a configurable speed and set the SysTick to give us 128 interrupts / sec. However, the Sleep Timer counter value is used for the number of elapsed ticks in order to avoid a significant time drift caused by PM1/2. Contrary to the Sleep Timer, the SysTick peripheral is indeed frozen during PM1/2, so adjusting upon wake-up a tick counter based on this peripheral would hardly be accurate.

Function Documentation

void clock_adjust ( void  )

Adjust the clock following missed SysTick ISRs.

This function is useful when coming out of PM1/2, during which the system clock is stopped. We adjust the clock counters like after any SysTick ISR.

Note
This function is only meant to be used by lpm_exit(). Applications should really avoid calling this

Definition at line 230 of file clock.c.

References update_ticks().

void clock_delay_usec ( uint16_t  dt)

Delay a given number of microseconds.

Parameters
dtHow many microseconds to delay.
Note
Interrupts could increase the delay by a variable amount.

Definition at line 156 of file clock.c.

References GPT_0_BASE, GPTIMER_CTL, GPTIMER_CTL_TAEN, and GPTIMER_TAILR.

void clock_init ( void  )

Arch-specific implementation of clock_init for the cc2538.

Initialize the clock library.

We initialise the SysTick to fire 128 interrupts per second, giving us a value of 128 for CLOCK_SECOND

We also initialise GPT0:Timer A, which is used by clock_delay_usec(). We use 16-bit range (individual), count-down, one-shot, no interrupts. The prescaler is computed according to the system clock in order to get 1 tick per usec.

Definition at line 93 of file clock.c.

References GPT_0_BASE, GPTIMER_CFG, GPTIMER_CTL, GPTIMER_TAMR, GPTIMER_TAPR, SYS_CTRL_RCGCGPT, and SYS_CTRL_RCGCGPT_GPT0.

void clock_isr ( void  )

The clock Interrupt Service Routine.

It polls the etimer process if an etimer has expired. It also updates the software clock tick and seconds counter.

Definition at line 248 of file clock.c.

CCIF unsigned long clock_seconds ( void  )

Get the current value of the platform seconds.

This could be the number of seconds since startup, or since a standard epoch.

Returns
The value.

Get the current value of the platform seconds.

The comparison avoids the need to disable clock interrupts for an atomic read of the four-byte variable.

Definition at line 136 of file clock.c.

void clock_set_seconds ( unsigned long  sec)

Set the value of the platform seconds.

Parameters
secThe value to set.

Set the value of the platform seconds.

to a standard epoch for an absolute date/time.

Definition at line 130 of file clock.c.

CCIF clock_time_t clock_time ( void  )

Get the current clock time.

This function returns the current system clock time.

Returns
The current clock time, measured in system ticks.

Get the current clock time.

When 16 bit it typically wraps every 10 minutes. The comparison avoids the need to disable clock interrupts for an atomic read of the multi-byte variable.

Definition at line 124 of file clock.c.

void clock_wait ( clock_time_t  t)

Wait for a given number of ticks.

Parameters
tHow many ticks.

Definition at line 142 of file clock.c.

References clock_time(), and start().

static void update_ticks ( void  )
static

Update the software clock ticks and seconds.

This function is used to update the software tick counters whenever the system clock might have changed, which can occur upon a SysTick ISR or upon wake-up from PM1/2.

For the software clock ticks counter, the Sleep Timer counter value is used as the base tick value, and extended to a 64-bit value thanks to a detection of wraparounds.

For the seconds counter, the changes of the Sleep Timer counter value are added to the reference time, which is either the startup time or the value passed to clock_set_seconds().

This function polls the etimer process if an etimer has expired.

Definition at line 193 of file clock.c.

References etimer_pending(), etimer_request_poll(), and RTIMER_NOW.

Referenced by clock_adjust(), clock_init(), clock_isr(), and rtimer_arch_init().