| @@ -363,6 +363,7 @@ void ResetHandler(void) | |||
| uint32_t *src = &_etext; | |||
| uint32_t *dest = &_sdata; | |||
| unsigned int i; | |||
| volatile int n; | |||
| WDOG_UNLOCK = WDOG_UNLOCK_SEQ1; | |||
| WDOG_UNLOCK = WDOG_UNLOCK_SEQ2; | |||
| @@ -381,7 +382,6 @@ void ResetHandler(void) | |||
| SIM_SCGC5 = 0x00043F82; // clocks active to all GPIO | |||
| SIM_SCGC6 = SIM_SCGC6_RTC | SIM_SCGC6_FTM0 | SIM_SCGC6_FTM1 | SIM_SCGC6_ADC0 | SIM_SCGC6_FTFL; | |||
| #endif | |||
| // if the RTC oscillator isn't enabled, get it started early | |||
| if (!(RTC_CR & RTC_CR_OSCE)) { | |||
| RTC_SR = 0; | |||
| @@ -400,7 +400,6 @@ void ResetHandler(void) | |||
| // default all interrupts to medium priority level | |||
| for (i=0; i < NVIC_NUM_INTERRUPTS; i++) NVIC_SET_PRIORITY(i, 128); | |||
| // hardware always starts in FEI mode | |||
| // C1[CLKS] bits are written to 00 | |||
| // C1[IREFS] bit is written to 1 | |||
| @@ -409,10 +408,12 @@ void ResetHandler(void) | |||
| // I tried changing MSG_SC to divide by 1, it didn't work for me | |||
| #if F_CPU <= 2000000 | |||
| // use the internal oscillator | |||
| MCG_C1 = MCG_C1_CLKS(1) | MCG_C2_IRCS; | |||
| MCG_C1 = MCG_C1_CLKS(1) | MCG_C1_IREFS; | |||
| // wait for MCGOUT to use oscillator | |||
| while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(1)) ; | |||
| for (n=0; n<10; n++) ; // TODO: why do we get 2 mA extra without this delay? | |||
| MCG_C2 = MCG_C2_IRCS; | |||
| while (!(MCG_S & MCG_S_IRCST)) ; | |||
| // now in FBI mode: | |||
| // C1[CLKS] bits are written to 01 | |||
| // C1[IREFS] bit is written to 1 | |||
| @@ -540,61 +541,12 @@ void ResetHandler(void) | |||
| SIM_SOPT2 = SIM_SOPT2_TRACECLKSEL | SIM_SOPT2_CLKOUTSEL(3); | |||
| #endif | |||
| #if F_CPU <= 2000000 | |||
| // TODO: switch to VLPR mode.... | |||
| // switch to VLPR mode.... | |||
| SMC_PMPROT = SMC_PMPROT_AVLP | SMC_PMPROT_ALLS | SMC_PMPROT_AVLLS; | |||
| SMC_PMCTRL = SMC_PMCTRL_RUNM(2) | SMC_PMCTRL_STOPM(2); // VLPR mode :-) | |||
| #endif | |||
| #if 0 | |||
| #if F_CPU == 2000000 | |||
| // select external reference clock as MCG_OUT | |||
| MCG_C1 |= MCG_C1_CLKS(2); | |||
| // wait for FLL clock to be used | |||
| while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2)) ; | |||
| // now move to FBE mode | |||
| // make sure the FRDIV is configured to keep the FLL reference within spec. | |||
| MCG_C1 &= ~0x38; // clear FRDIV field | |||
| MCG_C1 |= MCG_C1_FRDIV(4); // set FLL ref divider to 512 | |||
| MCG_C6 &= ~MCG_C6_PLLS; // clear PLLS to select the FLL | |||
| while (MCG_S & MCG_S_PLLST){} // Wait for PLLST status bit to clear to | |||
| // indicate switch to FLL output | |||
| // now move to FBI mode | |||
| MCG_C2 |= MCG_C2_IRCS; // set the IRCS bit to select the fast IRC | |||
| // set CLKS to 1 to select the internal reference clock | |||
| // keep FRDIV at existing value to keep FLL ref clock in spec. | |||
| // set IREFS to 1 to select internal reference clock | |||
| MCG_C1 = MCG_C1_CLKS(1) | MCG_C1_FRDIV(4) | MCG_C1_IREFS; | |||
| // wait for internal reference to be selected | |||
| while (!(MCG_S & MCG_S_IREFST)){} | |||
| // wait for fast internal reference to be selected | |||
| while (!(MCG_S & MCG_S_IRCST)){} | |||
| // wait for clock to switch to IRC | |||
| while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(1)) ; | |||
| // now move to BLPI | |||
| MCG_C2 |= MCG_C2_LP; | |||
| // now we're in BLPI mode | |||
| #elif F_CPU == 16000000 || F_CPU == 8000000 || F_CPU == 4000000 | |||
| // select external reference clock as MCG_OUT | |||
| MCG_C1 = MCG_C1_CLKS(2); | |||
| // wait for external clock to be used | |||
| while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(2)) ; | |||
| // set the LP bit to enter BLPE | |||
| MCG_C2 |= MCG_C2_LP; | |||
| // now we're in BLPE mode | |||
| #else | |||
| // switch to PLL as clock source, FLL input = 16 MHz / 512 | |||
| MCG_C1 = MCG_C1_CLKS(0) | MCG_C1_FRDIV(4); | |||
| // wait for PLL clock to be used | |||
| while ((MCG_S & MCG_S_CLKST_MASK) != MCG_S_CLKST(3)) ; | |||
| // now we're in PEE mode | |||
| // configure USB for 48 MHz clock | |||
| #endif | |||
| #endif | |||
| // initialize the SysTick counter | |||
| SYST_RVR = (F_CPU / 1000) - 1; | |||
| SYST_CSR = SYST_CSR_CLKSOURCE | SYST_CSR_TICKINT | SYST_CSR_ENABLE; | |||
| @@ -607,11 +559,6 @@ void ResetHandler(void) | |||
| __libc_init_array(); | |||
| /* | |||
| for (ptr = &__init_array_start; ptr < &__init_array_end; ptr++) { | |||
| (*ptr)(); | |||
| } | |||
| */ | |||
| startup_late_hook(); | |||
| main(); | |||
| while (1) ; | |||