Microchip® Advanced Software Framework

 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Oscillator Management

This group contains functions and definitions related to configuring and enabling/disabling on-chip oscillators.

Internal RC-oscillators, external crystal oscillators and external clock generators are supported by this module. What all of these have in common is that they swing at a fixed, nominal frequency which is normally not adjustable.

Example: Enabling an oscillator

The following example demonstrates how to enable the external oscillator on XMEGA A and wait for it to be ready to use. The oscillator identifiers are platform-specific, so while the same procedure is used on all platforms, the parameter to osc_enable() will be different from device to device.

osc_enable(OSC_ID_XOSC);
osc_wait_ready(OSC_ID_XOSC);

Board-specific Definitions

If external oscillators are used, the board code must provide the following definitions for each of those:

Macros

#define CONFIG_RCFAST_FRANGE   0
 
#define OSC0_MODE_VALUE   UNDEFINED
 Board-dependent value written to the MODE bitfield of PM_OSCCTRL(0) More...
 
#define OSC0_STARTUP_TIMEOUT   UNDEFINED
 Number of slow clock cycles to wait for OSC0 to start. More...
 
#define OSC0_STARTUP_VALUE   UNDEFINED
 Board-dependent value written to the STARTUP bitfield of PM_OSCCTRL(0) More...
 
#define OSC32_MODE_VALUE   UNDEFINED
 
#define OSC32_STARTUP_TIMEOUT   UNDEFINED
 
#define OSC32_STARTUP_VALUE   UNDEFINED
 

Functions

void osc_priv_disable_osc0 (void)
 
void osc_priv_disable_osc32 (void)
 
void osc_priv_disable_rc1m (void)
 
void osc_priv_disable_rc32k (void)
 
void osc_priv_disable_rc80m (void)
 
void osc_priv_disable_rcfast (void)
 
void osc_priv_enable_osc0 (void)
 
void osc_priv_enable_osc32 (void)
 
void osc_priv_enable_rc1m (void)
 
void osc_priv_enable_rc32k (void)
 
void osc_priv_enable_rc80m (void)
 
void osc_priv_enable_rcfast (void)
 

Oscillator Management

static void osc_wait_ready (uint8_t id)
 Wait until the oscillator identified by id is ready. More...
 
static void osc_enable (uint8_t id)
 Enable oscillator id. More...
 
static void osc_disable (uint8_t id)
 Disable oscillator id. More...
 
static bool osc_is_ready (uint8_t id)
 Determine whether oscillator id is ready. More...
 
static uint32_t osc_get_rate (uint8_t id)
 Return the frequency of oscillator id in Hz. More...
 

Oscillator identifiers

#define OSC_ID_OSC0   0
 External Oscillator 0. More...
 
#define OSC_ID_OSC32   1
 External 32 kHz oscillator. More...
 
#define OSC_ID_RC32K   2
 Internal 32 kHz RC oscillator. More...
 
#define OSC_ID_RC80M   3
 Internal 80 MHz RC oscillator. More...
 
#define OSC_ID_RCFAST   4
 Internal 4-8-12 MHz RCFAST oscillator. More...
 
#define OSC_ID_RC1M   5
 Internal 1 MHz RC oscillator. More...
 
#define OSC_ID_RCSYS   6
 Internal System RC oscillator. More...
 

OSC0 mode values

#define OSC_MODE_EXTERNAL   0
 External clock connected to XIN. More...
 
#define OSC_MODE_XTAL   SCIF_OSCCTRL0_MODE
 Crystal connected to XIN/XOUT. More...
 

OSC32 mode values

#define OSC32_MODE_EXTERNAL   BSCIF_OSCCTRL32_MODE(0)
 External clock connected to XIN32. More...
 
#define OSC32_MODE_XTAL   BSCIF_OSCCTRL32_MODE(1)
 Crystal connected to XIN32/XOUT32. More...
 
#define OSC32_MODE_XTAL_HC   BSCIF_OSCCTRL32_MODE(4)
 Crystal connected to XIN32/XOUT32 in high current mode. More...
 

