zoukankan      html  css  js  c++  java
  • GateWay程序分析_主函数_01系统初始化

    主函数main.c的第一行就是调用的系统初始化,那么系统初始化究竟做了些什么?

    /**
    * Initialize the system初始化系统
    *
    * @param  none
    * @return none
    *
    * @brief  Setup the microcontroller system.//安装微控制系统
    *         Initialize the System.
    */
    void SystemInit (void)
    {
      uint32_t i;

    #if (__DEBUG_RAM)       /* Memory Mapping Setup  存储器映射  */
      LPC_SYSCON->SYSMEMREMAP = 0x1;    /* remap to internal RAM */
    #else
      LPC_SYSCON->SYSMEMREMAP = 0x2;    /* remap to internal FLASH */
    #endif

    #if 1


      /*

    第一,下面的几行仅为调试所用.
    在将来的发布版里,看门狗通过bootrom使能,因此,除非连续的喂狗,看门狗将会溢出.如果看门狗溢出,在不是清楚中断的情况下,看门狗中断就会产生.
    下面的逻辑是为了防止系统在调试期间进入看门狗中断.
    第二.所有的外设时钟似乎都被bootrom使能了.
    这和UM(用户手册)不一致.在下面的几行里,只有SYS,ROM,RAM,FlashERG,  FLASHARRAY, and I2C被使能了
    (在7月14日的用户手册中).

    First, below lines are for debugging only. For future release, WDT is
      enabled by bootrom, thus, unless a feed to WDT continuously, or WDT timeout
      will occur. If it's happen, WDT interrupt will be pending until a INT_CLEAR
      is applied. Below logic is to prevent system from going to the WDT interrupt
      during debugging.
      Second, all the peripheral clocks seem to be enabled by bootrom, it's
      not consistent with the UM. In below lines, only SYS, ROM, RAM, FLASHREG,
      FLASHARRAY, and I2C are enabled per UM dated July 14th.

    */
      LPC_WDT->MOD = 0x00;    //看门狗被禁止,停止
      LPC_WDT->FEED = 0xAA;        /* Feeding sequence 喂狗序列*/
      LPC_WDT->FEED = 0x55;

      
      NVIC->ICPR[0] |= 0xFFFFFFFF;
      LPC_SYSCON->SYSAHBCLKCTRL = 0x00000001F;//4.5.14 系统AHB 时钟控制寄存器
    #endif

    #if (CLOCK_SETUP)                                 /* Clock Setup    时钟设置          */

    #if (MAINCLK_SETUP)                                /* System Clock Setup 系统时钟设置      */

    #if (SYSOSC_SETUP)                                /* System Oscillator Setup系统振荡器设置  */
      /* bit 0 default is crystal bypass,
      bit1 0=0~20Mhz crystal input, 

    1=15~50Mhz crystal input. */
      LPC_SYSCON->SYSOSCCTRL = 0x00;
      /* main system OSC run is cleared, bit 5 in PDRUNCFG register */
      LPC_SYSCON->PDRUNCFG     &= ~(1 << 5);          /* Power-up System Osc      */
      LPC_SYSCON->SYSOSCCTRL    = SYSOSCCTRL_Val;
        /* Wait 200us for OSC to be stablized, no status indication, dummy wait. */
      for (i = 0; i < 200; i++) __NOP();
    #endif  // #if (SYSOSC_SETUP)

    //系统倍频器设置

    #if (SYSPLL_SETUP)
      LPC_SYSCON->SYSPLLCLKSEL  = SYSPLLCLKSEL_Val;   /* Select PLL Input   时钟源   */
      LPC_SYSCON->SYSPLLCLKUEN  = 0x01;        /* Update Clock Source 更新时钟使能  */
      LPC_SYSCON->SYSPLLCLKUEN  = 0x00;               /* Toggle Update Register   */
      LPC_SYSCON->SYSPLLCLKUEN  = 0x01;
      while (!(LPC_SYSCON->SYSPLLCLKUEN & 0x01));     /* Wait Until Updated       */
                                    /* System PLL Setup         */
      LPC_SYSCON->SYSPLLCTRL    = SYSPLLCTRL_Val;
      LPC_SYSCON->PDRUNCFG     &= ~(1 << 7);          /* Power-up SYSPLL          */
      while (!(LPC_SYSCON->SYSPLLSTAT & 0x01));          /* Wait Until PLL Locked    */
    #endif // #if (SYSPLL_SETUP)

    //主时钟设置

      LPC_SYSCON->MAINCLKSEL    = MAINCLKSEL_Val;     /* Select PLL Clock Output  */
      LPC_SYSCON->MAINCLKUEN    = 0x01;               /* Update MCLK Clock Source */
      LPC_SYSCON->MAINCLKUEN    = 0x00;               /* Toggle Update Register   */
      LPC_SYSCON->MAINCLKUEN    = 0x01;
      while (!(LPC_SYSCON->MAINCLKUEN & 0x01));       /* Wait Until Updated       */

    #endif  // #if (MAINCLK_SETUP)

    //看门狗时钟设置

    #if (WDTOSC_SETUP)                                /* Watchdog Oscillator Setup*/
      LPC_SYSCON->WDTOSCCTRL    = WDTOSCCTRL_Val;
      LPC_SYSCON->PDRUNCFG     &= ~(1 << 6);          /* Power-up WDT Clock       */
    #endif

      LPC_SYSCON->SYSAHBCLKDIV  = SYSAHBCLKDIV_Val;
      LPC_SYSCON->SSPCLKDIV  = SSPCLKDIV_Val;
      LPC_SYSCON->UART0CLKDIV= UART0CLKDIV_Val;
      LPC_SYSCON->UART1CLKDIV= UART1CLKDIV_Val;
      LPC_SYSCON->SYSTICKCLKDIV= SysTickCLKDIV_Val;

    #if (RTCCLK_SETUP)                                /* RTC clock Setup*/
      LPC_SYSCON->RTCCLKDIV  = RTCCLKDIV_Val;

      LPC_SYSCON->RTCOSCCTRL&= RTCCLKSEL_Val;        
    #endif

    #if (CLKOUTCLK_SETUP)
      LPC_SYSCON->CLKOUTCLKSEL = CLKOUTCLKSEL_Val;
      LPC_SYSCON->CLKOUTDIV = CLKOUTCLKDIV_Val;
    #endif

    #endif  // #if (CLOCK_SETUP)

      /* System clock to the IOCON needs to be enabled or
      most of the I/O related peripherals won't work.

    系统时钟的IOCON必须使能,不然大部分IO相关的外设不能工作.

    */
      LPC_SYSCON->SYSAHBCLKCTRL |= (1<<16);
    }

    可以看到里的系统的初始化,

    主要是对

    系统时钟,外设的时钟的设置.

    一直听的一首歌: 岛歌

  • 相关阅读:
    安卓系统
    移动互联网产品设计的原则
    Java 笔记10
    Get Android Source Code
    Spinner Animation
    Java 笔记09
    Java 笔记07
    Java 笔记08
    例题
    例题
  • 原文地址:https://www.cnblogs.com/xilifeng/p/3011859.html
Copyright © 2011-2022 走看看