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

📄 sysutils.c

📁 arm7 AD0804 test source code
💻 C
字号:
/****************************************************************************/
/*
    文 件 名: SysUtil.c
    说	  明: 简单的系统程序
    作    者: 郭天祥
    日	  期: 2008.9
*/
/*****************************************************************************/

#include "..\inc\44b0x.h"
#include "..\inc\uTypes.h"
#include "..\inc\sysUtils.h"
#include "..\inc\console.h"

#define	EXT_OSC_CLK	10000000	//外部晶振频率大小

U32 g_dwMCLK = 20000000;    	//初始值20MHz

/******************************************
函数名称: sysUtilsUSecDelay
功    能: 延迟指定的us数
参    数: dwUs - 延迟的us数
*******************************************/
void sysUtilsUSecDelay (U32 dwUs)
{
  U32 dwCnt;
  dwCnt = dwUs * (g_dwMCLK/4000000);
  while(dwCnt--) 
  {
  //  if (dwCnt == 1)		//校准延时使用
  //  printf ("hello World");
  }
}

/*****************************************
函数名称: sysUtilsDelay
功    能: 延迟指定CPU cycle
参    数: dwTime - 延迟的CPU周期数
******************************************/
void sysUtilsDelay (U32 dwTime)
{
    while (dwTime --);
}

/*****************************************
功能		:设置系统的锁相环
参数		:nMDiv ----
			:nPDiv  ----
			:nSDiv  ----
******************************************/
STATUS sysUtilsSetPllValue (int nMDiv, int nPDiv, int nSDiv)
{
	int i = 1;		
	
	rPLLCON = (nMDiv<<12)|(nPDiv<<4)|nSDiv;
	
	while(nSDiv--)
		i *= 2;	
	
	g_dwMCLK = (EXT_OSC_CLK*(nMDiv+8))/((nPDiv+2)*i);		

	return STATUS_OK;
}

/*设置主要的时钟*/
STATUS sysUtilsSetMainClk (U32 nMCLK)
{
	if (0 == nMCLK)
	{
		return STATUS_ERR;
	}
	
	g_dwMCLK = nMCLK;
	return STATUS_OK;
}

/*定时器的初始化*/
void InitSysTimer(U8 Freq)
{		
	rTCON   &= 0xf0ffffff;			//clear manual update bit, stop Timer 5 	
	rTCFG0  &= 0xff00ffff;			//定时器4/5的预分频为16
	rTCFG0  |= (16-1)<<16;
	rTCFG1  &= 0xff0fffff;			//定时器5的MUX为1/8
	rTCFG1  |= 2<<20;	
	rTCNTB5  = g_dwMCLK/(Freq*16*8);	//定时器5的重装值,在ENABLE之前设定	
	rTCON   |= 0x02000000;			//定时器5的MANUAL UPDATE BIT设为1
	rTCON   &= 0xf0ffffff;			//MANUAL UPDATE BIT清零
	rTCON   |= 0x05000000;			//定时器5 start, 设为INTERVAL模式
}

#define	MaxBeepFreq	20000
#define	MinBeepFreq	20

/*pwm控制*/
void SetBeepPwm(U16 Freq, U8 HiRatio)
{
	if(Freq>MaxBeepFreq)
		Freq = MaxBeepFreq;
	if(HiRatio>100)
		HiRatio = 100;	
	rTCON  	&= 0xffff0fff;					// clear manual update bit, stop Timer2
	rTCFG0 	&= 0xffff00ff;					// set Timer 2&3 prescaler 0
	rTCFG1 	&= 0xfffff0ff;					// set Timer 2 MUX 1/16
	rTCFG1  |= 0x00000300;	
	rTCNTB2	 = g_dwMCLK/(Freq*16);				//if set inverter off, when TCNT2<=TCMP2, TOUT is high, TCNT2>TCMP2, TOUT is low
	rTCMPB2  = (rTCNTB2*(100-HiRatio))/100;	//if set inverter on,  when TCNT2<=TCMP2, TOUT is low,  TCNT2>TCMP2, TOUT is high
	rTCON	|= 0x00002000;					// manual update
	rTCON	&= 0xffff0fff;	  				// clear manal update bit
	rTCON   |= 0x0000d000;					// auto reload, inverter on, start Timer 5
}

/***************************
函数名称: IoConfig
功    能: 初始化IO口
****************************/
void IoConfig (void)
{
	// PORT A GROUP
	/*  BIT 9	8	7	6	5	4	3	2	1	0	*/
	/*  A24	  A23	A22	A21	A20	A19	A18	A17	A16	A0	*/	      
	/*  0		1	1	1	1	1	1	1	1	1	*/
	rPCONA = 0x1ff;	

	// PORT B GROUP
	/*  BIT 10	9		8		7		6		5		4		3		2		1		0		*/
	/*	/CS5	/CS4	/CS3	/CS2	/CS1	nWBE3	nWBE2	/SRAS	/SCAS	SCLK	SCKE	*/
	/*	EXT		NIC		8019	IDE		D12		NC		NC		Sdram	Sdram	Sdram	Sdram	*/
	/*	1,		1,   	1,   	1,    	1,    	0,      0,		1,    	1,    	1,   	1       */
	rPDATB = 0x04f;
	rPCONB = 0x7cf;    
    
	//PORT C GROUP
	//BUSWIDTH=16													*/
	/*  PC15	14		13		12		11		10		9		8	*/
	/*	o		o		RXD1	TXD1	o		o		o		o	*/
	/*	NC		NC		Uart1	Uart1	NC		NC		NC		NC	*/
	/*  01		01		11		11		01		01		01		01	*/

	/*  PC7		6		5		4		3		2		1		0	*/
	/*  o		o		o		o		o		o		o		o	*/
	/*  NC		NC		NC		NC		LED		LED		LED		LED	*/
	/*  01		01		01		01		01		01		01		01	*/
	rPDATC = (1<<13)|(1<<3);	//All IO is low
	rPCONC = 0x55555555;	
	rPUPC  = 0x0;	//PULL UP RESISTOR should be enabled to I/O

	//PORT D GROUP
	/*  PORT D GROUP(I/O OR LCD)										*/
	/*  BIT7		6		5		4		3		2		1		0	*/
	/*  VF			VM		VLINE	VCLK	VD3		VD2		VD1		VD0	*/
	/*	01			01		01		01		01		01		01		01	*/
	rPDATD = 0xffff;
	rPCOND = 0x5555;	
	rPUPD  = 0x0;	    //PULL UP RESISTOR should be enabled to I/O
	
	//These pins must be set only after CPU's internal LCD controller is enable
/////////////////////////////////////////////////////	
	//PORT E GROUP 
	/*  Bit 8		7		6		5		4		3		2		1		0		*/
	/*	ENDLAN		o		o		TOU2	o		o		RXD0	TXD0	FOUT	*/ 
	/*  00			01		01		10		01		01		10		10		11		*/	
	rPDATE	= ~(1<<5);				//Beep = 10
	rPCONE	= 0x5569;				
	rPUPE	= 0xff;
	
	//PORT F GROUP
	/*  Bit8		7		6		5		 4		3		2		1		0		*/   
	/*  IISCLK		IISDI	IISDO	IISLRCK	Input	Input	Input	IICSDA	IICSCL	*/
	/*	100			100		100		100		00		00		00		10		10		*/	
	rPDATF = 0xfffff;
	rPCONF = 0x50;	 
	rPUPF  = 0x0; //PULL UP RESISTOR should be enabled to I/O

	//PORT G GROUP
	/*  BIT7		6		5		4		3		2		1		0		*/
	/*	EINT7		EINT6	EINT5	EINT4	EINT3	EINT2	EINT1	EINT0	*/
	/*  KEY3		KEY2	KEY1	KEY0	NIC		EXT		IDE		USB		*/
	/*	11 			11      11      11      11      11      11      11		*/
	rPDATG = 0x0f;	
	rPCONG = 0x5500;
	rPUPG  = 0x0;	//should be enabled  

	rSPUCR= 0x4;//0x7;  //D15-D0 pull-up disable
	//rSPUCR= 0x6;  //D15-D0 pull-up enable
	
	rSYSCFG = 0x0e;				//使用8K字节的指令缓存,write buffer disable		 
	rNCACHBE0 = 0xc0002000;		//定义非Cache区,从0x2000000到0xbffffff,中断时进入ROM,若不允许CACHE不正常
	rEXTINT = 0x0;				//所有的外部硬件中断为低电平触发	
}

⌨️ 快捷键说明

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