OSC0 startup values

#define OSC_STARTUP_0   SCIF_OSCCTRL0_STARTUP(0)
 0 cycles More...
 
#define OSC_STARTUP_64   SCIF_OSCCTRL0_STARTUP(1)
 64 cycles (560 us) More...
 
#define OSC_STARTUP_128   SCIF_OSCCTRL0_STARTUP(2)
 128 cycles (1.1 ms) More...
 
#define OSC_STARTUP_2048   SCIF_OSCCTRL0_STARTUP(3)
 2048 cycles (18 ms) More...
 
#define OSC_STARTUP_4096   SCIF_OSCCTRL0_STARTUP(4)
 4096 cycles (36 ms) More...
 
#define OSC_STARTUP_8192   SCIF_OSCCTRL0_STARTUP(5)
 8192 cycles (71 ms) More...
 
#define OSC_STARTUP_16384   SCIF_OSCCTRL0_STARTUP(6)
 16384 cycles (143 ms) More...
 
#define OSC_STARTUP_32768   SCIF_OSCCTRL0_STARTUP(7)
 32768 cycles (285 ms) More...
 

OSC32 startup values

#define OSC32_STARTUP_0   BSCIF_OSCCTRL32_STARTUP(0)
 0 cycles More...
 
#define OSC32_STARTUP_128   BSCIF_OSCCTRL32_STARTUP(1)
 128 cycles (1.1 ms) More...
 
#define OSC32_STARTUP_8192   BSCIF_OSCCTRL32_STARTUP(2)
 8192 cycles (72.3 ms) More...
 
#define OSC32_STARTUP_16384   BSCIF_OSCCTRL32_STARTUP(3)
 16384 cycles (143 ms) More...
 
#define OSC32_STARTUP_65536   BSCIF_OSCCTRL32_STARTUP(4)
 65536 cycles (570 ms) More...
 
#define OSC32_STARTUP_131072   BSCIF_OSCCTRL32_STARTUP(5)
 131072 cycles (1.1 s) More...
 
#define OSC32_STARTUP_262144   BSCIF_OSCCTRL32_STARTUP(6)
 262144 cycles (2.3 s) More...
 
#define OSC32_STARTUP_524288   BSCIF_OSCCTRL32_STARTUP(7)
 524288 cycles (4.6 s) More...
 

Board-specific configuration parameters

The following definitions must be provided by the board code for all working oscillators on the board.

#define BOARD_OSC32_SELCURR   BSCIF_OSCCTRL32_SELCURR(10)
 Crystal current selection for OSC32. More...
 

RC oscillator frequency limits

The frequency of the internal RC oscillators may drift a bit as a result of temperature changes.

These definitions provide upper and lower limits which may be used to calculate upper and lower limits of timeouts, derived clock frequencies, etc.

#define OSC_RCSYS_NOMINAL_HZ   115000
 Nominal frequency of RCSYS in Hz. More...
 
#define OSC_RCSYS_MIN_HZ   100000
 Minimum frequency of RCSYS in Hz. More...
 
#define OSC_RCSYS_MAX_HZ   120000
 Maximum frequency of RCSYS in Hz. More...
 
#define OSC_RC32K_NOMINAL_HZ   32768
 Nominal frequency of RC32K in Hz. More...
 
#define OSC_RC32K_MIN_HZ   20000
 Minimum frequency of RC32K in Hz. More...
 
#define OSC_RC32K_MAX_HZ   44000
 Maximum frequency of RC32K in Hz. More...
 
#define OSC_RC80M_NOMINAL_HZ   80000000
 Nominal frequency of RC80M in Hz. More...
 
#define OSC_RCFAST4M_NOMINAL_HZ   4000000
 Nominal frequency of RCFAST4M in Hz. More...
 
#define OSC_RCFAST8M_NOMINAL_HZ   8000000
 Nominal frequency of RCFAST8M in Hz. More...
 
#define OSC_RCFAST12M_NOMINAL_HZ   12000000
 Nominal frequency of RCFAST12M in Hz. More...
 
#define OSC_RC1M_NOMINAL_HZ   1000000
 Nominal frequency of RC1M in Hz. More...
 

#define BOARD_OSC32_SELCURR   BSCIF_OSCCTRL32_SELCURR(10)

Crystal current selection for OSC32.

If not defined, the recommended value (300nA) are used.

#define CONFIG_RCFAST_FRANGE   0
#define OSC0_MODE_VALUE   UNDEFINED

Board-dependent value written to the MODE bitfield of PM_OSCCTRL(0)

#define OSC0_STARTUP_TIMEOUT   UNDEFINED

Number of slow clock cycles to wait for OSC0 to start.

This is the number of slow clock cycles corresponding to OSC0_STARTUP_VALUE with an additional 25% safety margin. If the oscillator isn't running when this timeout has expired, it is assumed to have failed to start.

Referenced by run_osc_test().

#define OSC0_STARTUP_VALUE   UNDEFINED

Board-dependent value written to the STARTUP bitfield of PM_OSCCTRL(0)

#define OSC32_MODE_EXTERNAL   BSCIF_OSCCTRL32_MODE(0)

External clock connected to XIN32.

#define OSC32_MODE_VALUE   UNDEFINED
#define OSC32_MODE_XTAL   BSCIF_OSCCTRL32_MODE(1)

Crystal connected to XIN32/XOUT32.

#define OSC32_MODE_XTAL_HC   BSCIF_OSCCTRL32_MODE(4)

Crystal connected to XIN32/XOUT32 in high current mode.

#define OSC32_STARTUP_0   BSCIF_OSCCTRL32_STARTUP(0)

0 cycles

#define OSC32_STARTUP_128   BSCIF_OSCCTRL32_STARTUP(1)

128 cycles (1.1 ms)

#define OSC32_STARTUP_131072   BSCIF_OSCCTRL32_STARTUP(5)

131072 cycles (1.1 s)

#define OSC32_STARTUP_16384   BSCIF_OSCCTRL32_STARTUP(3)

16384 cycles (143 ms)

#define OSC32_STARTUP_262144   BSCIF_OSCCTRL32_STARTUP(6)

262144 cycles (2.3 s)

#define OSC32_STARTUP_524288   BSCIF_OSCCTRL32_STARTUP(7)

524288 cycles (4.6 s)

#define OSC32_STARTUP_65536   BSCIF_OSCCTRL32_STARTUP(4)

65536 cycles (570 ms)

#define OSC32_STARTUP_8192   BSCIF_OSCCTRL32_STARTUP(2)

8192 cycles (72.3 ms)

#define OSC32_STARTUP_TIMEOUT   UNDEFINED
#define OSC32_STARTUP_VALUE   UNDEFINED
#define OSC_ID_RC1M   5
#define OSC_ID_RC32K   2
#define OSC_ID_RC80M   3
#define OSC_ID_RCFAST   4
#define OSC_ID_RCSYS   6
#define OSC_MODE_EXTERNAL   0

External clock connected to XIN.

#define OSC_MODE_XTAL   SCIF_OSCCTRL0_MODE

Crystal connected to XIN/XOUT.

#define OSC_RC1M_NOMINAL_HZ   1000000

Nominal frequency of RC1M in Hz.

Referenced by osc_get_rate(), and sysclk_get_main_hz().

#define OSC_RC32K_MAX_HZ   44000

Maximum frequency of RC32K in Hz.

#define OSC_RC32K_MIN_HZ   20000

Minimum frequency of RC32K in Hz.

#define OSC_RC32K_NOMINAL_HZ   32768

Nominal frequency of RC32K in Hz.

Referenced by dfll_priv_get_source_hz(), main(), osc_get_rate(), and wdt_set_ctrl().

#define OSC_RC80M_NOMINAL_HZ   80000000

Nominal frequency of RC80M in Hz.

Referenced by dfll_priv_get_source_hz(), osc_get_rate(), and sysclk_get_main_hz().

#define OSC_RCFAST12M_NOMINAL_HZ   12000000

Nominal frequency of RCFAST12M in Hz.

