Microchip® Advanced Software Framework

clock.c File Reference

SAM D21/R21/DA/HA Clock Driver.

Copyright (c) 2013-2018 Microchip Technology Inc. and its subsidiaries.

#include <clock.h>
#include <conf_clocks.h>
#include <system.h>
#include "clock_config_check.h"

Data Structures

struct  _system_clock_dfll_config
 DFLL-specific data container. More...
 
struct  _system_clock_dpll_config
 DPLL-specific data container. More...
 
struct  _system_clock_module
 System clock module data container. More...
 
struct  _system_clock_xosc_config
 XOSC-specific data container. More...
 

Macros

#define SYSCTRL_FUSES_OSC32K_ADDR   FUSES_OSC32K_CAL_ADDR
 
#define SYSCTRL_FUSES_OSC32K_Pos   FUSES_OSC32K_CAL_Pos
 

Functions

static void _switch_peripheral_gclk (void)
 
static void _system_clock_source_dfll_set_config_errata_9905 (void)
 
static void _system_dfll_wait_for_sync (void)
 Wait for sync to the DFLL control registers. More...
 
static void _system_osc32k_wait_for_sync (void)
 Wait for sync to the OSC32K control registers. More...
 
void system_clock_init (void)
 Initialize clock system based on the configuration in conf_clocks.h. More...
 
void system_clock_source_dfll_set_config (struct system_clock_source_dfll_config *const config)
 Configure the DFLL clock source. More...
 
enum status_code system_clock_source_disable (const enum system_clock_source clock_source)
 Disables a clock source. More...
 
enum status_code system_clock_source_enable (const enum system_clock_source clock_source)
 Enables a clock source. More...
 
uint32_t system_clock_source_get_hz (const enum system_clock_source clock_source)
 Retrieve the frequency of a clock source. More...
 
bool system_clock_source_is_ready (const enum system_clock_source clock_source)
 Checks if a clock source is ready. More...
 
void system_clock_source_osc32k_set_config (struct system_clock_source_osc32k_config *const config)
 Configure the internal OSC32K oscillator clock source. More...
 
void system_clock_source_osc8m_set_config (struct system_clock_source_osc8m_config *const config)
 Configure the internal OSC8M oscillator clock source. More...
 
enum status_code system_clock_source_write_calibration (const enum system_clock_source clock_source, const uint16_t calibration_value, const uint8_t freq_range)
 Writes the calibration values for a given oscillator clock source. More...
 
void system_clock_source_xosc32k_set_config (struct system_clock_source_xosc32k_config *const config)
 Configure the XOSC32K external 32KHz oscillator clock source. More...
 
void system_clock_source_xosc_set_config (struct system_clock_source_xosc_config *const config)
 Configure the external oscillator clock source. More...
 

Variables

static struct _system_clock_module _system_clock_inst
 Internal module instance to cache configuration values. More...
 

#define SYSCTRL_FUSES_OSC32K_ADDR   FUSES_OSC32K_CAL_ADDR

Referenced by system_clock_init().

#define SYSCTRL_FUSES_OSC32K_Pos   FUSES_OSC32K_CAL_Pos

Referenced by system_clock_init().

static void _switch_peripheral_gclk ( void  )
static
static void _system_clock_source_dfll_set_config_errata_9905 ( void  )
inlinestatic
static void _system_dfll_wait_for_sync ( void  )
inlinestatic

Wait for sync to the DFLL control registers.

Referenced by _system_clock_source_dfll_set_config_errata_9905(), and system_clock_source_get_hz().

static void _system_osc32k_wait_for_sync ( void  )
inlinestatic

Wait for sync to the OSC32K control registers.

Referenced by system_clock_source_write_calibration().

enum status_code system_clock_source_enable ( const enum system_clock_source  clock_source)

Enables a clock source.

Enables a clock source which has been previously configured.

Parameters
[in]clock_sourceClock source to enable
Return values
STATUS_OKClock source was enabled successfully and is ready
STATUS_ERR_INVALID_ARGThe clock source is not available on this device

References _system_clock_source_dfll_set_config_errata_9905(), Assert, _system_clock_dfll_config::control, _system_clock_module::dfll, STATUS_ERR_INVALID_ARG, STATUS_OK, SYSTEM_CLOCK_SOURCE_DFLL, SYSTEM_CLOCK_SOURCE_OSC32K, SYSTEM_CLOCK_SOURCE_OSC8M, SYSTEM_CLOCK_SOURCE_ULP32K, SYSTEM_CLOCK_SOURCE_XOSC, and SYSTEM_CLOCK_SOURCE_XOSC32K.

Referenced by system_clock_init().

enum status_code system_clock_source_write_calibration ( const enum system_clock_source  clock_source,
const uint16_t  calibration_value,
const uint8_t  freq_range 
)

Writes the calibration values for a given oscillator clock source.

Writes an oscillator calibration value to the given oscillator control registers. The acceptable ranges are:

For OSC32K:

  • 7 bits (max value 128) For OSC8MHZ:
  • 8 bits (Max value 255) For OSCULP:
  • 5 bits (Max value 32)
Note
The frequency range parameter applies only when configuring the 8MHz oscillator and will be ignored for the other oscillators.
Parameters
[in]clock_sourceClock source to calibrate
[in]calibration_valueCalibration value to write
[in]freq_rangeFrequency range (8MHz oscillator only)
Return values
STATUS_OKThe calibration value was written successfully.
STATUS_ERR_INVALID_ARGThe setting is not valid for selected clock source.

References _system_osc32k_wait_for_sync(), Assert, STATUS_ERR_INVALID_ARG, STATUS_OK, SYSTEM_CLOCK_SOURCE_OSC32K, SYSTEM_CLOCK_SOURCE_OSC8M, and SYSTEM_CLOCK_SOURCE_ULP32K.

struct _system_clock_module _system_clock_inst
static
Initial value:
= {
.dfll = {
.control = 0,
.val = 0,
.mul = 0,
},
.xosc = {
.frequency = 0,
},
.xosc32k = {
.frequency = 0,
},
}

Internal module instance to cache configuration values.