www.pudn.com > lpc2146USB.rar > main1.c


#include "lpc2136config.h" 
#include "extint.h" 
#include "type.h" 
 
 
 
volatile uint8 rcv_buf[40];		// UART0数据接收缓冲区 
volatile uint8 rcv_new;			// 接收新数据标志 
volatile uint32 rcv_num; 
 
uint8 UART0Buffer[20]; 
uint32 sendbit[20]; 
uint32 viewtemp; 
volatile uint32 powerdown; 
 
 
void SendDataTest(void); 
void CapDataTest(void); 
//void EINT2_Handler(void); 
//void Uart0_Handler(void); 
void DAC_Test(void); 
uint32 ADC_Test(void); 
 
 
void __irq IRQ_UART0(void) 
{ 
	uint32 i,uartiir; 
	 
	 
	uartiir=U0IIR&0x0f; 
	if (uartiir==0x04)	 
	{ 
	   	rcv_new = 1;					// 设置接收到新的数据标志 
		for (i=0;i<14;i++) 
			rcv_buf[rcv_num+i]=U0RBR;	// 读取FIFO的数据,并清除中断	 
		rcv_num=rcv_num+14;	 
	} 
	if (uartiir==0x0c)	 
	{ 
		rcv_new=1; 
		i=U0LSR; 
		IOPIN=IOPIN^0x00800000; 
	}	 
	VICVectAddr = 0x00;			// 中断处理结束 
} 
 
void __irq IRQ_EINT2(void) 
{   
	IOSET=0x00800000; 
  	EXTINT=0x04;						// 清除EINT0中断标志 
   	VICVectAddr = 0x00;				// 通知VIC向量中断结束 
} 
 
void VIC_Init(void) 
{ 
	IRQEnable();						// 使能IRQ中断 
	VICIntSelect=0x00000000;			// 设置所有的通道为IRQ中断 
	VICVectCntl0=0x20|06;				// UART0分配到IRQ slot0,即最高优先级 
	VICVectAddr0=(uint32)IRQ_UART0;		// 设置UART0向量地址 
	VICVectCntl1=0x20|16;				// 分配EINT2中断到向量中断2 
   	VICVectAddr1=(uint32)IRQ_EINT2;		// 设置EINT2中断服务程序地址 
   	EXTINT=0x04;						// 清除EINT3中断标志 
   	VICIntEnable=(1<<06)|(1<<16);		// 使能UART0/EINT2中断 
   	 
}	 
 
 
void UARTInit(uint32 baudrate) 
{ 
    uint32 Fdiv; 
 
    U0LCR=0x83;               			/* 8 bits, no Parity, 1 Stop bit    */ 
    Fdiv=(Fpclk/16)/baudrate ;			/*baud rate */ 
    U0DLM=Fdiv/256;							 
    U0DLL=Fdiv%256;	 
     
     
    U0LCR=0x03;               			/* DLAB = 0                         */ 
    //U0LCR=0x43;               			/* DLAB = 0                         */ 
    //U0FCR=0x07;							/* Enable and reset TX and RX FIFO. */ 
	U0FCR=0xc3;							/* Enable and reset TX and RX FIFO. */ 
 
     
	//U0IER = 0x01;						// 允许RBR中断,即接收中断 
	U0IER = 0x05;						// 允许RBR中断,即接收中断 
	rcv_num=0; 
	 
} 
 
void UARTSend(uint8 *BufferPtr, uint32 Length ) 
{ 
    while (Length!=0) 
    { 
		while ((U0LSR&0x20)==0x20)	 
		{ 
			U0THR=*BufferPtr; 
			BufferPtr++; 
			Length--; 
		} 
    } 
} 
 
 
void EINT2_Init(void) 
{ 
    EXTMODE=EINT2_EDGE;			// INT2 edge trigger 
    EXTPOLAR=0;					// INT2 is falling edge by default  
} 
 
__inline void  EnableIRQ(void) 
{   
	int  tmp; 
	__asm 
   	{ 
   		MRS	tmp, CPSR 
      	BIC   tmp, tmp, #0x80 
      	MSR   CPSR_c, tmp  
   	} 
} 
 
