www.pudn.com > LwIP_OSE_1.rar > LowLevelInit.c


//*------------------------------------------------------------------------------------------------ 
//* 文件名			   : LowLevelInit.c 
//* 功能描述		   : 底层硬件初始化程序 
//* 作者    		   : 焦海波 
//* 版本			   : 0.1 
//* 建立日期、时间	   : 2007/02/24 09:55 
//* 最近修改日期、时间 :  
//* 修改原因		   :  
//*------------------------------------------------------------------------------------------------ 
//*------------------------------------------ 头文件 ----------------------------------------------- 
#include	"/at91sam7x256/include/AT91SAM7X256.h" 
#include	"/at91sam7x256/include/lib_AT91SAM7X256.h" 
//*================================================================================================ 
//*											函	数	区 
//*================================================================================================ 
//*------------------------------------------------------------------------------------------------ 
//* 函数名称 : irqvDefault_FIQ_handler 
//* 功能描述 : 默认的FIQ中断处理函数 
//* 入口参数 : 无 
//* 出口参数 : 无 
//*------------------------------------------------------------------------------------------------ 
__irq void irqvDefault_FIQ_handler(void) 
{	 
	while(1); 
} 
//*------------------------------------------------------------------------------------------------ 
//* 函数名称 : irqvDefault_FIQ_handler 
//* 功能描述 : 默认的IRQ中断处理函数 
//* 入口参数 : 无 
//* 出口参数 : 无 
//*------------------------------------------------------------------------------------------------ 
__irq void irqvDefault_IRQ_handler(void) 
{ 
	while(1); 
} 
//*------------------------------------------------------------------------------------------------ 
//* 函数名称 : vSpurious_handler 
//* 功能描述 : 默认的IRQ中断处理函数 
//* 入口参数 : 无 
//* 出口参数 : 无 
//*------------------------------------------------------------------------------------------------ 
__irq void irqvSpurious_handler(void) 
{ 
	//* 清除中断标志,结束中断处理 
	AT91C_BASE_AIC->AIC_EOICR = 0; 
} 
//*------------------------------------------------------------------------------------------------ 
//* 函数名称 : rvLowLevelInit 
//* 功能描述 : 完成两项任务:1、主机时钟的设置与选择;2、初始化系统中断向量并将中断向量表复制到0x0开 
//*          : 始的内存空间 
//* 入口参数 :  [in] 指向中断向量表的指针 
//*			 : [in] 指向SRAM开始地址的指针 
//* 出口参数 : 返回重映射寄存器的地址 
//*------------------------------------------------------------------------------------------------ 
AT91_REG *rvLowLevelInit(unsigned int *unVec, unsigned int *unSram) 
{ 
	AT91PS_PMC		pPMC = AT91C_BASE_PMC; 
	AT91PS_AIC		pAic = AT91C_BASE_AIC; 
	int				i; 
	 
	//* 禁止所有中断 
	AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF; 
	 
	//* 如果调试时并没有结束中断程序运行就终止了,在这里必须结束一次 
	AT91C_BASE_AIC->AIC_EOICR = AT91C_BASE_PITC->PITC_PIVR | AT91C_BASE_PIOA->PIO_ISR; 
	 
	//* 首先禁止看门狗 
  	AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS; 
  	 
	 
	//* 单时钟周期访问最高可达30MHz,我们超过了30MHz所以必须增加等待状态数,不能再使用缺省值 
	AT91C_BASE_MC->MC_FMR = AT91C_MC_FWS_1FWS; 
	 
	 
	//* 第一步:主振荡器使能,并设置主振荡器的启动时间:从数据手册得知SCK为32768Hz,则其一个周期为 
	//* 1/32768微妙,指定CKGR_MOR寄存器的OSCOUNT值为7,则启动时间为7 * 8 * (1/32768) = 1708.984375uS(微妙)	 
  	pPMC->PMC_MOR = (0x07 << 8) | AT91C_CKGR_MOSCEN; 
  	//* 等待主振荡器稳定,也就是等待上面指定的主振荡器启动时间结束 
 	while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));  
   	 
   	//* 第二步:设置PLL的分频、倍频数及锁定时间。因为UDP(即USB设备口)需要48000000Hz时钟,所以必须对18432000Hz 
  	//* 的输入时钟经PLL分频(24)、倍频(MUL + 1 = 125),得到96000000Hz的时钟输出后,再对其2分频才能得到48000000Hz 
  	//* 时钟,其计算公式为:((18432000 / 24) * 125) / 2 = 48000000。 
  	//* 指定PLL锁定时间为28个SCK周期数即28 * (1/32768) = 854.4921875uS 
  	pPMC->PMC_PLLR = 24 | (28 << 8) | (124 << 16) | AT91C_CKGR_USBDIV_1;   
  	//* 等待指定的PLL启动时间结束                 	 
  	while(!(pPMC->PMC_SR & AT91C_PMC_LOCK)); 
  	while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); 
   
  	//* 第三步:设置PLL时钟为2分频 
  	pPMC->PMC_MCKR = AT91C_PMC_PRES_CLK_2; 
  	while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); 
	 
	//* 第四步:选择PLL时钟为系统主时钟MCK 
  	pPMC->PMC_MCKR |= AT91C_PMC_CSS_PLL_CLK; 
  	while(!(pPMC->PMC_SR & AT91C_PMC_MCKRDY)); 
	 
	 
	//* 初始化系统中断向量表 
	pAic->AIC_SVR[0] = (int)irqvDefault_FIQ_handler; 
	for (i=1; i<31; i++) 
		pAic->AIC_SVR[i] = (int)irqvDefault_IRQ_handler; 
	pAic->AIC_SPU  = (int)irqvSpurious_handler; 
	 
	//* 将异常向量复制到RAM 
	for(i=0; i<(8+8); i++) 
	   *unSram++=*unVec++; 
	 
	return (&AT91C_BASE_MC->MC_RCR); 
}