📄 bsp.c
字号:
*
* 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 + -