00001
00070
00071 #include "clksys_driver.h"
00072
00073
00074
00075
00076
00085 void CCPWrite( volatile uint8_t * address, uint8_t value )
00086 {
00087 #ifdef __ICCAVR__
00088 asm("movw r30, r16");
00089 #ifdef RAMPZ
00090 RAMPZ = 0;
00091 #endif
00092 asm("ldi r16, 0xD8 \n"
00093 "out 0x34, r16 \n"
00094 "st Z, r18 \n");
00095
00096 #elif defined __GNUC__
00097 volatile uint8_t * tmpAddr = address;
00098 #ifdef RAMPZ
00099 RAMPZ = 0;
00100 #endif
00101 asm volatile(
00102 "movw r30, %0" "\n\t"
00103 "ldi r16, %2" "\n\t"
00104 "out %3, r16" "\n\t"
00105 "st Z, %1"
00106 :
00107 : "r" (tmpAddr), "r" (value), "M" (CCP_IOREG_gc), "m" (CCP)
00108 : "r16", "r30", "r31"
00109 );
00110
00111 #endif
00112 }
00113
00128 void CLKSYS_XOSC_Config( OSC_FRQRANGE_t freqRange,
00129 bool lowPower32kHz,
00130 OSC_XOSCSEL_t xoscModeSelection )
00131 {
00132 OSC.XOSCCTRL = (uint8_t) freqRange |
00133 ( lowPower32kHz ? OSC_X32KLPM_bm : 0 ) |
00134 xoscModeSelection;
00135 }
00136
00137
00154 void CLKSYS_PLL_Config( OSC_PLLSRC_t clockSource, uint8_t factor )
00155 {
00156 factor &= OSC_PLLFAC_gm;
00157 OSC.PLLCTRL = (uint8_t) clockSource | ( factor );
00158 }
00159
00160
00174 uint8_t CLKSYS_Disable( uint8_t oscSel )
00175 {
00176 OSC.CTRL &= ~oscSel;
00177 uint8_t clkEnabled = OSC.CTRL & oscSel;
00178 return clkEnabled;
00179 }
00180
00181
00193 void CLKSYS_Prescalers_Config( CLK_PSADIV_t PSAfactor,
00194 CLK_PSBCDIV_t PSBCfactor )
00195 {
00196 uint8_t PSconfig = (uint8_t) PSAfactor | PSBCfactor;
00197 CCPWrite( &CLK.PSCTRL, PSconfig );
00198 }
00199
00200
00212 uint8_t CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_t clockSource )
00213 {
00214 uint8_t clkCtrl = ( CLK.CTRL & ~CLK_SCLKSEL_gm ) | clockSource;
00215 CCPWrite( &CLK.CTRL, clkCtrl );
00216 clkCtrl = ( CLK.CTRL & clockSource );
00217 return clkCtrl;
00218 }
00219
00220
00228 void CLKSYS_RTC_ClockSource_Enable( CLK_RTCSRC_t clockSource )
00229 {
00230 CLK.RTCCTRL = ( CLK.RTCCTRL & ~CLK_RTCSRC_gm ) |
00231 clockSource |
00232 CLK_RTCEN_bm;
00233 }
00234
00235
00247 void CLKSYS_AutoCalibration_Enable( uint8_t clkSource, bool extReference )
00248 {
00249 OSC.DFLLCTRL = ( OSC.DFLLCTRL & ~clkSource ) |
00250 ( extReference ? clkSource : 0 );
00251 if (clkSource == OSC_RC2MCREF_bm) {
00252 DFLLRC2M.CTRL |= DFLL_ENABLE_bm;
00253 } else if (clkSource == OSC_RC2MCREF_bm) {
00254 DFLLRC32M.CTRL |= DFLL_ENABLE_bm;
00255 }
00256 }
00257
00258
00267 void CLKSYS_XOSC_FailureDetection_Enable( void )
00268 {
00269 CCPWrite( &OSC.XOSCFAIL, ( OSC_XOSCFDIF_bm | OSC_XOSCFDEN_bm ) );
00270 }
00271
00272
00279 void CLKSYS_Configuration_Lock( void )
00280 {
00281 CCPWrite( &CLK.LOCK, CLK_LOCK_bm );
00282 }
00283