?? target.c
字號:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: target.c
** Last modified Date: 2004-09-17
** Last Version: 1.0
** Descriptions: header file of the specific codes for LPC2200 target boards
** Every project should include a copy of this file, user may modify it as needed
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-02-02
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by: Chenmingji
** Modified date: 2004-09-17
** Version: 1.01
** Descriptions: Renewed the template, added more compiler supports
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#define IN_TARGET
#include "config.h"
#include "delay.h"
void PLL_Init (void);
/*
*********************************************************************************************************
* PLL_Init()
*
* Description : Set up and activate the PLL.
*
* Argument(s) : none.
*
* Return(s) : none.
*
* Note(s) : (1) The PLL output frequency is calculated by:
*
* Fcco = 2 * Fin * m / n
*
* where
*
* 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 250 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 = 6, and
* clk_div_usb = 6.
*
* Therefore, Fcco = 2 * Fin * M / N = (2 * 12 * 12 / 1) = 288MHz.
* The processor clock = (Fcco / clk_div) = (288MHz / 6) = 48MHz.
* Finally, the USB clock = (Fcco / clk_div_usb) = (288MHz / 6) = 48MHz.
*
* (5) A PLL errata on early revisions of the part prevent Fcco from being greater than 288MHz.
*
* (6) For later revisions, M = 20, clk_div = 8, and clk_div_usb = 10 will yield 60MHz for
* the processor clock and 48MHz for the USB clock.
modified: Fin=10MHz,M=15,N=1,clk_div=6,Fcco = 2 * Fin * M / N =(2*10*15)/1 = 300MHz,
Fcclk = Fcco / clk_div=50Mhz,pclk根據實際來設置。
*********************************************************************************************************
*/
void PLL_Init (void)
{
uint32 m;
uint32 n;
uint32 clk_div;
//沒有用到內部USB,可以關掉片內USB
//INT32U clk_div_usb;
m = 14; /* PLL Multiplier = 15, MSEL bits = 15 - 1 = 14 */
n = 0; /* PLL Divider = 1, NSEL bits = 1 - 1 = 0 */
clk_div = 5; /* Configure the ARM Core clock div to 6. CCLKSEL = 6 - 1 */
// clk_div_usb = 5; /* Configure the USB clock divider to 6, USBSEL = 6 - 1 */
if ((PLLSTAT & DEF_BIT_25) > 0) { /* If the PLL is already running */
PLLCON &= ~DEF_BIT_01; /* Disconnect the PLL */
PLLFEED = 0xAA; /* PLL register update sequence, 0xAA, 0x55 */
PLLFEED = 0x55;
}
PLLCON &= ~DEF_BIT_00; /* Disable the PLL */
PLLFEED = 0xAA; /* PLL register update sequence, 0xAA, 0x55 */
PLLFEED = 0x55;
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 ((SCS & DEF_BIT_06) == 0)
{ /* Wait until OSCSTAT is set (Main OSC ready to be used) */
;
}
CLKSRCSEL = DEF_BIT_00; /* Select main OSC, 10MHz, as the PLL clock source */
PLLCFG = (m << 0) | (n << 16); /* Configure the PLL multiplier and divider */
PLLFEED = 0xAA; /* PLL register update sequence, 0xAA, 0x55 */
PLLFEED = 0x55;
PLLCON |= DEF_BIT_00; /* Enable the PLL */
PLLFEED = 0xAA; /* PLL register update sequence, 0xAA, 0x55 */
PLLFEED = 0x55;
CCLKCFG = clk_div; /* Configure the ARM Core Processor clock divider */
//USBCLKCFG = clk_div_usb; /* Configure the USB clock divider */
while ((PLLSTAT & DEF_BIT_26) == 0)
{ /* Wait for PLOCK to become set */
;
}
PCLKSEL0 = 0xAAAAAAAA; /* Set peripheral clocks to be half of main clock */
PCLKSEL1 = 0x22AAA8AA;
PLLCON |= DEF_BIT_01; /* Connect the PLL. The PLL is now the active clock source */
PLLFEED = 0xAA; /* PLL register update sequence, 0xAA, 0x55 */
PLLFEED = 0x55;
while ((PLLSTAT & DEF_BIT_25) == 0)
{ /* Wait PLLC, the PLL connect status bit to become set */
;
}
}
/*
*********************************************************************************************************
* BSP_CPU_ClkFreq()
*
* Description : Get the CPU clock frequency.
*
* Argument(s) : none.
*
* Return(s) : The CPU clock frequency, in Hz.
*********************************************************************************************************
*/
uint32 BSP_CPU_ClkFreq (void)
{
uint32 msel;
uint32 nsel;
uint32 fin;
uint32 pll_clk_feq; /* When the PLL is enabled, this is Fcco */
uint32 clk_div;
uint32 clk_freq;
switch (CLKSRCSEL & 0x03) { /* Determine the current clock source */
case 0:
fin = IRC_OSC_FRQ;
break;
case 1:
fin = MAIN_OSC_FRQ;
break;
case 2:
fin = RTC_OSC_FRQ;
break;
default:
fin = IRC_OSC_FRQ;
break;
}
if ((PLLSTAT & (1 << 25)) > 0) { /* If the PLL is currently enabled and connected */
msel = (uint32)(PLLSTAT & 0x3FFF) + 1; /* Obtain the PLL multiplier */
nsel = (uint32)((PLLSTAT >> 16) & 0x0F) + 1; /* Obtain the PLL divider */
pll_clk_feq = (2 * msel * (fin / nsel)); /* Compute the PLL output frequency */
} else {
pll_clk_feq = (fin); /* The PLL is bypassed */
}
clk_div = (uint32)(CCLKCFG & 0xFF) + 1; /* Obtain the CPU core clock divider */
clk_freq = (uint32)(pll_clk_feq / clk_div); /* Compute the ARM Core clock frequency */
return (clk_freq);
}
/*
*********************************************************************************************************
* BSP_CPU_PclkFreq()
*
* Description : Get the peripheral clock frequency for a specific peripheral.
*
* Argument(s) : pclk The peripheral clock ID, one of PCLK_??? defined in bsp.h.
*
* Return(s) : The peripheral's clock in Hz
*********************************************************************************************************
*/
uint32 BSP_CPU_PclkFreq (uint8 pclk)
{
uint32 clk_freq;
uint32 selection;
clk_freq = BSP_CPU_ClkFreq();
switch (pclk) {
case PCLK_WDT:
case PCLK_TIMER0:
case PCLK_TIMER1:
case PCLK_UART0:
case PCLK_UART1:
case PCLK_PWM0:
case PCLK_PWM1:
case PCLK_I2C0:
case PCLK_SPI:
case PCLK_RTC:
case PCLK_SSP1:
case PCLK_DAC:
case PCLK_ADC:
case PCLK_CAN1:
case PCLK_CAN2:
case PCLK_ACF:
selection = ((PCLKSEL0 >> (pclk * 2)) & 0x03);
if (selection == 0) {
return (clk_freq / 4);
} else if (selection == 1) {
return (clk_freq);
} else if (selection == 2) {
return (clk_freq / 2);
} else {
return (clk_freq / 8);
}
case PCLK_BAT_RAM:
case PCLK_GPIO:
case PCLK_PCB:
case PCLK_I2C1:
case PCLK_SSP0:
case PCLK_TIMER2:
case PCLK_TIMER3:
case PCLK_UART2:
case PCLK_UART3:
case PCLK_I2C2:
case PCLK_MCI:
case PCLK_SYSCON:
selection = ((PCLKSEL1 >> ((pclk - 16) * 2)) & 0x03);
if (selection == 0) {
return (clk_freq / 4);
} else if (selection == 1) {
return (clk_freq);
} else if (selection == 2) {
return (clk_freq / 2);
} else {
return (clk_freq / 8);
}
default:
return (0);
}
}
/*********************************************************************************************************
** Function name: IRQ_Exception
**
** Descriptions: interrupt exceptional handler , change it as needed
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Chenmingji
** Created Date: 2004/02/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#if 0
void IRQ_Exception(void)
{
while(1); // change it to your code 這一句替換為自己的代碼
}
#endif
/*********************************************************************************************************
** Function name: FIQ_Exception
**
** Descriptions: Fast interrupt exceptional handler , change it as needed
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Chenmingji
** Created Date: 2004/02/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void FIQ_Exception(void)
{
while(1); // change it to your code 這一句替換為自己的代碼
}
/*********************************************************************************************************
** Function name: Timer0_Exception
**
** Descriptions: Timer0 interrupt service function
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Chenmingji
** Created Date: 2004/02/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Timer0_Exception(void)
{
T0IR = 0x01;
VICVectAddr = 0; //interrupt close 通知中斷控制器中斷結束
OSTimeTick();
}
//在下面添加中斷處理函數
/*********************************************************************************************************
** Function name: EINT0_Exception
**
** Descriptions: interrupt exceptional handler , change it as needed
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules:
**
** Created by: Wangbiao
** Created Date: 2007/09/07
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void EINT1_Exception(void)
{
//extern OS_EVENT *sem;
VICIntEnClr = (1 << VIC_EINT1) | (1 << VIC_TIMER0);
VICVectAddr = 0; // 通知中斷控制器中斷結束
OS_ENTER_CRITICAL();
while((EXTINT & 0x02) != 0x00)
{
EXTINT |= 0x02;
}
OS_EXIT_CRITICAL();
//給中斷任務發送信號量
//OSMboxPost(sem,(void *)1);
VICIntEnable = (1 << VIC_EINT1) | (1 << VIC_TIMER0);
VICVectAddr = 0;
}
/****************************************************************************************************
*名稱:RTC_Exception()
*功能:RTC中斷服務函數,LED取反亮
*****************************************************************************************************/
void RTC_Exception(void)
{
extern OS_EVENT *sem;
VICIntEnClr |= (1 << VIC_RTC);
// OS_ENTER_CRITICAL();
while((RTC_ILR & 0x02) != 0x00)
{
RTC_ILR |= 0x02; //清除RTC增量中斷標志
RTC_AMR = 0XFF;
}
//RTC_CIIR=0;
//OS_EXIT_CRITICAL();
//給中斷任務發送信號量
OSMboxPost(sem,(void *)1);
VICIntEnable |= (1 << VIC_RTC);
//RTC_CIIR = 0x01;
VICVectAddr = 0x00; //向量中斷結束
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -