⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bsp.c

📁 lpc2478+ucosII+ucgui源码
💻 C
📖 第 1 页 / 共 5 页
字号:
*
*                           Fin is the PLL input clock (here, the main oscillator)
*                           M   is the PLL clock multiplier. The value (M - 1) is programmed in PLLCFG.
*                           N   is the PLL clock divider.    The value (N - 1) is programmed in PLLCFG.
*
*               (2) Fcco must be between 275 and 550 MHz. The ARM Core clock must never exceed 72 MHz.
*                   Set clk_div to divide Fcco accordingly.
*
*               (3) When using the USB device, you must choose Fcco as a multiple of 96 MHz, and then
*                   set clk_div_usb to divide Fcco to exactly 48 MHz.
*
*               (4) In this example
*
*                         Fin         = 12MHz,
*                         M           = 12,
*                         N           =  1,
*                         clk_div     =  4, and
*                         clk_div_usb =  6.
*
*                 Therefore, Fcco        = 2 * Fin * M / N      = (2 * 12 * 12 / 1) = 288MHz.
*                 The processor clock    = (Fcco / clk_div)     = (288MHz / 4)      =  72MHz.
*                 Finally, the USB clock = (Fcco / clk_div_usb) = (288MHz / 6)      =  48MHz.
**********************************************************************************************************
*/

static  void  BSP_PLL_Init (void)
{
#if CPU_CFG_CRITICAL_METHOD == CPU_CRITICAL_METHOD_STATUS_LOCAL
    CPU_SR  cpu_sr = 0;
#endif

    CPU_INT32U  m;
    CPU_INT32U  n;
    CPU_INT32U  clk_div;
    CPU_INT32U  clk_div_usb;


    m           = 11;                                           /* PLL Multiplier = 20, MSEL bits = 12 - 1 = 11.        */
    n           =  0;                                           /* PLL Divider    =  1, NSEL bits =  1 - 1 =  0.        */
    clk_div     =  3;                                           /* Cfg the  ARM Core clock div to 4. CCLKSEL =  4 - 1.  */
    clk_div_usb =  5;                                           /* Cfg the USB clock divider to 6, USBSEL  = 6 - 1.     */

    if (DEF_BIT_IS_SET(PLLSTAT, DEF_BIT_25)) {                  /* If the PLL is already running.                       */
        CPU_CRITICAL_ENTER();
        PLLCON  &= ~DEF_BIT_01;                                 /* Disconnect the PLL.                                  */
        PLLFEED  =  0xAA;                                       /* PLL register update sequence, 0xAA, 0x55.            */
        PLLFEED  =  0x55;
        CPU_CRITICAL_EXIT();
    }

    CPU_CRITICAL_ENTER();
    PLLCON   &= ~DEF_BIT_00;                                    /* Disable the PLL.                                     */
    PLLFEED   =  0xAA;                                          /* PLL register update sequence, 0xAA, 0x55.            */
    PLLFEED   =  0x55;
    CPU_CRITICAL_EXIT();

    SCS      &= ~DEF_BIT_04;                                    /* OSCRANGE = 0, Main OSC is between 1 and 20 Mhz.      */
    SCS      |=  DEF_BIT_05;                                    /* OSCEN = 1, Enable the main oscillator.               */

    while (DEF_BIT_IS_CLR(SCS, DEF_BIT_06)) {                   /* Wait until OSCSTAT is set (Main OSC rdy to be used). */
        ;
    }

    CLKSRCSEL = DEF_BIT_00;                                     /* Select main OSC, 12MHz, as the PLL clock source.     */

    CPU_CRITICAL_ENTER();
    PLLCFG    = (m << 0) | (n << 16);                           /* Configure the PLL multiplier and divider.            */
    PLLFEED   = 0xAA;                                           /* PLL register update sequence, 0xAA, 0x55.            */
    PLLFEED   = 0x55;
    CPU_CRITICAL_EXIT();

    CPU_CRITICAL_ENTER();
    PLLCON   |= DEF_BIT_00;                                     /* Enable the PLL.                                      */
    PLLFEED   = 0xAA;                                           /* PLL register update sequence, 0xAA, 0x55.            */
    PLLFEED   = 0x55;
    CPU_CRITICAL_EXIT();

    CCLKCFG   = clk_div;                                        /* Configure the ARM Core Processor clock divider.      */
    USBCLKCFG = clk_div_usb;                                    /* Configure the USB clock divider.                     */

    while (DEF_BIT_IS_CLR(PLLSTAT, DEF_BIT_26)) {              /* Wait for PLOCK to become set.                        */
        ;
    }

    PCLKSEL0  = 0xAAAAAAAA;                                     /* Set peripheral clocks to be half of main clock.      */
    PCLKSEL1  = 0x22AAA8AA;

    CPU_CRITICAL_ENTER();
    PLLCON   |= DEF_BIT_01;                                     /* Connect the PLL. The PLL is now the active clk src.  */
    PLLFEED   = 0xAA;                                           /* PLL register update sequence, 0xAA, 0x55.            */
    PLLFEED   = 0x55;
    CPU_CRITICAL_EXIT();

    while (DEF_BIT_IS_CLR(PLLSTAT, DEF_BIT_25)) {               /* Wait PLLC, the PLL connect status bit to become set. */
        ;
    }
}