void Re_Power_Init(void) 
{ 
	#ifdef __DEBUG_RAM     
    	MEMMAP = 0x2;                   //remap 
	#endif 
 
	#ifdef __DEBUG_FLASH     
    	MEMMAP = 0x1;                   //remap 
	#endif 
 
	#ifdef __IN_CHIP     
    	MEMMAP = 0x1;                   //remap 
	#endif 
 
	/* 设置系统各部分时钟 */ 
	/* Set system timers for each component */ 
    PLLCON = 1; 
	 
	#if (Fpclk / (Fcclk / 4)) == 1 
    	VPBDIV = 0; 
	#endif 
	 
	#if (Fpclk / (Fcclk / 4)) == 2 
    	VPBDIV = 2; 
	#endif 
	 
	#if (Fpclk / (Fcclk / 4)) == 4 
    	VPBDIV = 1; 
	#endif 
 
	#if (Fcco / Fcclk) == 2 
    	PLLCFG = ((Fcclk / Fosc) - 1) | (0 << 5); 
	#endif 
	 
	#if (Fcco / Fcclk) == 4 
    	PLLCFG = ((Fcclk / Fosc) - 1) | (1 << 5); 
	#endif 
	 
	#if (Fcco / Fcclk) == 8 
    	PLLCFG = ((Fcclk / Fosc) - 1) | (2 << 5); 
	#endif 
 
	#if (Fcco / Fcclk) == 16 
    	PLLCFG = ((Fcclk / Fosc) - 1) | (3 << 5); 
	#endif 
     
    PLLFEED = 0xaa; 
    PLLFEED = 0x55; 
    while((PLLSTAT & (1 << 10)) == 0); 
    PLLCON = 3; 
    PLLFEED = 0xaa; 
    PLLFEED = 0x55; 
     
    /* 设置存储器加速模块 */ 
    /* Set memory accelerater module*/ 
    MAMCR = 0; 
	 
	#if Fcclk < 20000000 
    	MAMTIM = 1; 
	#else 
		#if Fcclk < 40000000 
    		MAMTIM = 2; 
		#else 
    		MAMTIM = 3; 
		#endif 
	#endif 
    MAMCR = 2; 
} 
 
void ADC_Init(void) 
{ 
	uint32 loop; 
	AD0CR = 1 						|	// SEL=8,选择通道3 
	((Fpclk / 4000000 - 1) << 8)	|	// CLKDIV=Fpclk/1000000-1,转换时钟为1MHz 
	(0 << 16)						|	// BURST=0,软件控制转换操作 
	(0 << 17)						|	// CLKS=0, 使用11clock转换 
	(1 << 21)						|  	// PDN=1,正常工作模式 
	(0 << 22)						|  	// TEST1:0=00,正常工作模式 
	(1 << 24)						|	// START=1,直接启动ADC转换 
	(0 << 27);						 	// 直接启动ADC转换时,此位无效 
	loop=1000; 
	while (loop-->0) 
	{ 
	} 
	loop= AD0DR;						// 读取ADC结果,并清除DONE标志位 
 
}	 
 
uint32 ADC_Test(void) 
{ 
	uint32 ADC_Data; 
	AD0CR |= 1 << 24;					// 再次启动转换 
	//IOSET=0x00200000; 
	while ((AD0DR & 0x80000000) == 0) 
	{ 
	}	// 等待转换结束 
	//IOCLR=0x00200000; 
	ADC_Data = AD0DR;					// 读取ADC结果 
	ADC_Data = (ADC_Data >> 6) & 0x3ff; 
	ADC_Data = ADC_Data * 3300; 
	return( ADC_Data / 1024); 
}				 
 
void PWM_Init(void) 
{ 
	PWMTCR=0x00000002;			/* Counter Reset */  
	PWMPR=27;					/* count frequency:Fpclk */ 
    PWMMCR=0x00;				 	//不使用中断 
    PWMMR0=1000;				/* set PWM cycle */ 
    PWMMR5=350; 
    PWMLER=0x20; 
     
    PWMPCR=0x2000; 
    PWMTCR=0x00000009;			/* counter enable, PWM enable */ 
} 
 
