Esempio n. 1
0
/***********************************************************************************************
*
* @brief    CLK_Init - Initialise the clocks to run at 20 MHz from the 31.25KHz internal reference clock
* @param    none
* @return   none
*
************************************************************************************************/  
void Clk_Init()

{	
	ICS_C1|=ICS_C1_IRCLKEN_MASK; 		/* Enable the internal reference clock*/ 
	ICS_C3= 0x90;						/* Reference clock frequency = 31.25 KHz*/		
	while(!(ICS_S & ICS_S_LOCK_MASK));   /* Wait for PLL lock, now running at 40 MHz (1280 * 31.25Khz) */		
    ICS_C2|=ICS_C2_BDIV(1); 			/*BDIV=2, Bus clock = 20 MHz*/
	ICS_S |= ICS_S_LOCK_MASK; 			/* Clear Loss of lock sticky bit */			
}
/*! @brief Sets up the clock out of RESET
 *
 */
void clock_initialise(void) {

#if (CLOCK_MODE == CLOCK_MODE_NONE)
   // No clock setup
#else
   // XTAL/EXTAL Pins
   // Must not enable I2C0, PTB6, PTB7 as conflicting

   // Configure the Crystal Oscillator
   OSC0->CR = OSC_CR_OSCEN_M|OSC_CR_OSCSTEN_M|OSC_CR_OSCOS_M|OSC_CR_RANGE_M|OSC_CR_HGO_M;


   // Out of reset ICS is in FEI mode
   // =============================================================

   // Switch from FEI -> FEI/FBI/FEE/FBE
   // =============================================================
#if (OSC_CR_OSCEN_M != 0)
   // Wait for oscillator stable (if used)
   do {
      __asm__("nop");
   } while ((OSC->CR & OSC_CR_OSCINIT_MASK) == 0);
#endif

   // Reset default
   ICS->C2 = ICS_C2_BDIV(1);

   ICS->C1 = ICS_C1_CLKS_M|ICS_C1_RDIV_M|ICS_C1_IREFS_M|ICS_C1_IRCLKEN_M|ICS_C1_IREFSTEN_M;

#if (ICS_C1_IREFS_M == 0)
#define ICS_S_IREFST_M 0
#else
#define ICS_S_IREFST_M ICS_S_IREFST_MASK
#endif

   // Wait for mode change
   do {
      __asm__("nop");
   } while ((ICS->S & ICS_S_IREFST_MASK) != ICS_S_IREFST_M);

   // Wait for S_CLKST to indicating that OUTCLK has switched
   do {
      __asm__("nop");
   } while ((ICS->S & ICS_S_CLKST_MASK) != ICS_S_CLKST(ICS_C1_CLKS_V));

   // Set clock divider
   SIM->CLKDIV = SIM_CLKDIV_OUTDIV1_M|SIM_CLKDIV_OUTDIV2_M|SIM_CLKDIV_OUTDIV3_M;

   //SIM->BUSDIV = SIM_BUSDIV_BUSDIV_M;
   ICS->C2 = (ICS->C2 & ~ICS_C2_BDIV_MASK)|ICS_C2_BDIV_M;

   ICS->C4 = (ICS->C4&~(ICS_C4_LOLIE0_MASK|ICS_C4_CME_MASK))|ICS_C4_LOLIE_M|ICS_C4_CME_M;

#endif
   SystemCoreClockUpdate();
}