/*
*********************************************************************************************************
*                                       BSP_MAM_Init()
*
* Description : Initialize the Memory Acceleration Module.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : BSP_Init()
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  BSP_MAM_Init (void)
{
    CPU_INT32U  clk_freq;


    clk_freq = BSP_CPU_ClkFreq();                               /* Get the current core clock frequency.                */

    MAMCR    = 0;                                               /* Disable MAM functionality.                           */

    if (clk_freq < 20000000) {                                  /* Compare current clock frequency with MAM modes.      */
        MAMTIM = 1;                                             /* Set MAM fetch cycles to 1 processor clk in duration. */
    }

    if (clk_freq < 40000000 && clk_freq >= 2000000) {
        MAMTIM = 2;                                             /* Set MAM fetch cycles to 2 processor clk in duration. */
    }

    if (clk_freq >= 40000000) {
        MAMTIM = 3;                                             /* Set MAM fetch cycles to 3 processor clk in duration. */
    }

    MAMCR = 2;                                                  /* Enable full MAM functionality.                       */
}

/*
*********************************************************************************************************
*                                     BSP_VIC_Init()
*
* Description : Initialize the Vectored Interrupt Controller
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : BSP_Init()
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  BSP_VIC_Init (void)
{
    VICINTENCLEAR =  0xFFFFFFFF;                                /* Disable ALL interrupts.                              */
    VICADDRESS    =  0;                                         /* Acknowlege any pending VIC interrupt.                */
    VICPROTECTION =  0;                                         /* Allow VIC reg access in User or Priviledged modes.   */

    VICVECTADDR0  = (CPU_INT32U)BSP_VIC_DummyWDT;               /* Set the vector address.                              */
    VICVECTADDR1  = (CPU_INT32U)BSP_VIC_DummySW;
    VICVECTADDR2  = (CPU_INT32U)BSP_VIC_DummyDEBUGRX;
    VICVECTADDR3  = (CPU_INT32U)BSP_VIC_DummyDEBUGTX;
    VICVECTADDR4  = (CPU_INT32U)BSP_VIC_DummyTIMER0;
    VICVECTADDR5  = (CPU_INT32U)BSP_VIC_DummyTIMER1;
    VICVECTADDR6  = (CPU_INT32U)BSP_VIC_DummyUART0;
    VICVECTADDR7  = (CPU_INT32U)BSP_VIC_DummyUART1;
    VICVECTADDR8  = (CPU_INT32U)BSP_VIC_DummyPWM01;
    VICVECTADDR9  = (CPU_INT32U)BSP_VIC_DummyI2C0;
    VICVECTADDR10 = (CPU_INT32U)BSP_VIC_DummySPI;
    VICVECTADDR11 = (CPU_INT32U)BSP_VIC_DummySSP1;
    VICVECTADDR12 = (CPU_INT32U)BSP_VIC_DummyPLL;
    VICVECTADDR13 = (CPU_INT32U)BSP_VIC_DummyRTC;
    VICVECTADDR14 = (CPU_INT32U)BSP_VIC_DummyEINT0;
    VICVECTADDR15 = (CPU_INT32U)BSP_VIC_DummyEINT1;
    VICVECTADDR16 = (CPU_INT32U)BSP_VIC_DummyEINT2;
    VICVECTADDR17 = (CPU_INT32U)BSP_VIC_DummyEINT3;
    VICVECTADDR18 = (CPU_INT32U)BSP_VIC_DummyAD0;
    VICVECTADDR19 = (CPU_INT32U)BSP_VIC_DummyI2C1;
    VICVECTADDR20 = (CPU_INT32U)BSP_VIC_DummyBOD;
    VICVECTADDR21 = (CPU_INT32U)BSP_VIC_DummyETHERNET;
    VICVECTADDR22 = (CPU_INT32U)BSP_VIC_DummyUSB;
    VICVECTADDR23 = (CPU_INT32U)BSP_VIC_DummyCAN01;
    VICVECTADDR24 = (CPU_INT32U)BSP_VIC_DummyMMC;
    VICVECTADDR25 = (CPU_INT32U)BSP_VIC_DummyGP_DMA;
    VICVECTADDR26 = (CPU_INT32U)BSP_VIC_DummyTIMER2;
    VICVECTADDR27 = (CPU_INT32U)BSP_VIC_DummyTIMER3;
    VICVECTADDR28 = (CPU_INT32U)BSP_VIC_DummyUART2;
    VICVECTADDR29 = (CPU_INT32U)BSP_VIC_DummyUART3;
    VICVECTADDR30 = (CPU_INT32U)BSP_VIC_DummyI2C2;
    VICVECTADDR31 = (CPU_INT32U)BSP_VIC_DummyI2S;
}

