led.c

来自「《ARM与嵌入式系统基础教程》」· C语言 代码 · 共 72 行

C
72
字号
//*------------------------------------------------------------------------------------------------
//* 文件名			   : Led.c
//* 功能描述		   : 系统入口函数文件
//* 作者    		   : 焦海波
//* 版本			   : 0.1
//* 建立日期、时间	   : 2007/02/01 13:17
//* 最近修改日期、时间 : 
//* 修改原因		   : 
//*------------------------------------------------------------------------------------------------
//*------------------------------------------ 头文件 -----------------------------------------------
#include	"/at91sam7x256/include/AT91SAM7X256.h"
#include	"/at91sam7x256/include/lib_AT91SAM7X256.h"
//*================================================================================================
//*											函	数	区
//*================================================================================================
//*------------------------------------------------------------------------------------------------
//* 函数名称 : SYSEntry
//* 功能描述 : 系统入口函数,能够使用快速时钟驱动LED1快速闪烁
//* 入口参数 : 无
//* 出口参数 : 无
//*------------------------------------------------------------------------------------------------
int SYSEntry(void)
{
	AT91PS_PMC		pPMC = AT91C_BASE_PMC;
	int 			i;
	
	/* ------时钟选择代码开始------ */
	
	//* 第一步:主振荡器使能,并设置主振荡器的启动时间:从数据手册得知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));
  	
	/* ------时钟选择代码结束------ */
	

	//* *(unsigned int*)0xFFFFFC10 = (unsigned int)1 << 3;
	AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91C_ID_PIOB);

	//* *(unsigned int*)0xFFFFF600 = (unsigned int)1 << 19;
	//* *(unsigned int*)0xFFFFF610 = (unsigned int)1 << 19;
	AT91F_PIO_CfgOutput(AT91C_BASE_PIOB, AT91C_PIO_PB19);
	
	while(1)
	{
		// *(unsigned int*)0xFFFFF634 = (unsigned int)1 << 19;
		AT91F_PIO_ClearOutput(AT91C_BASE_PIOB, 1 << 19);
		for(i=0; i<500000; i++);
		
		//* *(unsigned int*)0xFFFFF630 = (unsigned int)1 << 19;
		AT91F_PIO_SetOutput(AT91C_BASE_PIOB, 1 << 19);
		for(i=0; i<500000; i++);
	}	
}

⌨️ 快捷键说明

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