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

📄 lowlevelinit.c

📁 《嵌入式网络系统设计-基于Atmel ARM7 系列》这个本书的光盘资料
💻 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开
//*          : 始的内存空间
//* 入口参数 :  <unVec>[in] 指向中断向量表的指针
//*			 : <unSram>[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);
}

⌨️ 快捷键说明

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