void SPI_Init() 
{ 
	S0PCR=0x20; 
	S0PCCR=0x10; 
	SSPCR0=0x000f; 
	SSPCR1=0x02; 
	SSPCPSR=0x0a; 
}	 
	 
 
int main (void) 
{	 
	 
	uint32 test,loop; 
	IODIR=0x00B00C04; 
	 
	 
	 
	 
	//IO1DIR=0x03FF0000; 
	IO1DIR=0x00000000; 
	 
	//CAP0.0	P0.30 
	//CAP0.3	P0.29 
	//AD0.1		P0.28 
	//DAC		P0.25 
	//MAT0.2	P0.16 
	//还没使能EINT1 	=P0.3 
	 
	//PWM5		P0.21 
	//SPI0		P0.4--P0.6 
	//SPI1		P0.17--P0.19	 
	//EINT2		P0.15 
	PINSEL0=0x80001505;       //RxD0 TxD0 SPI0 EINT2 
     
    //PINSEL0=0x00000005;       //RxD0 TxD0 
     
     
     
    //PINSEL1=0x390E0402; 
     
    PINSEL1=0x390E04aa;		//SPI1 
     
    PINSEL2=0x00000004; 
     
    	 
	UART0Buffer[0]=0x55; 
	UART0Buffer[1]=0x00; 
	UART0Buffer[2]=0x55; 
	UART0Buffer[3]=0x00; 
	UART0Buffer[4]=0x55; 
	UART0Buffer[5]=0x00; 
	UART0Buffer[6]=0x55; 
	UART0Buffer[7]=0x00; 
	UART0Buffer[8]=0x55; 
	UART0Buffer[9]=0x00; 
	 
	UART0Buffer[10]=0x55; 
	UART0Buffer[11]=0x00; 
	UART0Buffer[12]=0x55; 
	UART0Buffer[13]=0x00; 
	UART0Buffer[14]=0x55; 
	UART0Buffer[15]=0x00; 
	UART0Buffer[16]=0x55; 
	UART0Buffer[17]=0x00; 
	UART0Buffer[18]=0x55; 
	UART0Buffer[19]=0x00; 
	 
	sendbit[0]=691; 
	sendbit[1]=3180; 
	sendbit[2]=8156; 
	sendbit[3]=691; 
	sendbit[4]=2074; 
	sendbit[5]=2074; 
	sendbit[6]=691; 
	sendbit[7]=691; 
	sendbit[8]=691; 
	sendbit[9]=207400; 
	sendbit[10]=691; 
	 
	T0TCR=0x00000001; 
	//T0MCR=0x00000003; 
	//T0EMR=0x31; 
	VIC_Init(); 
	 
	UARTInit(115200); 
	//ADC_Init(); 
	 
	EINT2_Init(); 
	PWM_Init(); 
	//SPI_Init(); 
	 
	 
		 
	IOSET=0x00800000; 
	 
	//PCON = 0x06; 
	while(1) 
    { 
    	if (rcv_new == 1) 
		{	 
			rcv_new =0; 
			rcv_num=0; 
			IOPIN=IOPIN^0x00800000; 
			UARTSend(UART0Buffer,20); 
		} 
 
     
    } 
	while(1) 
    { 
    	test=30; 
		while(test>0) 
    	//while(test-->0) 
    	{ 
    		//IOPIN=IOPIN^0x00800000; 
			 
			IOSET=0x00100000; 
			SSPDR=0x55; 
			SSPDR=0xaa; 
			SSPDR=0x55; 
			SSPDR=0xaa; 
			SSPDR=0x55; 
			SSPDR=0xaa; 
			SSPDR=0x55; 
			SSPDR=0x55; 
			SSPDR=0xaa; 
			SSPDR=0xaa; 
			IOCLR=0x00100000; 
			 
			 
			if ((S0PSR&0x80)==0x80) 
			test=S0PDR; 
			 
			//S0PSR&=0x7f; 
			S0PDR=0x55; 
			while ((S0PSR&0x80)==0x00) 
			//S0PSR&=0x7f;			 
			test=S0PDR; 
			S0PDR=test; 
			 
			/* 
			if ((IO1PIN&0x00010000)>0) 
				IOSET=0x00800000; 
			else 
				IOCLR=0x00800000; 
			*/	 
		 
			//IO1PIN=IO1PIN^0x03FF0000; 
			 
			//UARTSend(UART0Buffer,4); 
			//CapDataTest(); 
		    //test=ADC_Test(); 
	    	 
	    	 
		    /* 
		    UART0Buffer[0]=test>>24; 
			UART0Buffer[1]=test>>16; 
			UART0Buffer[2]=test>>8; 
			UART0Buffer[3]=test&0xff; 
			*/ 
	    	UARTSend(UART0Buffer,4); 
	     
	     
		    //DAC_Test(); 
		    loop=1000000; 
			while (loop-->0) 
			{ 
				IOPIN=IOPIN^0x00000C84; 
			} 
			SendDataTest();     
	    	 
	     
		} 
   		 
   		AD0CR = 0<<21;		//关闭AD 
		//PCONP = 0x00;		//关闭定时器、RTC、UART等功能部件 
		 
		 
		EXTWAKE=0X0001; 
		//VICIntEnable=1<<14; 
		//PCON = 0x06; 
	 
		/* 
		powerdown=1; 
		while(powerdown==1) 
    	{ 
    	} 
    	*/ 
    	//VICIntEnClr=1<<14; 
		 
	 
	} 
	return 0; 
} 
 
void SendDataTest(void) 
{ 
	uint32 loop,num,flag; 
	T0TC=0; 
	//T0MCR=0x00000003; 
	//T0MR0=165888; 
	//T0IR=0x01; 
	//T0EMR=0x0031; 
	T0MCR=0x000000c0; 
	T0MR2=165888; 
	T0IR=0x04; 
	T0EMR=0x0304; 
	 
	flag=0; 
	loop=1000000; 
	num=0; 
	while (loop-->0) 
	{ 
		if ((T0IR&0x04)>0) 
		{ 
			flag^=0x1; 
			if (flag==0x01) 
			{ 
				T0MR2=691; 
				if (num==10) 
				{ 
					T0EMR=0x0104; 
				} 
			} 
			else	 
			{ 
				T0MR2=sendbit[num]; 
				num++; 
			} 
			T0IR=0x04; 
		} 
		if (num==10) 
		{ 
			if (T0MR2>100000)			//换其他条件可控制匹配提前结束 
				T0MR2=100000; 
		}	 
	} 
} 
 
void CapDataTest(void) 
{ 
	uint32 loop,num,delta,flag; 
	uint32 numrecord[8]; 
	 
	T0TC=0; 
	T0MCR=0x00000000; 
	T0IR=0x91; 
	T0CCR=0x0e07;				//双沿 
	//T0CCR=0x0a05;				//上升沿 
	//T0CCR=0x0c06;				//下降沿 
	loop=1000000; 
	flag=0; 
	while (loop-->0) 
	{ 
		IOPIN=IOPIN^0x00200000; 
		 
		 
		 
		if ((T0IR&0x90)>0) 
		{ 
			T0IR|=0x90; 
			delta=T0CR3-num; 
			num=T0CR3; 
			numrecord[flag]=delta; 
			flag++; 
		} 
		if (flag>1) 
		{  
			flag=0; 
			UART0Buffer[0]=numrecord[1]>>8; 
			UART0Buffer[1]=numrecord[1]&0xff; 
			UARTSend(UART0Buffer,2); 
		}	 
	}		 
} 
 
void DAC_Test(void) 
{ 
	uint32 loop,test; 
	loop=1023; 
	while (loop-->0) 
	{ 
		test=0x200; 
		IOSET=0x00200000; 
		DACR=(test<<6)|0x00010000; 
		test=100; 
		while (test-->0) 
		{ 
		} 
		IOCLR=0x00200000; 
		test=0x000; 
		DACR=0x00010000; 
		test=100; 
		while (test-->0) 
		{ 
		} 
	} 
}