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

📄 main1.c

📁 LPC2146 的USB 开发
💻 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)
		{
		}
	}
}	
		

⌨️ 快捷键说明

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