void Reset_Handler(void) { uint32_t *src; uint32_t *dest; //System initialization SystemInit(); //Initialize the relocate segment src = &_etext; dest = &_srelocate; if(src != dest) { while(dest < &_erelocate) { *dest++ = *src++; } } //Clear the zero segment for(dest = &_szero; dest < &_ezero;) { *dest++ = 0; } //Set the vector table base address src = (uint32_t *) & _sfixed; SCB->VTOR = ((uint32_t) src & SCB_VTOR_TBLOFF_Msk); #ifdef ENABLE_TCM //32KB EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(8)); EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_SGPB | EEFC_FCR_FARG(7)); TCM_Enable(); #else EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(8)); EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(7)); TCM_Disable(); #endif //C library initialization __libc_init_array(); //Branch to main function main(); //Endless loop while(1); }
// ============================================================================= // 功能:系统时钟初始化,主时钟配置为300MHz,外设时钟为150M // 参数:无 // 返回:无 // ============================================================================= void SysClk_Init(void) { uint32_t read_MOR; EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(8)); EFC->EEFC_FCR = (EEFC_FCR_FKEY_PASSWD | EEFC_FCR_FCMD_CGPB | EEFC_FCR_FARG(7)); TCM_Disable(); /* Set FWS according to SYS_BOARD_MCKR configuration */ EFC->EEFC_FMR = EEFC_FMR_FWS(5); /* Before switching MAIN OSC on external crystal : enable it and don't * disable at the same time RC OSC in case of if MAIN OSC is still using RC * OSC */ read_MOR = PMC->CKGR_MOR; /* enable external crystal - enable RC OSC */ read_MOR |= (CKGR_MOR_KEY_PASSWD |CKGR_MOR_XT32KFME); PMC->CKGR_MOR = read_MOR; /* Select XTAL 32k instead of internal slow RC 32k for slow clock */ if ( (SUPC->SUPC_SR & SUPC_SR_OSCSEL) != SUPC_SR_OSCSEL_CRYST ) { SUPC->SUPC_CR = SUPC_CR_KEY_PASSWD | SUPC_CR_XTALSEL_CRYSTAL_SEL; while( !(SUPC->SUPC_SR & SUPC_SR_OSCSEL) ); } /* Initialize main oscillator */ if ( !(PMC->CKGR_MOR & CKGR_MOR_MOSCSEL) ) { PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN; while ( !(PMC->PMC_SR & PMC_SR_MOSCXTS) ) { } } /* Switch to 3-20MHz Xtal oscillator */ PMC->CKGR_MOR = CKGR_MOR_KEY_PASSWD | SYS_BOARD_OSCOUNT | CKGR_MOR_MOSCRCEN | CKGR_MOR_MOSCXTEN | CKGR_MOR_MOSCSEL; while ( !(PMC->PMC_SR & PMC_SR_MOSCSELS) ) { } PMC->PMC_MCKR = (PMC->PMC_MCKR & ~(uint32_t)PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK; while ( !(PMC->PMC_SR & PMC_SR_MCKRDY) ) { } /* Initialize PLLA */ PMC->CKGR_PLLAR = SYS_BOARD_PLLAR; while ( !(PMC->PMC_SR & PMC_SR_LOCKA) ) { } /* Switch to main clock */ PMC->PMC_MCKR = (SYS_BOARD_MCKR & ~PMC_MCKR_CSS_Msk) | PMC_MCKR_CSS_MAIN_CLK; while ( !(PMC->PMC_SR & PMC_SR_MCKRDY) ) { } /* Switch to PLLA */ PMC->PMC_MCKR = SYS_BOARD_MCKR; while ( !(PMC->PMC_SR & PMC_SR_MCKRDY) ) { } // SystemCoreClock = CHIP_FREQ_CPU_MAX; }