mbed library sources

Dependents:   Encrypted my_mbed lklk CyaSSL_DTLS_Cellular ... more

Superseded

This library was superseded by mbed-dev - https://os.mbed.com/users/mbed_official/code/mbed-dev/.

Development branch of the mbed library sources. This library is kept in synch with the latest changes from the mbed SDK and it is not guaranteed to work.

If you are looking for a stable and tested release, please import one of the official mbed library releases:

Import librarymbed

The official Mbed 2 C/C++ SDK provides the software platform and libraries to build your applications.

Committer:
mbed_official
Date:
Fri Jul 17 09:15:10 2015 +0100
Revision:
592:a274ee790e56
Parent:
579:53297373a894
Synchronized with git revision e7144f83a8d75df80c4877936b6ffe552b0be9e6

Full URL: https://github.com/mbedmicro/mbed/commit/e7144f83a8d75df80c4877936b6ffe552b0be9e6/

More API implementation for SAMR21

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbed_official 579:53297373a894 1 #include <compiler.h>
mbed_official 579:53297373a894 2 #include <clock.h>
mbed_official 579:53297373a894 3 #include <conf_clocks.h>
mbed_official 579:53297373a894 4 #include <system.h>
mbed_official 579:53297373a894 5
mbed_official 579:53297373a894 6 #ifndef SYSCTRL_FUSES_OSC32K_ADDR
mbed_official 579:53297373a894 7 # define SYSCTRL_FUSES_OSC32K_ADDR SYSCTRL_FUSES_OSC32K_CAL_ADDR
mbed_official 579:53297373a894 8 # define SYSCTRL_FUSES_OSC32K_Pos SYSCTRL_FUSES_OSC32K_CAL_Pos
mbed_official 579:53297373a894 9 #endif
mbed_official 579:53297373a894 10
mbed_official 579:53297373a894 11 /**
mbed_official 579:53297373a894 12 * \internal
mbed_official 579:53297373a894 13 * \brief DFLL-specific data container.
mbed_official 579:53297373a894 14 */
mbed_official 579:53297373a894 15 struct _system_clock_dfll_config {
mbed_official 579:53297373a894 16 uint32_t control;
mbed_official 579:53297373a894 17 uint32_t val;
mbed_official 579:53297373a894 18 uint32_t mul;
mbed_official 579:53297373a894 19 };
mbed_official 579:53297373a894 20
mbed_official 579:53297373a894 21 /**
mbed_official 579:53297373a894 22 * \internal
mbed_official 579:53297373a894 23 * \brief DPLL-specific data container.
mbed_official 579:53297373a894 24 */
mbed_official 579:53297373a894 25 struct _system_clock_dpll_config {
mbed_official 579:53297373a894 26 uint32_t frequency;
mbed_official 579:53297373a894 27 };
mbed_official 579:53297373a894 28
mbed_official 579:53297373a894 29
mbed_official 579:53297373a894 30 /**
mbed_official 579:53297373a894 31 * \internal
mbed_official 579:53297373a894 32 * \brief XOSC-specific data container.
mbed_official 579:53297373a894 33 */
mbed_official 579:53297373a894 34 struct _system_clock_xosc_config {
mbed_official 579:53297373a894 35 uint32_t frequency;
mbed_official 579:53297373a894 36 };
mbed_official 579:53297373a894 37
mbed_official 579:53297373a894 38 /**
mbed_official 579:53297373a894 39 * \internal
mbed_official 579:53297373a894 40 * \brief System clock module data container.
mbed_official 579:53297373a894 41 */
mbed_official 579:53297373a894 42 struct _system_clock_module {
mbed_official 579:53297373a894 43 volatile struct _system_clock_dfll_config dfll;
mbed_official 579:53297373a894 44
mbed_official 579:53297373a894 45 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 46 volatile struct _system_clock_dpll_config dpll;
mbed_official 579:53297373a894 47 #endif
mbed_official 579:53297373a894 48
mbed_official 579:53297373a894 49 volatile struct _system_clock_xosc_config xosc;
mbed_official 579:53297373a894 50 volatile struct _system_clock_xosc_config xosc32k;
mbed_official 579:53297373a894 51 };
mbed_official 579:53297373a894 52
mbed_official 579:53297373a894 53 /**
mbed_official 579:53297373a894 54 * \internal
mbed_official 579:53297373a894 55 * \brief Internal module instance to cache configuration values.
mbed_official 579:53297373a894 56 */
mbed_official 579:53297373a894 57 static struct _system_clock_module _system_clock_inst = {
mbed_official 579:53297373a894 58 .dfll = {
mbed_official 579:53297373a894 59 .control = 0,
mbed_official 579:53297373a894 60 .val = 0,
mbed_official 579:53297373a894 61 .mul = 0,
mbed_official 579:53297373a894 62 },
mbed_official 579:53297373a894 63
mbed_official 579:53297373a894 64 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 65 .dpll = {
mbed_official 579:53297373a894 66 .frequency = 0,
mbed_official 579:53297373a894 67 },
mbed_official 579:53297373a894 68 #endif
mbed_official 579:53297373a894 69 .xosc = {
mbed_official 579:53297373a894 70 .frequency = 0,
mbed_official 579:53297373a894 71 },
mbed_official 579:53297373a894 72 .xosc32k = {
mbed_official 579:53297373a894 73 .frequency = 0,
mbed_official 579:53297373a894 74 },
mbed_official 579:53297373a894 75 };
mbed_official 579:53297373a894 76
mbed_official 579:53297373a894 77 /**
mbed_official 579:53297373a894 78 * \internal
mbed_official 579:53297373a894 79 * \brief Wait for sync to the DFLL control registers.
mbed_official 579:53297373a894 80 */
mbed_official 579:53297373a894 81 static inline void _system_dfll_wait_for_sync(void)
mbed_official 579:53297373a894 82 {
mbed_official 579:53297373a894 83 while (!(SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_DFLLRDY)) {
mbed_official 579:53297373a894 84 /* Wait for DFLL sync */
mbed_official 579:53297373a894 85 }
mbed_official 579:53297373a894 86 }
mbed_official 579:53297373a894 87
mbed_official 579:53297373a894 88 /**
mbed_official 579:53297373a894 89 * \internal
mbed_official 579:53297373a894 90 * \brief Wait for sync to the OSC32K control registers.
mbed_official 579:53297373a894 91 */
mbed_official 579:53297373a894 92 static inline void _system_osc32k_wait_for_sync(void)
mbed_official 579:53297373a894 93 {
mbed_official 579:53297373a894 94 while (!(SYSCTRL->PCLKSR.reg & SYSCTRL_PCLKSR_OSC32KRDY)) {
mbed_official 579:53297373a894 95 /* Wait for OSC32K sync */
mbed_official 579:53297373a894 96 }
mbed_official 579:53297373a894 97 }
mbed_official 579:53297373a894 98
mbed_official 579:53297373a894 99 static inline void _system_clock_source_dfll_set_config_errata_9905(void)
mbed_official 579:53297373a894 100 {
mbed_official 579:53297373a894 101
mbed_official 579:53297373a894 102 /* Disable ONDEMAND mode while writing configurations */
mbed_official 579:53297373a894 103 SYSCTRL->DFLLCTRL.reg = _system_clock_inst.dfll.control & ~SYSCTRL_DFLLCTRL_ONDEMAND;
mbed_official 579:53297373a894 104 _system_dfll_wait_for_sync();
mbed_official 579:53297373a894 105
mbed_official 579:53297373a894 106 SYSCTRL->DFLLMUL.reg = _system_clock_inst.dfll.mul;
mbed_official 579:53297373a894 107 SYSCTRL->DFLLVAL.reg = _system_clock_inst.dfll.val;
mbed_official 579:53297373a894 108
mbed_official 579:53297373a894 109 /* Write full configuration to DFLL control register */
mbed_official 579:53297373a894 110 SYSCTRL->DFLLCTRL.reg = _system_clock_inst.dfll.control;
mbed_official 579:53297373a894 111 }
mbed_official 579:53297373a894 112
mbed_official 579:53297373a894 113 /**
mbed_official 579:53297373a894 114 * \brief Retrieve the frequency of a clock source.
mbed_official 579:53297373a894 115 *
mbed_official 579:53297373a894 116 * Determines the current operating frequency of a given clock source.
mbed_official 579:53297373a894 117 *
mbed_official 579:53297373a894 118 * \param[in] clock_source Clock source to get the frequency
mbed_official 579:53297373a894 119 *
mbed_official 579:53297373a894 120 * \returns Frequency of the given clock source, in Hz.
mbed_official 579:53297373a894 121 */
mbed_official 579:53297373a894 122 uint32_t system_clock_source_get_hz(
mbed_official 579:53297373a894 123 const enum system_clock_source clock_source)
mbed_official 579:53297373a894 124 {
mbed_official 579:53297373a894 125 switch (clock_source) {
mbed_official 579:53297373a894 126 case SYSTEM_CLOCK_SOURCE_XOSC:
mbed_official 579:53297373a894 127 return _system_clock_inst.xosc.frequency;
mbed_official 579:53297373a894 128
mbed_official 579:53297373a894 129 case SYSTEM_CLOCK_SOURCE_OSC8M:
mbed_official 579:53297373a894 130 return 8000000UL >> SYSCTRL->OSC8M.bit.PRESC;
mbed_official 579:53297373a894 131
mbed_official 579:53297373a894 132 case SYSTEM_CLOCK_SOURCE_OSC32K:
mbed_official 579:53297373a894 133 return 32768UL;
mbed_official 579:53297373a894 134
mbed_official 579:53297373a894 135 case SYSTEM_CLOCK_SOURCE_ULP32K:
mbed_official 579:53297373a894 136 return 32768UL;
mbed_official 579:53297373a894 137
mbed_official 579:53297373a894 138 case SYSTEM_CLOCK_SOURCE_XOSC32K:
mbed_official 579:53297373a894 139 return _system_clock_inst.xosc32k.frequency;
mbed_official 579:53297373a894 140
mbed_official 579:53297373a894 141 case SYSTEM_CLOCK_SOURCE_DFLL:
mbed_official 579:53297373a894 142
mbed_official 579:53297373a894 143 /* Check if the DFLL has been configured */
mbed_official 579:53297373a894 144 if (!(_system_clock_inst.dfll.control & SYSCTRL_DFLLCTRL_ENABLE))
mbed_official 579:53297373a894 145 return 0;
mbed_official 579:53297373a894 146
mbed_official 579:53297373a894 147 /* Make sure that the DFLL module is ready */
mbed_official 579:53297373a894 148 _system_dfll_wait_for_sync();
mbed_official 579:53297373a894 149
mbed_official 579:53297373a894 150 /* Check if operating in closed loop mode */
mbed_official 579:53297373a894 151 if (_system_clock_inst.dfll.control & SYSCTRL_DFLLCTRL_MODE) {
mbed_official 579:53297373a894 152 return system_gclk_chan_get_hz(SYSCTRL_GCLK_ID_DFLL48) *
mbed_official 579:53297373a894 153 (_system_clock_inst.dfll.mul & 0xffff);
mbed_official 579:53297373a894 154 }
mbed_official 579:53297373a894 155
mbed_official 579:53297373a894 156 return 48000000UL;
mbed_official 579:53297373a894 157
mbed_official 579:53297373a894 158 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 159 case SYSTEM_CLOCK_SOURCE_DPLL:
mbed_official 579:53297373a894 160 if (!(SYSCTRL->DPLLSTATUS.reg & SYSCTRL_DPLLSTATUS_ENABLE)) {
mbed_official 579:53297373a894 161 return 0;
mbed_official 579:53297373a894 162 }
mbed_official 579:53297373a894 163
mbed_official 579:53297373a894 164 return _system_clock_inst.dpll.frequency;
mbed_official 579:53297373a894 165 #endif
mbed_official 579:53297373a894 166
mbed_official 579:53297373a894 167 default:
mbed_official 579:53297373a894 168 return 0;
mbed_official 579:53297373a894 169 }
mbed_official 579:53297373a894 170 }
mbed_official 579:53297373a894 171
mbed_official 579:53297373a894 172 /**
mbed_official 579:53297373a894 173 * \brief Configure the internal OSC8M oscillator clock source.
mbed_official 579:53297373a894 174 *
mbed_official 579:53297373a894 175 * Configures the 8MHz (nominal) internal RC oscillator with the given
mbed_official 579:53297373a894 176 * configuration settings.
mbed_official 579:53297373a894 177 *
mbed_official 579:53297373a894 178 * \param[in] config OSC8M configuration structure containing the new config
mbed_official 579:53297373a894 179 */
mbed_official 579:53297373a894 180 void system_clock_source_osc8m_set_config(
mbed_official 579:53297373a894 181 struct system_clock_source_osc8m_config *const config)
mbed_official 579:53297373a894 182 {
mbed_official 579:53297373a894 183 SYSCTRL_OSC8M_Type temp = SYSCTRL->OSC8M;
mbed_official 579:53297373a894 184
mbed_official 579:53297373a894 185 /* Use temporary struct to reduce register access */
mbed_official 579:53297373a894 186 temp.bit.PRESC = config->prescaler;
mbed_official 579:53297373a894 187 temp.bit.ONDEMAND = config->on_demand;
mbed_official 579:53297373a894 188 temp.bit.RUNSTDBY = config->run_in_standby;
mbed_official 579:53297373a894 189
mbed_official 579:53297373a894 190 SYSCTRL->OSC8M = temp;
mbed_official 579:53297373a894 191 }
mbed_official 579:53297373a894 192
mbed_official 579:53297373a894 193 /**
mbed_official 579:53297373a894 194 * \brief Configure the internal OSC32K oscillator clock source.
mbed_official 579:53297373a894 195 *
mbed_official 579:53297373a894 196 * Configures the 32KHz (nominal) internal RC oscillator with the given
mbed_official 579:53297373a894 197 * configuration settings.
mbed_official 579:53297373a894 198 *
mbed_official 579:53297373a894 199 * \param[in] config OSC32K configuration structure containing the new config
mbed_official 579:53297373a894 200 */
mbed_official 579:53297373a894 201 void system_clock_source_osc32k_set_config(
mbed_official 579:53297373a894 202 struct system_clock_source_osc32k_config *const config)
mbed_official 579:53297373a894 203 {
mbed_official 579:53297373a894 204 SYSCTRL_OSC32K_Type temp = SYSCTRL->OSC32K;
mbed_official 579:53297373a894 205
mbed_official 579:53297373a894 206 /* Update settings via a temporary struct to reduce register access */
mbed_official 579:53297373a894 207 temp.bit.EN1K = config->enable_1khz_output;
mbed_official 579:53297373a894 208 temp.bit.EN32K = config->enable_32khz_output;
mbed_official 579:53297373a894 209 temp.bit.STARTUP = config->startup_time;
mbed_official 579:53297373a894 210 temp.bit.ONDEMAND = config->on_demand;
mbed_official 579:53297373a894 211 temp.bit.RUNSTDBY = config->run_in_standby;
mbed_official 579:53297373a894 212 temp.bit.WRTLOCK = config->write_once;
mbed_official 579:53297373a894 213
mbed_official 579:53297373a894 214 SYSCTRL->OSC32K = temp;
mbed_official 579:53297373a894 215 }
mbed_official 579:53297373a894 216
mbed_official 579:53297373a894 217 /**
mbed_official 579:53297373a894 218 * \brief Configure the external oscillator clock source.
mbed_official 579:53297373a894 219 *
mbed_official 579:53297373a894 220 * Configures the external oscillator clock source with the given configuration
mbed_official 579:53297373a894 221 * settings.
mbed_official 579:53297373a894 222 *
mbed_official 579:53297373a894 223 * \param[in] config External oscillator configuration structure containing
mbed_official 579:53297373a894 224 * the new config
mbed_official 579:53297373a894 225 */
mbed_official 579:53297373a894 226 void system_clock_source_xosc_set_config(
mbed_official 579:53297373a894 227 struct system_clock_source_xosc_config *const config)
mbed_official 579:53297373a894 228 {
mbed_official 579:53297373a894 229 SYSCTRL_XOSC_Type temp = SYSCTRL->XOSC;
mbed_official 579:53297373a894 230
mbed_official 579:53297373a894 231 temp.bit.STARTUP = config->startup_time;
mbed_official 579:53297373a894 232
mbed_official 579:53297373a894 233 if (config->external_clock == SYSTEM_CLOCK_EXTERNAL_CRYSTAL) {
mbed_official 579:53297373a894 234 temp.bit.XTALEN = 1;
mbed_official 579:53297373a894 235 } else {
mbed_official 579:53297373a894 236 temp.bit.XTALEN = 0;
mbed_official 579:53297373a894 237 }
mbed_official 579:53297373a894 238
mbed_official 579:53297373a894 239 temp.bit.AMPGC = config->auto_gain_control;
mbed_official 579:53297373a894 240
mbed_official 579:53297373a894 241 /* Set gain if automatic gain control is not selected */
mbed_official 579:53297373a894 242 if (!config->auto_gain_control) {
mbed_official 579:53297373a894 243 if (config->frequency <= 2000000) {
mbed_official 579:53297373a894 244 temp.bit.GAIN = 0;
mbed_official 579:53297373a894 245 } else if (config->frequency <= 4000000) {
mbed_official 579:53297373a894 246 temp.bit.GAIN = 1;
mbed_official 579:53297373a894 247 } else if (config->frequency <= 8000000) {
mbed_official 579:53297373a894 248 temp.bit.GAIN = 2;
mbed_official 579:53297373a894 249 } else if (config->frequency <= 16000000) {
mbed_official 579:53297373a894 250 temp.bit.GAIN = 3;
mbed_official 579:53297373a894 251 } else if (config->frequency <= 30000000) {
mbed_official 579:53297373a894 252 temp.bit.GAIN = 4;
mbed_official 579:53297373a894 253 }
mbed_official 579:53297373a894 254
mbed_official 579:53297373a894 255 }
mbed_official 579:53297373a894 256
mbed_official 579:53297373a894 257 temp.bit.ONDEMAND = config->on_demand;
mbed_official 579:53297373a894 258 temp.bit.RUNSTDBY = config->run_in_standby;
mbed_official 579:53297373a894 259
mbed_official 579:53297373a894 260 /* Store XOSC frequency for internal use */
mbed_official 579:53297373a894 261 _system_clock_inst.xosc.frequency = config->frequency;
mbed_official 579:53297373a894 262
mbed_official 579:53297373a894 263 SYSCTRL->XOSC = temp;
mbed_official 579:53297373a894 264 }
mbed_official 579:53297373a894 265
mbed_official 579:53297373a894 266 /**
mbed_official 579:53297373a894 267 * \brief Configure the XOSC32K external 32KHz oscillator clock source.
mbed_official 579:53297373a894 268 *
mbed_official 579:53297373a894 269 * Configures the external 32KHz oscillator clock source with the given
mbed_official 579:53297373a894 270 * configuration settings.
mbed_official 579:53297373a894 271 *
mbed_official 579:53297373a894 272 * \param[in] config XOSC32K configuration structure containing the new config
mbed_official 579:53297373a894 273 */
mbed_official 579:53297373a894 274 void system_clock_source_xosc32k_set_config(
mbed_official 579:53297373a894 275 struct system_clock_source_xosc32k_config *const config)
mbed_official 579:53297373a894 276 {
mbed_official 579:53297373a894 277 SYSCTRL_XOSC32K_Type temp = SYSCTRL->XOSC32K;
mbed_official 579:53297373a894 278
mbed_official 579:53297373a894 279 temp.bit.STARTUP = config->startup_time;
mbed_official 579:53297373a894 280
mbed_official 579:53297373a894 281 if (config->external_clock == SYSTEM_CLOCK_EXTERNAL_CRYSTAL) {
mbed_official 579:53297373a894 282 temp.bit.XTALEN = 1;
mbed_official 579:53297373a894 283 } else {
mbed_official 579:53297373a894 284 temp.bit.XTALEN = 0;
mbed_official 579:53297373a894 285 }
mbed_official 579:53297373a894 286
mbed_official 579:53297373a894 287 temp.bit.AAMPEN = config->auto_gain_control;
mbed_official 579:53297373a894 288 temp.bit.EN1K = config->enable_1khz_output;
mbed_official 579:53297373a894 289 temp.bit.EN32K = config->enable_32khz_output;
mbed_official 579:53297373a894 290
mbed_official 579:53297373a894 291 temp.bit.ONDEMAND = config->on_demand;
mbed_official 579:53297373a894 292 temp.bit.RUNSTDBY = config->run_in_standby;
mbed_official 579:53297373a894 293 temp.bit.WRTLOCK = config->write_once;
mbed_official 579:53297373a894 294
mbed_official 579:53297373a894 295 /* Cache the new frequency in case the user needs to check the current
mbed_official 579:53297373a894 296 * operating frequency later */
mbed_official 579:53297373a894 297 _system_clock_inst.xosc32k.frequency = config->frequency;
mbed_official 579:53297373a894 298
mbed_official 579:53297373a894 299 SYSCTRL->XOSC32K = temp;
mbed_official 579:53297373a894 300 }
mbed_official 579:53297373a894 301
mbed_official 579:53297373a894 302 /**
mbed_official 579:53297373a894 303 * \brief Configure the DFLL clock source.
mbed_official 579:53297373a894 304 *
mbed_official 579:53297373a894 305 * Configures the Digital Frequency Locked Loop clock source with the given
mbed_official 579:53297373a894 306 * configuration settings.
mbed_official 579:53297373a894 307 *
mbed_official 579:53297373a894 308 * \note The DFLL will be running when this function returns, as the DFLL module
mbed_official 579:53297373a894 309 * needs to be enabled in order to perform the module configuration.
mbed_official 579:53297373a894 310 *
mbed_official 579:53297373a894 311 * \param[in] config DFLL configuration structure containing the new config
mbed_official 579:53297373a894 312 */
mbed_official 579:53297373a894 313 void system_clock_source_dfll_set_config(
mbed_official 579:53297373a894 314 struct system_clock_source_dfll_config *const config)
mbed_official 579:53297373a894 315 {
mbed_official 579:53297373a894 316 _system_clock_inst.dfll.val =
mbed_official 579:53297373a894 317 SYSCTRL_DFLLVAL_COARSE(config->coarse_value) |
mbed_official 579:53297373a894 318 SYSCTRL_DFLLVAL_FINE(config->fine_value);
mbed_official 579:53297373a894 319
mbed_official 579:53297373a894 320 _system_clock_inst.dfll.control =
mbed_official 579:53297373a894 321 (uint32_t)config->wakeup_lock |
mbed_official 579:53297373a894 322 (uint32_t)config->stable_tracking |
mbed_official 579:53297373a894 323 (uint32_t)config->quick_lock |
mbed_official 579:53297373a894 324 (uint32_t)config->chill_cycle |
mbed_official 579:53297373a894 325 ((uint32_t)config->on_demand << SYSCTRL_DFLLCTRL_ONDEMAND_Pos);
mbed_official 579:53297373a894 326
mbed_official 579:53297373a894 327 if (config->loop_mode == SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED) {
mbed_official 579:53297373a894 328
mbed_official 579:53297373a894 329 _system_clock_inst.dfll.mul =
mbed_official 579:53297373a894 330 SYSCTRL_DFLLMUL_CSTEP(config->coarse_max_step) |
mbed_official 579:53297373a894 331 SYSCTRL_DFLLMUL_FSTEP(config->fine_max_step) |
mbed_official 579:53297373a894 332 SYSCTRL_DFLLMUL_MUL(config->multiply_factor);
mbed_official 579:53297373a894 333
mbed_official 579:53297373a894 334 /* Enable the closed loop mode */
mbed_official 579:53297373a894 335 _system_clock_inst.dfll.control |= config->loop_mode;
mbed_official 579:53297373a894 336 }
mbed_official 579:53297373a894 337 if (config->loop_mode == SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY) {
mbed_official 579:53297373a894 338
mbed_official 579:53297373a894 339 _system_clock_inst.dfll.mul =
mbed_official 579:53297373a894 340 SYSCTRL_DFLLMUL_MUL(config->multiply_factor);
mbed_official 579:53297373a894 341
mbed_official 579:53297373a894 342 /* Enable the USB recovery mode */
mbed_official 579:53297373a894 343 _system_clock_inst.dfll.control |= config->loop_mode |
mbed_official 579:53297373a894 344 SYSCTRL_DFLLCTRL_BPLCKC;
mbed_official 579:53297373a894 345 }
mbed_official 579:53297373a894 346 }
mbed_official 579:53297373a894 347
mbed_official 579:53297373a894 348 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 349 /**
mbed_official 579:53297373a894 350 * \brief Configure the DPLL clock source.
mbed_official 579:53297373a894 351 *
mbed_official 579:53297373a894 352 * Configures the Digital Phase-Locked Loop clock source with the given
mbed_official 579:53297373a894 353 * configuration settings.
mbed_official 579:53297373a894 354 *
mbed_official 579:53297373a894 355 * \note The DPLL will be running when this function returns, as the DPLL module
mbed_official 579:53297373a894 356 * needs to be enabled in order to perform the module configuration.
mbed_official 579:53297373a894 357 *
mbed_official 579:53297373a894 358 * \param[in] config DPLL configuration structure containing the new config
mbed_official 579:53297373a894 359 */
mbed_official 579:53297373a894 360 void system_clock_source_dpll_set_config(
mbed_official 579:53297373a894 361 struct system_clock_source_dpll_config *const config)
mbed_official 579:53297373a894 362 {
mbed_official 579:53297373a894 363
mbed_official 579:53297373a894 364 uint32_t tmpldr;
mbed_official 579:53297373a894 365 uint8_t tmpldrfrac;
mbed_official 579:53297373a894 366 uint32_t refclk;
mbed_official 579:53297373a894 367
mbed_official 579:53297373a894 368 refclk = config->reference_frequency;
mbed_official 579:53297373a894 369
mbed_official 579:53297373a894 370 /* Only reference clock REF1 can be divided */
mbed_official 579:53297373a894 371 if (config->reference_clock == SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_REF1) {
mbed_official 579:53297373a894 372 refclk = refclk / config->reference_divider;
mbed_official 579:53297373a894 373 }
mbed_official 579:53297373a894 374
mbed_official 579:53297373a894 375 /* Calculate LDRFRAC and LDR */
mbed_official 579:53297373a894 376 tmpldr = (config->output_frequency << 4) / refclk;
mbed_official 579:53297373a894 377 tmpldrfrac = tmpldr & 0x0f;
mbed_official 579:53297373a894 378 tmpldr = (tmpldr >> 4) - 1;
mbed_official 579:53297373a894 379
mbed_official 579:53297373a894 380 SYSCTRL->DPLLCTRLA.reg =
mbed_official 579:53297373a894 381 ((uint32_t)config->on_demand << SYSCTRL_DPLLCTRLA_ONDEMAND_Pos) |
mbed_official 579:53297373a894 382 ((uint32_t)config->run_in_standby << SYSCTRL_DPLLCTRLA_RUNSTDBY_Pos);
mbed_official 579:53297373a894 383
mbed_official 579:53297373a894 384 SYSCTRL->DPLLRATIO.reg =
mbed_official 579:53297373a894 385 SYSCTRL_DPLLRATIO_LDRFRAC(tmpldrfrac) |
mbed_official 579:53297373a894 386 SYSCTRL_DPLLRATIO_LDR(tmpldr);
mbed_official 579:53297373a894 387
mbed_official 579:53297373a894 388 SYSCTRL->DPLLCTRLB.reg =
mbed_official 579:53297373a894 389 SYSCTRL_DPLLCTRLB_DIV(config->reference_divider) |
mbed_official 579:53297373a894 390 ((uint32_t)config->lock_bypass << SYSCTRL_DPLLCTRLB_LBYPASS_Pos) |
mbed_official 579:53297373a894 391 SYSCTRL_DPLLCTRLB_LTIME(config->lock_time) |
mbed_official 579:53297373a894 392 SYSCTRL_DPLLCTRLB_REFCLK(config->reference_clock) |
mbed_official 579:53297373a894 393 ((uint32_t)config->wake_up_fast << SYSCTRL_DPLLCTRLB_WUF_Pos) |
mbed_official 579:53297373a894 394 ((uint32_t)config->low_power_enable << SYSCTRL_DPLLCTRLB_LPEN_Pos) |
mbed_official 579:53297373a894 395 SYSCTRL_DPLLCTRLB_FILTER(config->filter);
mbed_official 579:53297373a894 396
mbed_official 579:53297373a894 397 /*
mbed_official 579:53297373a894 398 * Fck = Fckrx * (LDR + 1 + LDRFRAC / 16)
mbed_official 579:53297373a894 399 */
mbed_official 579:53297373a894 400 _system_clock_inst.dpll.frequency =
mbed_official 579:53297373a894 401 (config->reference_frequency *
mbed_official 579:53297373a894 402 (((tmpldr + 1) << 4) + tmpldrfrac)
mbed_official 579:53297373a894 403 ) >> 4;
mbed_official 579:53297373a894 404 }
mbed_official 579:53297373a894 405 #endif
mbed_official 579:53297373a894 406
mbed_official 579:53297373a894 407 /**
mbed_official 579:53297373a894 408 * \brief Writes the calibration values for a given oscillator clock source.
mbed_official 579:53297373a894 409 *
mbed_official 579:53297373a894 410 * Writes an oscillator calibration value to the given oscillator control
mbed_official 579:53297373a894 411 * registers. The acceptable ranges are:
mbed_official 579:53297373a894 412 *
mbed_official 579:53297373a894 413 * For OSC32K:
mbed_official 579:53297373a894 414 * - 7 bits (max value 128)
mbed_official 579:53297373a894 415 * For OSC8MHZ:
mbed_official 579:53297373a894 416 * - 8 bits (Max value 255)
mbed_official 579:53297373a894 417 * For OSCULP:
mbed_official 579:53297373a894 418 * - 5 bits (Max value 32)
mbed_official 579:53297373a894 419 *
mbed_official 579:53297373a894 420 * \note The frequency range parameter applies only when configuring the 8MHz
mbed_official 579:53297373a894 421 * oscillator and will be ignored for the other oscillators.
mbed_official 579:53297373a894 422 *
mbed_official 579:53297373a894 423 * \param[in] clock_source Clock source to calibrate
mbed_official 579:53297373a894 424 * \param[in] calibration_value Calibration value to write
mbed_official 579:53297373a894 425 * \param[in] freq_range Frequency range (8MHz oscillator only)
mbed_official 579:53297373a894 426 *
mbed_official 579:53297373a894 427 * \retval STATUS_OK The calibration value was written
mbed_official 579:53297373a894 428 * successfully.
mbed_official 579:53297373a894 429 * \retval STATUS_ERR_INVALID_ARG The setting is not valid for selected clock
mbed_official 579:53297373a894 430 * source.
mbed_official 579:53297373a894 431 */
mbed_official 579:53297373a894 432 enum status_code system_clock_source_write_calibration(
mbed_official 579:53297373a894 433 const enum system_clock_source clock_source,
mbed_official 579:53297373a894 434 const uint16_t calibration_value,
mbed_official 579:53297373a894 435 const uint8_t freq_range)
mbed_official 579:53297373a894 436 {
mbed_official 579:53297373a894 437 switch (clock_source) {
mbed_official 579:53297373a894 438 case SYSTEM_CLOCK_SOURCE_OSC8M:
mbed_official 579:53297373a894 439
mbed_official 579:53297373a894 440 if (calibration_value > 0xfff || freq_range > 4) {
mbed_official 579:53297373a894 441 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 442 }
mbed_official 579:53297373a894 443
mbed_official 579:53297373a894 444 SYSCTRL->OSC8M.bit.CALIB = calibration_value;
mbed_official 579:53297373a894 445 SYSCTRL->OSC8M.bit.FRANGE = freq_range;
mbed_official 579:53297373a894 446 break;
mbed_official 579:53297373a894 447
mbed_official 579:53297373a894 448 case SYSTEM_CLOCK_SOURCE_OSC32K:
mbed_official 579:53297373a894 449
mbed_official 579:53297373a894 450 if (calibration_value > 128) {
mbed_official 579:53297373a894 451 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 452 }
mbed_official 579:53297373a894 453
mbed_official 579:53297373a894 454 _system_osc32k_wait_for_sync();
mbed_official 579:53297373a894 455 SYSCTRL->OSC32K.bit.CALIB = calibration_value;
mbed_official 579:53297373a894 456 break;
mbed_official 579:53297373a894 457
mbed_official 579:53297373a894 458 case SYSTEM_CLOCK_SOURCE_ULP32K:
mbed_official 579:53297373a894 459
mbed_official 579:53297373a894 460 if (calibration_value > 32) {
mbed_official 579:53297373a894 461 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 462 }
mbed_official 579:53297373a894 463
mbed_official 579:53297373a894 464 SYSCTRL->OSCULP32K.bit.CALIB = calibration_value;
mbed_official 579:53297373a894 465 break;
mbed_official 579:53297373a894 466
mbed_official 579:53297373a894 467 default:
mbed_official 579:53297373a894 468 Assert(false);
mbed_official 579:53297373a894 469 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 470 break;
mbed_official 579:53297373a894 471 }
mbed_official 579:53297373a894 472
mbed_official 579:53297373a894 473 return STATUS_OK;
mbed_official 579:53297373a894 474 }
mbed_official 579:53297373a894 475
mbed_official 579:53297373a894 476 /**
mbed_official 579:53297373a894 477 * \brief Enables a clock source.
mbed_official 579:53297373a894 478 *
mbed_official 579:53297373a894 479 * Enables a clock source which has been previously configured.
mbed_official 579:53297373a894 480 *
mbed_official 579:53297373a894 481 * \param[in] clock_source Clock source to enable
mbed_official 579:53297373a894 482 *
mbed_official 579:53297373a894 483 * \retval STATUS_OK Clock source was enabled successfully and
mbed_official 579:53297373a894 484 * is ready
mbed_official 579:53297373a894 485 * \retval STATUS_ERR_INVALID_ARG The clock source is not available on this
mbed_official 579:53297373a894 486 * device
mbed_official 579:53297373a894 487 */
mbed_official 579:53297373a894 488 enum status_code system_clock_source_enable(
mbed_official 579:53297373a894 489 const enum system_clock_source clock_source)
mbed_official 579:53297373a894 490 {
mbed_official 579:53297373a894 491 switch (clock_source) {
mbed_official 579:53297373a894 492 case SYSTEM_CLOCK_SOURCE_OSC8M:
mbed_official 579:53297373a894 493 SYSCTRL->OSC8M.reg |= SYSCTRL_OSC8M_ENABLE;
mbed_official 579:53297373a894 494 return STATUS_OK;
mbed_official 579:53297373a894 495
mbed_official 579:53297373a894 496 case SYSTEM_CLOCK_SOURCE_OSC32K:
mbed_official 579:53297373a894 497 SYSCTRL->OSC32K.reg |= SYSCTRL_OSC32K_ENABLE;
mbed_official 579:53297373a894 498 break;
mbed_official 579:53297373a894 499
mbed_official 579:53297373a894 500 case SYSTEM_CLOCK_SOURCE_XOSC:
mbed_official 579:53297373a894 501 SYSCTRL->XOSC.reg |= SYSCTRL_XOSC_ENABLE;
mbed_official 579:53297373a894 502 break;
mbed_official 579:53297373a894 503
mbed_official 579:53297373a894 504 case SYSTEM_CLOCK_SOURCE_XOSC32K:
mbed_official 579:53297373a894 505 SYSCTRL->XOSC32K.reg |= SYSCTRL_XOSC32K_ENABLE;
mbed_official 579:53297373a894 506 break;
mbed_official 579:53297373a894 507
mbed_official 579:53297373a894 508 case SYSTEM_CLOCK_SOURCE_DFLL:
mbed_official 579:53297373a894 509 _system_clock_inst.dfll.control |= SYSCTRL_DFLLCTRL_ENABLE;
mbed_official 579:53297373a894 510 _system_clock_source_dfll_set_config_errata_9905();
mbed_official 579:53297373a894 511 break;
mbed_official 579:53297373a894 512
mbed_official 579:53297373a894 513 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 514 case SYSTEM_CLOCK_SOURCE_DPLL:
mbed_official 579:53297373a894 515 SYSCTRL->DPLLCTRLA.reg |= SYSCTRL_DPLLCTRLA_ENABLE;
mbed_official 579:53297373a894 516 break;
mbed_official 579:53297373a894 517 #endif
mbed_official 579:53297373a894 518
mbed_official 579:53297373a894 519 case SYSTEM_CLOCK_SOURCE_ULP32K:
mbed_official 579:53297373a894 520 /* Always enabled */
mbed_official 579:53297373a894 521 return STATUS_OK;
mbed_official 579:53297373a894 522
mbed_official 579:53297373a894 523 default:
mbed_official 579:53297373a894 524 Assert(false);
mbed_official 579:53297373a894 525 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 526 }
mbed_official 579:53297373a894 527
mbed_official 579:53297373a894 528 return STATUS_OK;
mbed_official 579:53297373a894 529 }
mbed_official 579:53297373a894 530
mbed_official 579:53297373a894 531 /**
mbed_official 579:53297373a894 532 * \brief Disables a clock source.
mbed_official 579:53297373a894 533 *
mbed_official 579:53297373a894 534 * Disables a clock source that was previously enabled.
mbed_official 579:53297373a894 535 *
mbed_official 579:53297373a894 536 * \param[in] clock_source Clock source to disable
mbed_official 579:53297373a894 537 *
mbed_official 579:53297373a894 538 * \retval STATUS_OK Clock source was disabled successfully
mbed_official 579:53297373a894 539 * \retval STATUS_ERR_INVALID_ARG An invalid or unavailable clock source was
mbed_official 579:53297373a894 540 * given
mbed_official 579:53297373a894 541 */
mbed_official 579:53297373a894 542 enum status_code system_clock_source_disable(
mbed_official 579:53297373a894 543 const enum system_clock_source clock_source)
mbed_official 579:53297373a894 544 {
mbed_official 579:53297373a894 545 switch (clock_source) {
mbed_official 579:53297373a894 546 case SYSTEM_CLOCK_SOURCE_OSC8M:
mbed_official 579:53297373a894 547 SYSCTRL->OSC8M.reg &= ~SYSCTRL_OSC8M_ENABLE;
mbed_official 579:53297373a894 548 break;
mbed_official 579:53297373a894 549
mbed_official 579:53297373a894 550 case SYSTEM_CLOCK_SOURCE_OSC32K:
mbed_official 579:53297373a894 551 SYSCTRL->OSC32K.reg &= ~SYSCTRL_OSC32K_ENABLE;
mbed_official 579:53297373a894 552 break;
mbed_official 579:53297373a894 553
mbed_official 579:53297373a894 554 case SYSTEM_CLOCK_SOURCE_XOSC:
mbed_official 579:53297373a894 555 SYSCTRL->XOSC.reg &= ~SYSCTRL_XOSC_ENABLE;
mbed_official 579:53297373a894 556 break;
mbed_official 579:53297373a894 557
mbed_official 579:53297373a894 558 case SYSTEM_CLOCK_SOURCE_XOSC32K:
mbed_official 579:53297373a894 559 SYSCTRL->XOSC32K.reg &= ~SYSCTRL_XOSC32K_ENABLE;
mbed_official 579:53297373a894 560 break;
mbed_official 579:53297373a894 561
mbed_official 579:53297373a894 562 case SYSTEM_CLOCK_SOURCE_DFLL:
mbed_official 579:53297373a894 563 _system_clock_inst.dfll.control &= ~SYSCTRL_DFLLCTRL_ENABLE;
mbed_official 579:53297373a894 564 SYSCTRL->DFLLCTRL.reg = _system_clock_inst.dfll.control;
mbed_official 579:53297373a894 565 break;
mbed_official 579:53297373a894 566
mbed_official 579:53297373a894 567 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 568 case SYSTEM_CLOCK_SOURCE_DPLL:
mbed_official 579:53297373a894 569 SYSCTRL->DPLLCTRLA.reg &= ~SYSCTRL_DPLLCTRLA_ENABLE;
mbed_official 579:53297373a894 570 break;
mbed_official 579:53297373a894 571 #endif
mbed_official 579:53297373a894 572
mbed_official 579:53297373a894 573 case SYSTEM_CLOCK_SOURCE_ULP32K:
mbed_official 579:53297373a894 574 /* Not possible to disable */
mbed_official 579:53297373a894 575
mbed_official 579:53297373a894 576 default:
mbed_official 579:53297373a894 577 Assert(false);
mbed_official 579:53297373a894 578 return STATUS_ERR_INVALID_ARG;
mbed_official 579:53297373a894 579
mbed_official 579:53297373a894 580 }
mbed_official 579:53297373a894 581
mbed_official 579:53297373a894 582 return STATUS_OK;
mbed_official 579:53297373a894 583 }
mbed_official 579:53297373a894 584
mbed_official 579:53297373a894 585 /**
mbed_official 579:53297373a894 586 * \brief Checks if a clock source is ready.
mbed_official 579:53297373a894 587 *
mbed_official 579:53297373a894 588 * Checks if a given clock source is ready to be used.
mbed_official 579:53297373a894 589 *
mbed_official 579:53297373a894 590 * \param[in] clock_source Clock source to check if ready
mbed_official 579:53297373a894 591 *
mbed_official 579:53297373a894 592 * \returns Ready state of the given clock source.
mbed_official 579:53297373a894 593 *
mbed_official 579:53297373a894 594 * \retval true Clock source is enabled and ready
mbed_official 579:53297373a894 595 * \retval false Clock source is disabled or not yet ready
mbed_official 579:53297373a894 596 */
mbed_official 579:53297373a894 597 bool system_clock_source_is_ready(
mbed_official 579:53297373a894 598 const enum system_clock_source clock_source)
mbed_official 579:53297373a894 599 {
mbed_official 579:53297373a894 600 uint32_t mask = 0;
mbed_official 579:53297373a894 601
mbed_official 579:53297373a894 602 switch (clock_source) {
mbed_official 579:53297373a894 603 case SYSTEM_CLOCK_SOURCE_OSC8M:
mbed_official 579:53297373a894 604 mask = SYSCTRL_PCLKSR_OSC8MRDY;
mbed_official 579:53297373a894 605 break;
mbed_official 579:53297373a894 606
mbed_official 579:53297373a894 607 case SYSTEM_CLOCK_SOURCE_OSC32K:
mbed_official 579:53297373a894 608 mask = SYSCTRL_PCLKSR_OSC32KRDY;
mbed_official 579:53297373a894 609 break;
mbed_official 579:53297373a894 610
mbed_official 579:53297373a894 611 case SYSTEM_CLOCK_SOURCE_XOSC:
mbed_official 579:53297373a894 612 mask = SYSCTRL_PCLKSR_XOSCRDY;
mbed_official 579:53297373a894 613 break;
mbed_official 579:53297373a894 614
mbed_official 579:53297373a894 615 case SYSTEM_CLOCK_SOURCE_XOSC32K:
mbed_official 579:53297373a894 616 mask = SYSCTRL_PCLKSR_XOSC32KRDY;
mbed_official 579:53297373a894 617 break;
mbed_official 579:53297373a894 618
mbed_official 579:53297373a894 619 case SYSTEM_CLOCK_SOURCE_DFLL:
mbed_official 579:53297373a894 620 if (CONF_CLOCK_DFLL_LOOP_MODE == SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED) {
mbed_official 579:53297373a894 621 mask = (SYSCTRL_PCLKSR_DFLLRDY |
mbed_official 579:53297373a894 622 SYSCTRL_PCLKSR_DFLLLCKF | SYSCTRL_PCLKSR_DFLLLCKC);
mbed_official 579:53297373a894 623 } else {
mbed_official 579:53297373a894 624 mask = SYSCTRL_PCLKSR_DFLLRDY;
mbed_official 579:53297373a894 625 }
mbed_official 579:53297373a894 626 break;
mbed_official 579:53297373a894 627
mbed_official 579:53297373a894 628 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 629 case SYSTEM_CLOCK_SOURCE_DPLL:
mbed_official 579:53297373a894 630 return ((SYSCTRL->DPLLSTATUS.reg &
mbed_official 579:53297373a894 631 (SYSCTRL_DPLLSTATUS_CLKRDY | SYSCTRL_DPLLSTATUS_LOCK)) ==
mbed_official 579:53297373a894 632 (SYSCTRL_DPLLSTATUS_CLKRDY | SYSCTRL_DPLLSTATUS_LOCK));
mbed_official 579:53297373a894 633 #endif
mbed_official 579:53297373a894 634
mbed_official 579:53297373a894 635 case SYSTEM_CLOCK_SOURCE_ULP32K:
mbed_official 579:53297373a894 636 /* Not possible to disable */
mbed_official 579:53297373a894 637 return true;
mbed_official 579:53297373a894 638
mbed_official 579:53297373a894 639 default:
mbed_official 579:53297373a894 640 return false;
mbed_official 579:53297373a894 641 }
mbed_official 579:53297373a894 642
mbed_official 579:53297373a894 643 return ((SYSCTRL->PCLKSR.reg & mask) == mask);
mbed_official 579:53297373a894 644 }
mbed_official 579:53297373a894 645
mbed_official 579:53297373a894 646 /* Include some checks for conf_clocks.h validation */
mbed_official 579:53297373a894 647 #include "clock_config_check.h"
mbed_official 579:53297373a894 648
mbed_official 579:53297373a894 649 #if !defined(__DOXYGEN__)
mbed_official 579:53297373a894 650 /** \internal
mbed_official 579:53297373a894 651 *
mbed_official 579:53297373a894 652 * Configures a Generic Clock Generator with the configuration from \c conf_clocks.h.
mbed_official 579:53297373a894 653 */
mbed_official 579:53297373a894 654 # define _CONF_CLOCK_GCLK_CONFIG(n, unused) \
mbed_official 579:53297373a894 655 if (CONF_CLOCK_GCLK_##n##_ENABLE == true) { \
mbed_official 579:53297373a894 656 struct system_gclk_gen_config gclk_conf; \
mbed_official 579:53297373a894 657 system_gclk_gen_get_config_defaults(&gclk_conf); \
mbed_official 579:53297373a894 658 gclk_conf.source_clock = CONF_CLOCK_GCLK_##n##_CLOCK_SOURCE; \
mbed_official 579:53297373a894 659 gclk_conf.division_factor = CONF_CLOCK_GCLK_##n##_PRESCALER; \
mbed_official 579:53297373a894 660 gclk_conf.run_in_standby = CONF_CLOCK_GCLK_##n##_RUN_IN_STANDBY; \
mbed_official 579:53297373a894 661 gclk_conf.output_enable = CONF_CLOCK_GCLK_##n##_OUTPUT_ENABLE; \
mbed_official 579:53297373a894 662 system_gclk_gen_set_config(GCLK_GENERATOR_##n, &gclk_conf); \
mbed_official 579:53297373a894 663 system_gclk_gen_enable(GCLK_GENERATOR_##n); \
mbed_official 579:53297373a894 664 }
mbed_official 579:53297373a894 665
mbed_official 579:53297373a894 666 /** \internal
mbed_official 579:53297373a894 667 *
mbed_official 579:53297373a894 668 * Configures a Generic Clock Generator with the configuration from \c conf_clocks.h,
mbed_official 579:53297373a894 669 * provided that it is not the main Generic Clock Generator channel.
mbed_official 579:53297373a894 670 */
mbed_official 579:53297373a894 671 # define _CONF_CLOCK_GCLK_CONFIG_NONMAIN(n, unused) \
mbed_official 579:53297373a894 672 if (n > 0) { _CONF_CLOCK_GCLK_CONFIG(n, unused); }
mbed_official 579:53297373a894 673 #endif
mbed_official 579:53297373a894 674
mbed_official 579:53297373a894 675 /** \internal
mbed_official 579:53297373a894 676 *
mbed_official 579:53297373a894 677 * Switch all peripheral clock to a not enabled general clock
mbed_official 579:53297373a894 678 * to save power.
mbed_official 579:53297373a894 679 */
mbed_official 579:53297373a894 680 static void _switch_peripheral_gclk(void)
mbed_official 579:53297373a894 681 {
mbed_official 579:53297373a894 682 uint32_t gclk_id;
mbed_official 579:53297373a894 683 struct system_gclk_chan_config gclk_conf;
mbed_official 579:53297373a894 684
mbed_official 579:53297373a894 685 #if CONF_CLOCK_GCLK_1_ENABLE == false
mbed_official 579:53297373a894 686 gclk_conf.source_generator = GCLK_GENERATOR_1;
mbed_official 579:53297373a894 687 #elif CONF_CLOCK_GCLK_2_ENABLE == false
mbed_official 579:53297373a894 688 gclk_conf.source_generator = GCLK_GENERATOR_2;
mbed_official 579:53297373a894 689 #elif CONF_CLOCK_GCLK_3_ENABLE == false
mbed_official 579:53297373a894 690 gclk_conf.source_generator = GCLK_GENERATOR_3;
mbed_official 579:53297373a894 691 #elif CONF_CLOCK_GCLK_4_ENABLE == false
mbed_official 579:53297373a894 692 gclk_conf.source_generator = GCLK_GENERATOR_4;
mbed_official 579:53297373a894 693 #elif CONF_CLOCK_GCLK_5_ENABLE == false
mbed_official 579:53297373a894 694 gclk_conf.source_generator = GCLK_GENERATOR_5;
mbed_official 579:53297373a894 695 #elif CONF_CLOCK_GCLK_6_ENABLE == false
mbed_official 579:53297373a894 696 gclk_conf.source_generator = GCLK_GENERATOR_6;
mbed_official 579:53297373a894 697 #elif CONF_CLOCK_GCLK_7_ENABLE == false
mbed_official 579:53297373a894 698 gclk_conf.source_generator = GCLK_GENERATOR_7;
mbed_official 579:53297373a894 699 #else
mbed_official 579:53297373a894 700 gclk_conf.source_generator = GCLK_GENERATOR_7;
mbed_official 579:53297373a894 701 #endif
mbed_official 579:53297373a894 702
mbed_official 579:53297373a894 703 for (gclk_id = 0; gclk_id < GCLK_NUM; gclk_id++) {
mbed_official 579:53297373a894 704 system_gclk_chan_set_config(gclk_id, &gclk_conf);
mbed_official 579:53297373a894 705 }
mbed_official 579:53297373a894 706 }
mbed_official 579:53297373a894 707
mbed_official 579:53297373a894 708 /**
mbed_official 579:53297373a894 709 * \brief Initialize clock system based on the configuration in conf_clocks.h.
mbed_official 579:53297373a894 710 *
mbed_official 579:53297373a894 711 * This function will apply the settings in conf_clocks.h when run from the user
mbed_official 579:53297373a894 712 * application. All clock sources and GCLK generators are running when this function
mbed_official 579:53297373a894 713 * returns.
mbed_official 579:53297373a894 714 *
mbed_official 579:53297373a894 715 * \note OSC8M is always enabled and if user selects other clocks for GCLK generators,
mbed_official 579:53297373a894 716 * the OSC8M default enable can be disabled after system_clock_init. Make sure the
mbed_official 579:53297373a894 717 * clock switch successfully before disabling OSC8M.
mbed_official 579:53297373a894 718 */
mbed_official 579:53297373a894 719 void system_clock_init(void)
mbed_official 579:53297373a894 720 {
mbed_official 579:53297373a894 721 /* Various bits in the INTFLAG register can be set to one at startup.
mbed_official 579:53297373a894 722 This will ensure that these bits are cleared */
mbed_official 579:53297373a894 723 SYSCTRL->INTFLAG.reg = SYSCTRL_INTFLAG_BOD33RDY | SYSCTRL_INTFLAG_BOD33DET |
mbed_official 579:53297373a894 724 SYSCTRL_INTFLAG_DFLLRDY;
mbed_official 579:53297373a894 725
mbed_official 579:53297373a894 726 system_flash_set_waitstates(CONF_CLOCK_FLASH_WAIT_STATES);
mbed_official 579:53297373a894 727
mbed_official 579:53297373a894 728 /* Switch all peripheral clock to a not enabled general clock to save power. */
mbed_official 579:53297373a894 729 _switch_peripheral_gclk();
mbed_official 579:53297373a894 730
mbed_official 579:53297373a894 731 /* XOSC */
mbed_official 579:53297373a894 732 #if CONF_CLOCK_XOSC_ENABLE == true
mbed_official 579:53297373a894 733 struct system_clock_source_xosc_config xosc_conf;
mbed_official 579:53297373a894 734 system_clock_source_xosc_get_config_defaults(&xosc_conf);
mbed_official 579:53297373a894 735
mbed_official 579:53297373a894 736 xosc_conf.external_clock = CONF_CLOCK_XOSC_EXTERNAL_CRYSTAL;
mbed_official 579:53297373a894 737 xosc_conf.startup_time = CONF_CLOCK_XOSC_STARTUP_TIME;
mbed_official 579:53297373a894 738 xosc_conf.auto_gain_control = CONF_CLOCK_XOSC_AUTO_GAIN_CONTROL;
mbed_official 579:53297373a894 739 xosc_conf.frequency = CONF_CLOCK_XOSC_EXTERNAL_FREQUENCY;
mbed_official 579:53297373a894 740 xosc_conf.on_demand = CONF_CLOCK_XOSC_ON_DEMAND;
mbed_official 579:53297373a894 741 xosc_conf.run_in_standby = CONF_CLOCK_XOSC_RUN_IN_STANDBY;
mbed_official 579:53297373a894 742
mbed_official 579:53297373a894 743 system_clock_source_xosc_set_config(&xosc_conf);
mbed_official 579:53297373a894 744 system_clock_source_enable(SYSTEM_CLOCK_SOURCE_XOSC);
mbed_official 579:53297373a894 745 #endif
mbed_official 579:53297373a894 746
mbed_official 579:53297373a894 747
mbed_official 579:53297373a894 748 /* XOSC32K */
mbed_official 579:53297373a894 749 #if CONF_CLOCK_XOSC32K_ENABLE == true
mbed_official 579:53297373a894 750 struct system_clock_source_xosc32k_config xosc32k_conf;
mbed_official 579:53297373a894 751 system_clock_source_xosc32k_get_config_defaults(&xosc32k_conf);
mbed_official 579:53297373a894 752
mbed_official 579:53297373a894 753 xosc32k_conf.frequency = 32768UL;
mbed_official 579:53297373a894 754 xosc32k_conf.external_clock = CONF_CLOCK_XOSC32K_EXTERNAL_CRYSTAL;
mbed_official 579:53297373a894 755 xosc32k_conf.startup_time = CONF_CLOCK_XOSC32K_STARTUP_TIME;
mbed_official 579:53297373a894 756 xosc32k_conf.auto_gain_control = CONF_CLOCK_XOSC32K_AUTO_AMPLITUDE_CONTROL;
mbed_official 579:53297373a894 757 xosc32k_conf.enable_1khz_output = CONF_CLOCK_XOSC32K_ENABLE_1KHZ_OUPUT;
mbed_official 579:53297373a894 758 xosc32k_conf.enable_32khz_output = CONF_CLOCK_XOSC32K_ENABLE_32KHZ_OUTPUT;
mbed_official 579:53297373a894 759 xosc32k_conf.on_demand = false;
mbed_official 579:53297373a894 760 xosc32k_conf.run_in_standby = CONF_CLOCK_XOSC32K_RUN_IN_STANDBY;
mbed_official 579:53297373a894 761
mbed_official 579:53297373a894 762 system_clock_source_xosc32k_set_config(&xosc32k_conf);
mbed_official 579:53297373a894 763 system_clock_source_enable(SYSTEM_CLOCK_SOURCE_XOSC32K);
mbed_official 579:53297373a894 764 while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_XOSC32K));
mbed_official 579:53297373a894 765 if (CONF_CLOCK_XOSC32K_ON_DEMAND) {
mbed_official 579:53297373a894 766 SYSCTRL->XOSC32K.bit.ONDEMAND = 1;
mbed_official 579:53297373a894 767 }
mbed_official 579:53297373a894 768 #endif
mbed_official 579:53297373a894 769
mbed_official 579:53297373a894 770
mbed_official 579:53297373a894 771 /* OSCK32K */
mbed_official 579:53297373a894 772 #if CONF_CLOCK_OSC32K_ENABLE == true
mbed_official 579:53297373a894 773 SYSCTRL->OSC32K.bit.CALIB =
mbed_official 579:53297373a894 774 (*(uint32_t *)SYSCTRL_FUSES_OSC32K_ADDR >> SYSCTRL_FUSES_OSC32K_Pos);
mbed_official 579:53297373a894 775
mbed_official 579:53297373a894 776 struct system_clock_source_osc32k_config osc32k_conf;
mbed_official 579:53297373a894 777 system_clock_source_osc32k_get_config_defaults(&osc32k_conf);
mbed_official 579:53297373a894 778
mbed_official 579:53297373a894 779 osc32k_conf.startup_time = CONF_CLOCK_OSC32K_STARTUP_TIME;
mbed_official 579:53297373a894 780 osc32k_conf.enable_1khz_output = CONF_CLOCK_OSC32K_ENABLE_1KHZ_OUTPUT;
mbed_official 579:53297373a894 781 osc32k_conf.enable_32khz_output = CONF_CLOCK_OSC32K_ENABLE_32KHZ_OUTPUT;
mbed_official 579:53297373a894 782 osc32k_conf.on_demand = CONF_CLOCK_OSC32K_ON_DEMAND;
mbed_official 579:53297373a894 783 osc32k_conf.run_in_standby = CONF_CLOCK_OSC32K_RUN_IN_STANDBY;
mbed_official 579:53297373a894 784
mbed_official 579:53297373a894 785 system_clock_source_osc32k_set_config(&osc32k_conf);
mbed_official 579:53297373a894 786 system_clock_source_enable(SYSTEM_CLOCK_SOURCE_OSC32K);
mbed_official 579:53297373a894 787 #endif
mbed_official 579:53297373a894 788
mbed_official 579:53297373a894 789
mbed_official 579:53297373a894 790 /* DFLL Config (Open and Closed Loop) */
mbed_official 579:53297373a894 791 #if CONF_CLOCK_DFLL_ENABLE == true
mbed_official 579:53297373a894 792 struct system_clock_source_dfll_config dfll_conf;
mbed_official 579:53297373a894 793 system_clock_source_dfll_get_config_defaults(&dfll_conf);
mbed_official 579:53297373a894 794
mbed_official 579:53297373a894 795 dfll_conf.loop_mode = CONF_CLOCK_DFLL_LOOP_MODE;
mbed_official 579:53297373a894 796 dfll_conf.on_demand = false;
mbed_official 579:53297373a894 797
mbed_official 579:53297373a894 798 if (CONF_CLOCK_DFLL_LOOP_MODE == SYSTEM_CLOCK_DFLL_LOOP_MODE_OPEN) {
mbed_official 579:53297373a894 799 dfll_conf.coarse_value = CONF_CLOCK_DFLL_COARSE_VALUE;
mbed_official 579:53297373a894 800 dfll_conf.fine_value = CONF_CLOCK_DFLL_FINE_VALUE;
mbed_official 579:53297373a894 801 }
mbed_official 579:53297373a894 802
mbed_official 579:53297373a894 803 # if CONF_CLOCK_DFLL_QUICK_LOCK == true
mbed_official 579:53297373a894 804 dfll_conf.quick_lock = SYSTEM_CLOCK_DFLL_QUICK_LOCK_ENABLE;
mbed_official 579:53297373a894 805 # else
mbed_official 579:53297373a894 806 dfll_conf.quick_lock = SYSTEM_CLOCK_DFLL_QUICK_LOCK_DISABLE;
mbed_official 579:53297373a894 807 # endif
mbed_official 579:53297373a894 808
mbed_official 579:53297373a894 809 # if CONF_CLOCK_DFLL_TRACK_AFTER_FINE_LOCK == true
mbed_official 579:53297373a894 810 dfll_conf.stable_tracking = SYSTEM_CLOCK_DFLL_STABLE_TRACKING_TRACK_AFTER_LOCK;
mbed_official 579:53297373a894 811 # else
mbed_official 579:53297373a894 812 dfll_conf.stable_tracking = SYSTEM_CLOCK_DFLL_STABLE_TRACKING_FIX_AFTER_LOCK;
mbed_official 579:53297373a894 813 # endif
mbed_official 579:53297373a894 814
mbed_official 579:53297373a894 815 # if CONF_CLOCK_DFLL_KEEP_LOCK_ON_WAKEUP == true
mbed_official 579:53297373a894 816 dfll_conf.wakeup_lock = SYSTEM_CLOCK_DFLL_WAKEUP_LOCK_KEEP;
mbed_official 579:53297373a894 817 # else
mbed_official 579:53297373a894 818 dfll_conf.wakeup_lock = SYSTEM_CLOCK_DFLL_WAKEUP_LOCK_LOSE;
mbed_official 579:53297373a894 819 # endif
mbed_official 579:53297373a894 820
mbed_official 579:53297373a894 821 # if CONF_CLOCK_DFLL_ENABLE_CHILL_CYCLE == true
mbed_official 579:53297373a894 822 dfll_conf.chill_cycle = SYSTEM_CLOCK_DFLL_CHILL_CYCLE_ENABLE;
mbed_official 579:53297373a894 823 # else
mbed_official 579:53297373a894 824 dfll_conf.chill_cycle = SYSTEM_CLOCK_DFLL_CHILL_CYCLE_DISABLE;
mbed_official 579:53297373a894 825 # endif
mbed_official 579:53297373a894 826
mbed_official 579:53297373a894 827 if (CONF_CLOCK_DFLL_LOOP_MODE == SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED) {
mbed_official 579:53297373a894 828 dfll_conf.multiply_factor = CONF_CLOCK_DFLL_MULTIPLY_FACTOR;
mbed_official 579:53297373a894 829 }
mbed_official 579:53297373a894 830
mbed_official 579:53297373a894 831 dfll_conf.coarse_max_step = CONF_CLOCK_DFLL_MAX_COARSE_STEP_SIZE;
mbed_official 579:53297373a894 832 dfll_conf.fine_max_step = CONF_CLOCK_DFLL_MAX_FINE_STEP_SIZE;
mbed_official 579:53297373a894 833
mbed_official 579:53297373a894 834 if (CONF_CLOCK_DFLL_LOOP_MODE == SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY) {
mbed_official 579:53297373a894 835 #define NVM_DFLL_COARSE_POS 58
mbed_official 579:53297373a894 836 #define NVM_DFLL_COARSE_SIZE 6
mbed_official 579:53297373a894 837 #define NVM_DFLL_FINE_POS 64
mbed_official 579:53297373a894 838 #define NVM_DFLL_FINE_SIZE 10
mbed_official 579:53297373a894 839 uint32_t coarse =( *((uint32_t *)(NVMCTRL_OTP4)
mbed_official 579:53297373a894 840 + (NVM_DFLL_COARSE_POS / 32))
mbed_official 579:53297373a894 841 >> (NVM_DFLL_COARSE_POS % 32))
mbed_official 579:53297373a894 842 & ((1 << NVM_DFLL_COARSE_SIZE) - 1);
mbed_official 579:53297373a894 843 if (coarse == 0x3f) {
mbed_official 579:53297373a894 844 coarse = 0x1f;
mbed_official 579:53297373a894 845 }
mbed_official 579:53297373a894 846 uint32_t fine =( *((uint32_t *)(NVMCTRL_OTP4)
mbed_official 579:53297373a894 847 + (NVM_DFLL_FINE_POS / 32))
mbed_official 579:53297373a894 848 >> (NVM_DFLL_FINE_POS % 32))
mbed_official 579:53297373a894 849 & ((1 << NVM_DFLL_FINE_SIZE) - 1);
mbed_official 579:53297373a894 850 if (fine == 0x3ff) {
mbed_official 579:53297373a894 851 fine = 0x1ff;
mbed_official 579:53297373a894 852 }
mbed_official 579:53297373a894 853 dfll_conf.coarse_value = coarse;
mbed_official 579:53297373a894 854 dfll_conf.fine_value = fine;
mbed_official 579:53297373a894 855
mbed_official 579:53297373a894 856 dfll_conf.quick_lock = SYSTEM_CLOCK_DFLL_QUICK_LOCK_ENABLE;
mbed_official 579:53297373a894 857 dfll_conf.stable_tracking = SYSTEM_CLOCK_DFLL_STABLE_TRACKING_FIX_AFTER_LOCK;
mbed_official 579:53297373a894 858 dfll_conf.wakeup_lock = SYSTEM_CLOCK_DFLL_WAKEUP_LOCK_KEEP;
mbed_official 579:53297373a894 859 dfll_conf.chill_cycle = SYSTEM_CLOCK_DFLL_CHILL_CYCLE_DISABLE;
mbed_official 579:53297373a894 860
mbed_official 579:53297373a894 861 dfll_conf.multiply_factor = 48000;
mbed_official 579:53297373a894 862 }
mbed_official 579:53297373a894 863
mbed_official 579:53297373a894 864 system_clock_source_dfll_set_config(&dfll_conf);
mbed_official 579:53297373a894 865 #endif
mbed_official 579:53297373a894 866
mbed_official 579:53297373a894 867
mbed_official 579:53297373a894 868 /* OSC8M */
mbed_official 579:53297373a894 869 struct system_clock_source_osc8m_config osc8m_conf;
mbed_official 579:53297373a894 870 system_clock_source_osc8m_get_config_defaults(&osc8m_conf);
mbed_official 579:53297373a894 871
mbed_official 579:53297373a894 872 osc8m_conf.prescaler = CONF_CLOCK_OSC8M_PRESCALER;
mbed_official 579:53297373a894 873 osc8m_conf.on_demand = CONF_CLOCK_OSC8M_ON_DEMAND;
mbed_official 579:53297373a894 874 osc8m_conf.run_in_standby = CONF_CLOCK_OSC8M_RUN_IN_STANDBY;
mbed_official 579:53297373a894 875
mbed_official 579:53297373a894 876 system_clock_source_osc8m_set_config(&osc8m_conf);
mbed_official 579:53297373a894 877 system_clock_source_enable(SYSTEM_CLOCK_SOURCE_OSC8M);
mbed_official 579:53297373a894 878
mbed_official 579:53297373a894 879
mbed_official 579:53297373a894 880 /* GCLK */
mbed_official 579:53297373a894 881 #if CONF_CLOCK_CONFIGURE_GCLK == true
mbed_official 579:53297373a894 882 system_gclk_init();
mbed_official 579:53297373a894 883
mbed_official 579:53297373a894 884 /* Configure all GCLK generators except for the main generator, which
mbed_official 579:53297373a894 885 * is configured later after all other clock systems are set up */
mbed_official 579:53297373a894 886 MREPEAT(8, _CONF_CLOCK_GCLK_CONFIG_NONMAIN, ~);
mbed_official 579:53297373a894 887
mbed_official 579:53297373a894 888 # if CONF_CLOCK_DFLL_ENABLE == true
mbed_official 579:53297373a894 889 /* Enable DFLL reference clock if in closed loop mode */
mbed_official 579:53297373a894 890 if (CONF_CLOCK_DFLL_LOOP_MODE == SYSTEM_CLOCK_DFLL_LOOP_MODE_CLOSED) {
mbed_official 579:53297373a894 891 struct system_gclk_chan_config dfll_gclk_chan_conf;
mbed_official 579:53297373a894 892
mbed_official 579:53297373a894 893 system_gclk_chan_get_config_defaults(&dfll_gclk_chan_conf);
mbed_official 579:53297373a894 894 dfll_gclk_chan_conf.source_generator = CONF_CLOCK_DFLL_SOURCE_GCLK_GENERATOR;
mbed_official 579:53297373a894 895 system_gclk_chan_set_config(SYSCTRL_GCLK_ID_DFLL48, &dfll_gclk_chan_conf);
mbed_official 579:53297373a894 896 system_gclk_chan_enable(SYSCTRL_GCLK_ID_DFLL48);
mbed_official 579:53297373a894 897 }
mbed_official 579:53297373a894 898 # endif
mbed_official 579:53297373a894 899 #endif
mbed_official 579:53297373a894 900
mbed_official 579:53297373a894 901
mbed_official 579:53297373a894 902 /* DFLL Enable (Open and Closed Loop) */
mbed_official 579:53297373a894 903 #if CONF_CLOCK_DFLL_ENABLE == true
mbed_official 579:53297373a894 904 system_clock_source_enable(SYSTEM_CLOCK_SOURCE_DFLL);
mbed_official 579:53297373a894 905 while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_DFLL));
mbed_official 579:53297373a894 906 if (CONF_CLOCK_DFLL_ON_DEMAND) {
mbed_official 579:53297373a894 907 SYSCTRL->DFLLCTRL.bit.ONDEMAND = 1;
mbed_official 579:53297373a894 908 }
mbed_official 579:53297373a894 909 #endif
mbed_official 579:53297373a894 910
mbed_official 579:53297373a894 911 /* DPLL */
mbed_official 579:53297373a894 912 #ifdef FEATURE_SYSTEM_CLOCK_DPLL
mbed_official 579:53297373a894 913 # if (CONF_CLOCK_DPLL_ENABLE == true)
mbed_official 579:53297373a894 914
mbed_official 579:53297373a894 915 /* Enable DPLL reference clock */
mbed_official 579:53297373a894 916 if (CONF_CLOCK_DPLL_REFERENCE_CLOCK == SYSTEM_CLOCK_SOURCE_DPLL_REFERENCE_CLOCK_REF0) {
mbed_official 579:53297373a894 917 /* XOSC32K should have been enabled for DPLL_REF0 */
mbed_official 579:53297373a894 918 Assert(CONF_CLOCK_XOSC32K_ENABLE);
mbed_official 579:53297373a894 919 }
mbed_official 579:53297373a894 920
mbed_official 579:53297373a894 921 struct system_clock_source_dpll_config dpll_config;
mbed_official 579:53297373a894 922 system_clock_source_dpll_get_config_defaults(&dpll_config);
mbed_official 579:53297373a894 923
mbed_official 579:53297373a894 924 dpll_config.on_demand = false;
mbed_official 579:53297373a894 925 dpll_config.run_in_standby = CONF_CLOCK_DPLL_RUN_IN_STANDBY;
mbed_official 579:53297373a894 926 dpll_config.lock_bypass = CONF_CLOCK_DPLL_LOCK_BYPASS;
mbed_official 579:53297373a894 927 dpll_config.wake_up_fast = CONF_CLOCK_DPLL_WAKE_UP_FAST;
mbed_official 579:53297373a894 928 dpll_config.low_power_enable = CONF_CLOCK_DPLL_LOW_POWER_ENABLE;
mbed_official 579:53297373a894 929
mbed_official 579:53297373a894 930 dpll_config.filter = CONF_CLOCK_DPLL_FILTER;
mbed_official 579:53297373a894 931
mbed_official 579:53297373a894 932 dpll_config.reference_clock = CONF_CLOCK_DPLL_REFERENCE_CLOCK;
mbed_official 579:53297373a894 933 dpll_config.reference_frequency = CONF_CLOCK_DPLL_REFERENCE_FREQUENCY;
mbed_official 579:53297373a894 934 dpll_config.reference_divider = CONF_CLOCK_DPLL_REFEREMCE_DIVIDER;
mbed_official 579:53297373a894 935 dpll_config.output_frequency = CONF_CLOCK_DPLL_OUTPUT_FREQUENCY;
mbed_official 579:53297373a894 936
mbed_official 579:53297373a894 937 system_clock_source_dpll_set_config(&dpll_config);
mbed_official 579:53297373a894 938 system_clock_source_enable(SYSTEM_CLOCK_SOURCE_DPLL);
mbed_official 579:53297373a894 939 while(!system_clock_source_is_ready(SYSTEM_CLOCK_SOURCE_DPLL));
mbed_official 579:53297373a894 940 if (CONF_CLOCK_DPLL_ON_DEMAND) {
mbed_official 579:53297373a894 941 SYSCTRL->DPLLCTRLA.bit.ONDEMAND = 1;
mbed_official 579:53297373a894 942 }
mbed_official 579:53297373a894 943
mbed_official 579:53297373a894 944 # endif
mbed_official 579:53297373a894 945 #endif
mbed_official 579:53297373a894 946
mbed_official 579:53297373a894 947 /* CPU and BUS clocks */
mbed_official 579:53297373a894 948 system_cpu_clock_set_divider(CONF_CLOCK_CPU_DIVIDER);
mbed_official 579:53297373a894 949
mbed_official 579:53297373a894 950 system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBA, CONF_CLOCK_APBA_DIVIDER);
mbed_official 579:53297373a894 951 system_apb_clock_set_divider(SYSTEM_CLOCK_APB_APBB, CONF_CLOCK_APBB_DIVIDER);
mbed_official 579:53297373a894 952
mbed_official 579:53297373a894 953 /* GCLK 0 */
mbed_official 579:53297373a894 954 #if CONF_CLOCK_CONFIGURE_GCLK == true
mbed_official 579:53297373a894 955 /* Configure the main GCLK last as it might depend on other generators */
mbed_official 579:53297373a894 956 _CONF_CLOCK_GCLK_CONFIG(0, ~);
mbed_official 579:53297373a894 957 #endif
mbed_official 579:53297373a894 958 }