/*
*********************************************************************************************************
*                                     BSP_RTC_Init()
*
* Description : Initialize the Real Time Clock.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : BSP_Init()
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  BSP_RTC_Init (void)
{
    CCR     = 0x0011;
    PREINT  = (BSP_CPU_PclkFreq(BSP_PCLK_RTC) / 32768) - 1;
    PREFRAC = BSP_CPU_PclkFreq(BSP_PCLK_RTC) - ((PREINT + 1) * 32768);

                                                                /* If year is corrupt, set reasonable date.             */
    if (YEAR < 2008) {
        YEAR   = 2008;
        MONTH  = 8;
        DOM    = 8;
        HOUR   = 7;
        MIN    = 0;
    }
}

/*
*********************************************************************************************************
*                                            BSP_Tmr_TickInit()
*
* Description : Initialize uC/OS-II's tick source.
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : BSP_Init()
*
* Note(s)     : none.
*********************************************************************************************************
*/

void  BSP_Tmr_TickInit (void)
{
    CPU_INT32U  pclk_freq;
    CPU_INT32U  rld_cnts;

                                                                /* VIC timer #0 init.                                   */
    VICINTSELECT     &= ~(1 << VIC_TIMER0);                     /* Configure the timer interrupt as an IRQ source.      */
    VICVECTADDR4      =  (CPU_INT32U)BSP_Tmr_TickISR_Handler;   /* Set the vector address.                              */
    VICVECTPRIORITY4  = 15;                                     /* Set the vector priority.                             */
    VICINTENABLE      =  (1 << VIC_TIMER0);                     /* Enable the timer interrupt source.                   */

    pclk_freq         =   BSP_CPU_PclkFreq(BSP_PCLK_TIMER0);    /* Get the peripheral clock frequency.                  */

    rld_cnts          =   pclk_freq / OS_TICKS_PER_SEC;         /* Calculate the nbr of cnts necessary for the OS tick. */

    T0TCR             =  (1 << 1);                              /* Disable and reset ctr 0 and the prescale ctr 0.      */
    T0TCR             =   0;                                    /* Clear the reset bit.                                 */
    T0PC              =   0;                                    /* Prescaler is set to no division.                     */

    T0MR0             =   rld_cnts;
    T0MCR             =   3;                                    /* Interrupt on MR0 (reset TC), stop TC.                */

    T0CCR             =   0;                                    /* Capture is disabled.                                 */
    T0EMR             =   0;                                    /* No external match output.                            */
    T0TCR             =   1;                                    /* Enable timer 0.                                      */
}

/*
*********************************************************************************************************
*********************************************************************************************************
*                                           LOCAL FUNCTIONS
*********************************************************************************************************
*********************************************************************************************************
*/

/*
*********************************************************************************************************
*                                                 BSP_LED_Init()
*
* Description : Initialize the I/Os for the LEDs
*
* Argument(s) : none.
*
* Return(s)   : none.
*
* Caller(s)   : BSP_Init()
*
* Note(s)     : none.
*********************************************************************************************************
*/

static  void  BSP_LED_Init (void) 
{
    IO1DIR  |= BSP_GPIO1_LED_GRP;
    IO1SET   = BSP_GPIO1_LED_GRP;
}

/*
*********************************************************************************************************
*                                                 BSP_PB_Init()
*
* Description : Initialize the 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -