📄 cstartup_at91sam7x256.c
字号:
//*------------------------------------------------------------------------------------------------
//* 文件名 : Cstartup_AT91SAM7x256.c
//* 功能描述 : 硬件系统的基本初始化函数文件
//* 作者 : 焦海波
//* 版本 : 0.1
//* 建立日期、时间 : 2006/06/05 16:46
//* 最近修改日期、时间 :
//* 修改原因 :
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 头文件 -----------------------------------------------
#include "/at91sam7x256/include/AT91SAM7X256.h"
#include "/at91sam7x256/include/lib_AT91SAM7X256.h"
//*----------------------------------------- 原型声明 ----------------------------------------------
//*================================================================================================
//* 函 数 区
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函数名称 : AT91F_LowLevelInit
//* 功能描述 : 对硬件系统作最基本的初始化工作:设置FLASH的等待状态及周期数;禁止看门狗;设置并启动MCK;设置
//* : 系统中断向量表(AIC);将系统异常向量复制到RAM(REMAP之后使用)
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
void AT91F_LowLevelInit(void)
{
AT91PS_PMC pPMC = AT91C_BASE_PMC;
//* 设置FLASH的等待状态数及1.5微妙包含的周期数,因为MCK=48000000Hz,所以1.5微妙为72周期,1个等待状
//* 态(FWS)(超过了30MHz,30MHz以下为0等待状态)。另外,需要注意的的FMR的默认状态是0x00000000,因此
//* FMR的NEBP位为0,也就是说系统默认在编程前执行页擦除
AT91C_BASE_MC->MC_FMR = (72 <<16) | AT91C_MC_FWS_1FWS;
//* 禁止看门狗
AT91C_BASE_WDTC->WDTC_WDMR = AT91C_WDTC_WDDIS;
//* 设置主时钟,第一步:主振荡器使能,并设置主振荡器的启动时间:从数据手册得知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));
//* 第三步:设置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));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -