void SystemInit (void)
{
#ifndef __CODE_RED
#ifdef CORE_M4
fpu_init();
#endif
#endif
#if (CLOCK_SETUP) /* Clock Setup */LPC_SC->SCS = SCS_Val; //#define SCS_Val 0x00000020 主振荡器被使能,且在正确的外部电路连接到XTAL1 和XTAL2引脚的情况下启动。if (SCS_Val & (1 << 5)) { /* If Main Oscillator is enabled */ //上面一条语句已使能Oscillator while ((LPC_SC->SCS & (1<<6)) == 0);/* Wait for Oscillator to be ready */ //等待Oscillator稳定标志位置1}
LPC_SC->CLKSRCSEL = CLKSRCSEL_Val; /* Select Clock Source for sysclk/PLL0*/ //#define CLKSRCSEL_Val 0x00000001
#if (PLL0_SETUP)LPC_SC->PLL0CFG = PLL0CFG_Val; //#define PLL0CFG_Val 0x00000009 12M*(9+1)=120MLPC_SC->PLL0CON = 0x01; /* PLL0 Enable */LPC_SC->PLL0FEED = 0xAA;LPC_SC->PLL0FEED = 0x55;while (!(LPC_SC->PLL0STAT & (1<<10)));/* Wait for PLOCK0 */ //PLOCK
#endif#if (PLL1_SETUP)LPC_SC->PLL1CFG = PLL1CFG_Val;LPC_SC->PLL1CON = 0x01; /* PLL1 Enable */LPC_SC->PLL1FEED = 0xAA;LPC_SC->PLL1FEED = 0x55;while (!(LPC_SC->PLL1STAT & (1<<10)));/* Wait for PLOCK1 */
#endif
LPC_SC->CCLKSEL = CCLKSEL_Val; /* Setup Clock Divider */ //#define CCLKSEL_Val 0x00000101 120M/1=120MLPC_SC->USBCLKSEL = USBCLKSEL_Val; /* Setup USB Clock Divider */LPC_SC->EMCCLKSEL = EMCCLKSEL_Val; /* EMC Clock Selection */LPC_SC->SPIFICLKSEL = SPIFICLKSEL_Val; /* SPIFI Clock Selection */LPC_SC->PCLKSEL = PCLKSEL_Val; /* Peripheral Clock Selection */ //#define PCLKSEL_Val 0x00000002 120M/2=60MLPC_SC->PCONP = PCONP_Val; /* Power Control for Peripherals */LPC_SC->CLKOUTCFG = CLKOUTCFG_Val; /* Clock Output Configuration */
#endif
LPC_SC->PBOOST |= 0x03; /* Power Boost control */ //120M以上开启
#if (FLASH_SETUP == 1) /* Flash Accelerator Setup */LPC_SC->FLASHCFG = FLASHCFG_Val|0x03A; //#define FLASHCFG_Val 0x00005000 //120M
#endif
#ifndef __CODE_RED
#ifdef __RAM_MODE__SCB->VTOR = 0x10000000 & 0x3FFFFF80;
#elseSCB->VTOR = 0x00000000 & 0x3FFFFF80;
#endif
#endifSystemCoreClockUpdate();
}
void SystemCoreClockUpdate (void) /* Get Core Clock Frequency */
{/* Determine clock frequency according to clock register values */if ((LPC_SC->CCLKSEL &0x100) == 0) { /* cclk = sysclk */if ((LPC_SC->CLKSRCSEL & 0x01) == 0) { /* sysclk = irc_clk */SystemCoreClock = __CLK_DIV(IRC_OSC , (LPC_SC->CCLKSEL & 0x1F));PeripheralClock = __CLK_DIV(IRC_OSC , (LPC_SC->PCLKSEL & 0x1F));EMCClock = (SystemCoreClock / ((LPC_SC->EMCCLKSEL & 0x01)+1));}else { /* sysclk = osc_clk */if ((LPC_SC->SCS & 0x40) == 0) {SystemCoreClock = 0; /* this should never happen! */PeripheralClock = 0;EMCClock = 0;}else {SystemCoreClock = __CLK_DIV(OSC_CLK , (LPC_SC->CCLKSEL & 0x1F));PeripheralClock = __CLK_DIV(OSC_CLK , (LPC_SC->PCLKSEL & 0x1F));EMCClock = (SystemCoreClock / ((LPC_SC->EMCCLKSEL & 0x01)+1));}}}else { /* cclk = pll_clk */if ((LPC_SC->PLL0STAT & 0x100) == 0) { /* PLL0 not enabled */SystemCoreClock = 0; /* this should never happen! */PeripheralClock = 0;EMCClock = 0;}else {if ((LPC_SC->CLKSRCSEL & 0x01) == 0) { /* sysclk = irc_clk */uint8_t mul = ((LPC_SC->PLL0STAT & 0x1F) + 1);uint8_t cpu_div = (LPC_SC->CCLKSEL & 0x1F);uint8_t per_div = (LPC_SC->PCLKSEL & 0x1F);uint8_t emc_div = (LPC_SC->EMCCLKSEL & 0x01)+1;SystemCoreClock = __CLK_DIV(IRC_OSC * mul , cpu_div);PeripheralClock = __CLK_DIV(IRC_OSC * mul , per_div);EMCClock = SystemCoreClock / emc_div;}else { /* sysclk = osc_clk */if ((LPC_SC->SCS & 0x40) == 0) {SystemCoreClock = 0; /* this should never happen! */PeripheralClock = 0;EMCClock = 0;}else {uint8_t mul = ((LPC_SC->PLL0STAT & 0x1F) + 1); //PLL0STAT=0x509, bit0~4, mul = 0x509 & 0x1F + 1 = 9 + 1 = 10uint8_t cpu_div = (LPC_SC->CCLKSEL & 0x1F); //CCLKSEL=0x101, bit0~4, cpu_div = 0x101 & 0x1F = 1uint8_t per_div = (LPC_SC->PCLKSEL & 0x1F); //PCLKSEL=0x2, bit0~4, per_div = 0x2 & 0x1F = 2 可取1~4uint8_t emc_div = (LPC_SC->EMCCLKSEL & 0x01)+1;
//#define XTAL (12000000UL) /* Oscillator frequency */
//#define OSC_CLK ( XTAL) /* Main oscillator frequency */
//#define __CLK_DIV(x,y) (((y) == 0) ? 0: (x)/(y)) SystemCoreClock = __CLK_DIV(OSC_CLK * mul , cpu_div); //SystemCoreClock = 12M*10/1 = 120MPeripheralClock = __CLK_DIV(OSC_CLK * mul , per_div); //PeripheralClock = 12M*10/2 = 60MEMCClock = SystemCoreClock / emc_div;}}}}/* ---update USBClock------------------*/if(LPC_SC->USBCLKSEL & (0x01<<8))//Use PLL0 as the input to the USB clock divider{switch (LPC_SC->USBCLKSEL & 0x1F){case 0:USBClock = 0; //no clock will be provided to the USB subsystembreak;case 4:case 6:{uint8_t mul = ((LPC_SC->PLL0STAT & 0x1F) + 1);uint8_t usb_div = (LPC_SC->USBCLKSEL & 0x1F);if(LPC_SC->CLKSRCSEL & 0x01) //pll_clk_in = main_oscUSBClock = OSC_CLK * mul / usb_div;else //pll_clk_in = irc_clkUSBClock = IRC_OSC * mul / usb_div;}break;default:USBClock = 0; /* this should never happen! */}}else if(LPC_SC->USBCLKSEL & (0x02<<8))//usb_input_clk = alt_pll (pll1){if(LPC_SC->CLKSRCSEL & 0x01) //pll1_clk_in = main_oscUSBClock = (OSC_CLK * ((LPC_SC->PLL1STAT & 0x1F) + 1));else //pll1_clk_in = irc_clkUSBClock = (IRC_OSC * ((LPC_SC->PLL0STAT & 0x1F) + 1));}elseUSBClock = 0; /* this should never happen! */
}
本文发布于:2024-01-29 13:25:56,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170650596015591.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |