Xmega Application Note


clksys_driver.c

Go to the documentation of this file.
00001 
00070 //_____ I N C L U D E S ____________________________________________________
00071 #include "clksys_driver.h"
00072 
00073 //_____ M A C R O S ________________________________________________________
00074 
00075 //_____ D E F I N I T I O N ________________________________________________
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 
@DOC_TITLE@
Generated on Tue Jan 19 18:41:58 2010 for AVR1320: True 400kHz operation for TWI slave by doxygen 1.5.8