Referenced by osc_get_rate(), and sysclk_get_main_hz().

#define OSC_RCFAST4M_NOMINAL_HZ   4000000

Nominal frequency of RCFAST4M in Hz.

Referenced by osc_get_rate(), and sysclk_get_main_hz().

#define OSC_RCFAST8M_NOMINAL_HZ   8000000

Nominal frequency of RCFAST8M in Hz.

Referenced by osc_get_rate(), and sysclk_get_main_hz().

#define OSC_RCSYS_MAX_HZ   120000

Maximum frequency of RCSYS in Hz.

#define OSC_RCSYS_MIN_HZ   100000

Minimum frequency of RCSYS in Hz.

#define OSC_RCSYS_NOMINAL_HZ   115000

Nominal frequency of RCSYS in Hz.

Referenced by dfll_priv_get_source_hz(), main(), osc_get_rate(), run_osc32_test(), sysclk_get_main_hz(), and wdt_set_ctrl().

#define OSC_STARTUP_0   SCIF_OSCCTRL0_STARTUP(0)

0 cycles

#define OSC_STARTUP_128   SCIF_OSCCTRL0_STARTUP(2)

128 cycles (1.1 ms)

#define OSC_STARTUP_16384   SCIF_OSCCTRL0_STARTUP(6)

16384 cycles (143 ms)

#define OSC_STARTUP_2048   SCIF_OSCCTRL0_STARTUP(3)

2048 cycles (18 ms)

#define OSC_STARTUP_32768   SCIF_OSCCTRL0_STARTUP(7)

32768 cycles (285 ms)

#define OSC_STARTUP_4096   SCIF_OSCCTRL0_STARTUP(4)

4096 cycles (36 ms)

#define OSC_STARTUP_64   SCIF_OSCCTRL0_STARTUP(1)

64 cycles (560 us)

#define OSC_STARTUP_8192   SCIF_OSCCTRL0_STARTUP(5)

8192 cycles (71 ms)

osc_is_ready ( uint8_t  id)
inlinestatic

Determine whether oscillator id is ready.

Return values
trueOscillator id is running and ready to use as a clock source.
falseOscillator id is not running.

References OSC_ID_OSC0, OSC_ID_OSC32, OSC_ID_RC1M, OSC_ID_RC32K, OSC_ID_RC80M, OSC_ID_RCFAST, and OSC_ID_RCSYS.

Referenced by config_ast(), dfll_enable_source(), event_qtouch_init(), example_qtouch_init(), genclk_enable_source(), init_ast(), lcdca_clk_init(), main(), osc_wait_ready(), pll_enable_source(), run_osc32_test(), run_osc_test(), and run_wdt_test_all().

void osc_priv_disable_osc0 ( void  )

Referenced by osc_disable().

void osc_priv_disable_osc32 ( void  )

Referenced by osc_disable().

void osc_priv_disable_rc1m ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_disable().

void osc_priv_disable_rc32k ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_disable().

void osc_priv_disable_rc80m ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_disable().

void osc_priv_disable_rcfast ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_disable().

void osc_priv_enable_osc0 ( void  )

Referenced by osc_enable().

void osc_priv_enable_osc32 ( void  )

Referenced by main(), and osc_enable().

void osc_priv_enable_rc1m ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_enable().

void osc_priv_enable_rc32k ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_enable().

void osc_priv_enable_rc80m ( void  )

References cpu_irq_restore(), cpu_irq_save(), and temp.

Referenced by osc_enable().

void osc_priv_enable_rcfast ( void  )
static void osc_wait_ready ( uint8_t  id)
inlinestatic

Wait until the oscillator identified by id is ready.

This function will busy-wait for the oscillator identified by id to become stable and ready to use as a clock source.

Parameters
idA number identifying the oscillator to wait for.

References osc_is_ready().

Referenced by config_ast(), dfll_enable_source(), genclk_enable_source(), init_ast(), lcdca_clk_init(), main(), pll_enable_source(), run_pll_dfll_test(), run_wdt_test_all(), and sysclk_init().