freetech

kinetis的时钟分配——32.768石英晶体产生96MHz系统时钟

0
阅读(4184)

kinetis有4种振荡源,分别是4MHz内部RC振荡器、32kHz内部RC振荡器、外部主振荡器、外部RTC时钟振荡器。工作时又需要核时钟/系统时钟、总线时钟、FlexBus总线时钟、FLASH时钟、USB时钟等多种不同频率的时钟。这些时钟是通过MCG模块选择4种振荡源经或不经过FLL或PLL输出的中间时钟MCGOUTCLK分频得到的。其中USB时钟由系统集成模块的SIMSIM_CLKDIV2控制分频获得,其余由SIMSIM_CLKDIV1控制分频获得。SIMSIM_CLKDIV1的OUTDIV1~4分别控制核时钟/系统时钟分频、总线时钟分频、FlexBus总线时钟分频和FLASH时钟分频。

image

再来看MCG,如下图:

image

下面代码使用外部32.768kHz的RTC晶体谐振器产生96MHz系统时钟,48MHz总线时钟,48MHz的FlexBUS总线时钟,24MHz的FLASH时钟。

 

void MCG_Init()
{
  /* System clock initialization */
  /* SIM_CLKDIV1: OUTDIV1=0,OUTDIV2=1,OUTDIV3=1,OUTDIV4=3,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0,??=0 */
  SIM_CLKDIV1 = (uint32_t)0x01130000UL; /* Update system prescalers */
  /* SIM_SOPT2: PLLFLLSEL=0 */
  SIM_SOPT2 &= (uint32_t)~0x00010000UL; /* Select FLL as a clock source for various peripherals */
  /* SIM_SOPT1: OSC32KSEL=0 */
  SIM_SOPT1 &= (uint32_t)~0x00080000UL; /* System oscillator drives 32 kHz clock for various peripherals */
  /* Switch to FEE Mode */ 
  SIM_SOPT2 |= (uint32_t)0x01UL;// SIM_SOPT2: MCGCLKSEL=1 0-System oscillator (OSCCLK), 1-32 kHz RTC oscillator
  MCG_C2 = (uint8_t)0x00U; // MCG_C2: ??=0,??=0,RANGE=0,HGO=0,EREFS=0,LP=0,IRCS=0                           
  MCG_C1 = (uint8_t)0x02U; // MCG_C1: CLKS=0,FRDIV=0,IREFS=0,IRCLKEN=1,IREFSTEN=0                           
  MCG_C4 |= 0xE0; //MCG_C4: DMX32=1,DRST_DRS=3                          
  MCG_C5 = 0x00; // MCG_C5: ??=0,PLLCLKEN=0,PLLSTEN=0,PRDIV=0                           
  MCG_C6 = 0x00;// MCG_C6: LOLIE=0,PLLS=0,CME=0,VDIV=0                            
  while((MCG_S & MCG_S_IREFST_MASK) != 0x00U) //Check that the source of the FLL reference clock is the external reference clock.
  {
  }
  while((MCG_S & 0x0CU) != 0x00U) // Wait until output of the FLL is selected
  {   
  }   
}