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

📄 target.cpp

📁 采用LPC的芯片做的气体排放检测,包括气体成分分析,数据的处理,数据传输给工作站.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
					Set_US2_TX();
//					SET_US2_TX;
				else
					Clr_US2_TX();
//					CLR_US2_TX;
				US2t_byte>>=1;
				US2t_count=3;
				US2t_stat++;
			}
		}else										// 停止位有效时间
			if(--US2t_count==0)
				US2t_stat=0;
	}
}

void US2_init(U32 baudrate)				// baudrate<=9600
{
	US2_tmp=US2_div=9600/baudrate;
	US2r_w=US2t_w=1;
	US2r_r=US2t_r=US2r_stat=US2t_stat=0;
	US2_enable=1;
}

void US2_control(U32 stat)
{
	US2_enable=stat;
}

int US2_getchar(void)						// 从UART输入缓冲区读数据,空则返回-1
{
	U32 tmp;
	tmp=US2r_r+1;
	if(tmp>=US2RBUF_LEN)
		tmp=0;
	if(tmp!=US2r_w){
		US2r_r=tmp;
		return (US2_rbuf[tmp]&0xFF);
	}else
		return -1;
}

void US2_putchar(const U8 ch)						// 向UART输出缓冲区写数据,若满则等待
{
	while(US2t_r==US2t_w);					// 发送缓冲区满则等待
	US2_tbuf[US2t_w++]=ch;
	if(US2t_w>=US2TBUF_LEN)					// 缓冲区回绕
		US2t_w=0;
}


/*=====================================**
**
**
**=====================================*/

REG8  US3_rbuf[US3RBUF_LEN], US3_tbuf[US3TBUF_LEN];
REG32 US3r_r, US3r_w, US3t_r, US3t_w;
REG32 US3r_stat, US3r_byte, US3r_count, US3t_stat, US3t_byte, US3t_count, US3_div, US3_tmp, US3_enable;
/*
extern void Set_US2_TX(void);
extern void Clr_US2_TX(void);
extern U32  Tst_US2_RX(void);*/
#define		Set_US3_TX()	(IOSET = TXD3)
#define		Clr_US3_TX()	(IOCLR = TXD3)
#define		Tst_US3_RX()	(IOPIN0&RXD3)
void US3_interrupt(void)					// UART2软件串口中断处理程序(17.361us)
{
	U32 tmp;
	if(US3_enable&&(--US3_tmp==0)){
		US3_tmp=US3_div;
		if(US3r_stat==0){						// US2输入处理,空闲状态
			if(Tst_US3_RX()==0){				// 输入低电平
				US3r_count=4;					// 第一次延时1.3T
				US3r_stat=1;
				US3r_byte=0;
			}
		}else if(US3r_stat<9){				// 8位数据位
			if(--US3r_count==0){
				US3r_byte>>=1;
				if(Tst_US3_RX())
					US3r_byte|=0x100;
				US3r_count=3;					// 以后每次延时1T
				US3r_stat++;
			}
		}else if(US3r_stat==9){				// 1位停止位
			if(--US3r_count==0){
				if(Tst_US3_RX()){				// 停止位有效
					US3r_stat=0;				// 重新允许接收
					if(US3r_r!=US3r_w){		// 缓冲区未满
						US3_rbuf[US3r_w]=(US3r_byte>>1);
						//if(UART2RxdCount<UART2_MAX_LENGTH)	UART2_RxdBuf[UART2RxdCount++]=US2_rbuf[US2r_w];
						UART3RxdCount++;
						US3r_w++; 
						if(US3r_w>=US3RBUF_LEN)	// 缓冲区回绕
							US3r_w=0;
					}
				}else
					US3r_stat=10;
			}
		}else
//			if(TST_US2_RX)						// 若停止位无效则必须等待高电平才能开始下一个字节的接收
			if(Tst_US3_RX())					// 若停止位无效则必须等待高电平才能开始下一个字节的接收
				US3r_stat=0;
		if(US3t_stat==0){						// US2输出处理,空闲状态
			tmp=US3t_r+1;
			if(tmp>=US3TBUF_LEN)
				tmp=0;
			if(tmp!=US3t_w){
				US3t_r=tmp;
				US3t_byte=(US3_tbuf[tmp]|0x100);		// 停止位为1
				US3t_stat=1;
				US3t_count=3;
				Clr_US3_TX();
//				CLR_US2_TX;						// 开始位为0
			}
		}else if(US3t_stat<10){				// 加上停止位共9位数据
			if(--US3t_count==0){
				if(US3t_byte&1)
					Set_US3_TX();
//					SET_US2_TX;
				else
					Clr_US3_TX();
//					CLR_US2_TX;
				US3t_byte>>=1;
				US3t_count=3;
				US3t_stat++;
			}
		}else										// 停止位有效时间
			if(--US3t_count==0)
				US3t_stat=0;
	}
}

void US3_init(U32 baudrate)				// baudrate<=9600
{
	US3_tmp=US3_div=9600/baudrate;
	US3r_w=US3t_w=1;
	US3r_r=US3t_r=US3r_stat=US3t_stat=0;
	US3_enable=1;
}

void US3_control(U32 stat)
{
	US3_enable=stat;
}

int US3_getchar(void)						// 从UART输入缓冲区读数据,空则返回-1
{
	U32 tmp;
	tmp=US3r_r+1;
	if(tmp>=US3RBUF_LEN)
		tmp=0;
	if(tmp!=US3r_w){
		US3r_r=tmp;
		return (US3_rbuf[tmp]&0xFF);
	}else
		return -1;
}

void US3_putchar(const U8 ch)						// 向UART输出缓冲区写数据,若满则等待
{
	while(US3t_r==US3t_w);					// 发送缓冲区满则等待
	US3_tbuf[US3t_w++]=ch;
	if(US3t_w>=US3TBUF_LEN)					// 缓冲区回绕
		US3t_w=0;
}

unsigned int FFPortGetRxBufDataLen(U8	ucWitchUart)
{
	
	if(ucWitchUart ==1)
		return UART0RxdCount;
	else if(ucWitchUart == 2)
		return UART1RxdCount;
	else if(ucWitchUart == 3)
		return UART2RxdCount;	
	if(ucWitchUart == 4)
		return UART3RxdCount;
	else	
		return	0;
}
void	FFPortReadData(U8 ucWitchUART,U8* pByte,int nLen)
{
	int i;
	i = 0;
	if(ucWitchUART == 1){
		for(i=0;i<nLen;i++)		pByte[i]=(U8)US0_getchar();
			//pByte[i]=UART0_RxdBuf[i];
	}else if(ucWitchUART == 2){
		for(i=0;i<nLen;i++)		pByte[i]=(U8)US1_getchar();
			//pByte[i]=UART1_RxdBuf[i];
	}else if(ucWitchUART == 3){
		//while(nLen--){	*(pByte+i)=(U8)UART2_RxdBuf[i];		i++;}
		for(i=0;i<nLen;i++)		pByte[i]=(U8)US2_getchar();
	}else if(ucWitchUART == 4){
		//while(nLen--){	*(pByte+i)=(U8)UART2_RxdBuf[i];		i++;}
		for(i=0;i<nLen;i++)		pByte[i]=(U8)US3_getchar();
	}
	
}
void	FFPortClearRxBuf(U8 ucWitchUART)
{
	unsigned int nTemp,i;
	if(ucWitchUART == 1)
	{
		for(nTemp=0;nTemp<16;nTemp++)	i = U0RBR;		
		//for(nTemp=0;nTemp<UART0_MAX_LENGTH;nTemp++)	UART0_RxdBuf[nTemp]=0;		
		while(US0_getchar() != -1);
		UART0RxdCount = 0;
	}else if(ucWitchUART == 2){
		for(nTemp=0;nTemp<16;nTemp++)	i = U1RBR;		
		//for(nTemp=0;nTemp<UART1_MAX_LENGTH;nTemp++)	UART1_RxdBuf[nTemp]=0;		
		while(US1_getchar() != -1);
		UART1RxdCount = 0;	
	}else if(ucWitchUART == 3)	{
		while(US2_getchar() != -1);
		UART2RxdCount = 0;
	}else if(ucWitchUART == 4)	{
		while(US3_getchar() != -1);
		UART3RxdCount = 0;
		}
}
void	SendBlock(unsigned char ucWitchUART, unsigned char const *pByte,unsigned char nLen)
{
	U8	i;
	switch(ucWitchUART )
	{
	case 1:		//LPC21F_UART_SendBlock(LPC21_UART0_BASE,pByte,nLen);
		for(i=0;i<nLen;i++)
			US0_putchar(pByte[i]);
		break;
	case 2:		//LPC21F_UART_SendBlock(LPC21_UART0_BASE,pByte,nLen);
		for(i=0;i<nLen;i++)
			US1_putchar(pByte[i]);
		break;
	case 3:		//LPC21F_UART_SendBlock(LPC21_UART1_BASE,pByte,nLen);
		for(i=0;i<nLen;i++)
			US2_putchar(pByte[i]);
		break;
	case 4:
		for(i=0;i<nLen;i++)
			US3_putchar(pByte[i]);
	default:break;
	}	
}
void TargetResetInit(void)
{
	MEMMAP = 1;					// User RAM mode, Interrupt in SRAM, 1 = FLASH mode
#if		PLL_TIMES  ==	1
	PLLCON = 0;
	VPBDIV = 1;					// pclk = 1/4 cclk
	// 设置存储器加速模块
	MAMCR = 0;
	MAMTIM = 1;					// 主频 < 20M
	MAMCR = 0;
#endif
#if		PLL_TIMES ==	4	
	PLLCON = 1;
	VPBDIV = 0;					// pclk = 1/4 cclk
	PLLCFG = 3 | (3<<5);		// 11.0592 * 4
	PLLFEED = 0xaa;
	PLLFEED = 0x55;
	while((PLLSTAT & (1 << 10)) == 0);
	PLLCON = 3;
	PLLFEED = 0xaa;
	PLLFEED = 0x55;
	// 设置存储器加速模块
	MAMCR = 0;
	MAMTIM = 3;					// 主频超过40M
	MAMCR = 2;
#endif
	// 初始化VIC
	VICIntEnClr = 0xffffffff;
	VICVectAddr = 0;
	VICIntSelect = 0;
}

void	CfgUART0(U32 nBaudrate)
{
	U32	mode;
	mode = UART_CHRL_8_BIT;
    LPC21F_VIC_DisableIt(VIC_SELECT_UART0);
    if(g_ucProtocol	== PROTOCOL_FOFEN_MULTI){
    	mode |= UART_STOP_2_BIT;
    }
    LPC21F_UART_SetBaudRate(LPC21_UART0_BASE,nBaudrate,mode);
	U0FCR = 0x07;	//允许FIFO,一个字节触发
	U0IER = 0x03;	//使能接收中断
	VICVectCntl1 = 0x26;	// 串口UART0中断通道分配最高优先级(向量控制器0)
	VICVectAddr1 = (U32)US0_interrupt; 	// 设置中断服务程序地址向量 
    LPC21F_VIC_EnableIt(VIC_SELECT_UART0);
}
void	InitVariable(void)
{
	SysTime 		= 0;
	StartTime		= 0;
	UART0RxdCount 	= 0;
	UART1RxdCount 	= 0;
	UART2RxdCount 	= 0;
	Timer_count		= 0;
	bPumpCtrl = 0;
	
	US1r_w=US1t_w=1;
	US1r_r=US1t_r=0;
	
	US0r_w=US0t_w=1;
	US0r_r=US0t_r=0;
	
	key_Stat	= 0;
	key_Continue= 0;
	key_Current	= 0;
	key_Last	= 0;
	key_Value	= 0;
}

void TargetInit(void)
{
//	unsigned int nBaudRate=9600;
	//--- 0.初始化 IO 口。
	TargetResetInit();
	PINSEL0 = 0;
	PINSEL1 = 0;
	PINSEL1 = ((1<<22)|(1<<24)|(1<<26)|(1<<28)|(1<<18));
	//IODIR0 = LEDCON;				// 设置LED4控制口为输出
	

//	ReadBaudAndAddress(&nBaudRate,&g_ucMachineAddr);//从拨码开关读取相关内容
	//g_ucMachineAddr = 1;	//不要拨码开关
	//--- 1.配置定时器0,并设置定时器 0 为 FIQ中断 ---// 
/*	VICIntSelect = 0;	// 设置定时器0中断FIQ,其它中断通道设置为IRQ中断
	VICVectCntl0 = 0x24;	// TIMER0中断通道分配第二高优先级(向量控制器1)
	VICVectAddr0 = (uint32)Timer0_Handler; 	// 设置中断服务程序地址向量
*/	
	T0CTCR = 0;
    T0PR = 0;
	T0MR0 = 192*2;
	T0MCR = 3;
	T0TCR = 3;
	T0TCR = 1;
	VICIntEnable = VIC_SELECT_T0;			// 允许TIMER0中断
	VICIntSelect = 0x10;					// 设置定时器0中断FIQ,其它中断通道设置为IRQ中断
	
	T1CTCR = 0;
    T1PR = 0;
	T1MR0 = 192*58;
	T1MCR = 3;
	T1TCR = 3;
	T1TCR = 1;
	VICVectCntl0=0x25;
	VICVectAddr0=(U32)timer1_interrupt;

/*   		LPC21F_TIMER_CfgMatch(LPC21_T0_BASE,0,
   					TIMER_RESET_WHEN_MATCH | TIMER_INT_WHEN_MATCH,
   					1,11059);
   			LPC21F_TIMER_ResetStart(LPC21_T0_BASE,TIMER_COUNT_START | TIMER_COUNT_RESET);
*/	
	//--- 2.初始化串口,UART0,UART1,UART2 ---//
    //LPC21F_Cfg_PIOForUART(0);//IO口的第二功能设置为串口
    //LPC21F_Cfg_PIOForUART(1);//			 // 设置P0.5连接到AIN0.7,P0.15连接到AIN1.5
   	PINSEL0 = PIN0_1_USED_UART0_OR|PIN8_9_USED_UART1_OR;
   //PINSEL1 = 0;
   	//PINSEL2 = 0;
    LPC21F_UART_SetBaudRate(LPC21_UART1_BASE,	//操作对象是UART0,
    						19200,				//波特率nBaudRate
    						UART_CHRL_8_BIT);	//帧模式:1+8+1
    //LPC21F_UART_SetBaudRate(LPC21_UART0_BASE,19200,UART_CHRL_8_BIT);//UART_STOP_2_BIT|UART_PARE_SPACE);
    	
	US2_init(2400);
	US2_control(1);
	US3_init(2400);
	US3_control(1);
	IODIR0=0;
	IODIR0|=(1<<10);
	IODIR0|=(1<<12);
	IODIR0|=(1<<14);
	IODIR0|=(1<<15);
	IODIR0|=(1<<17);
	IODIR0|=(1<<18);
	IODIR0|=(1<<2);
	//
	//IODIR0|=(1<<4)|(1<<19)|(1<<20)|(1<<21)|(1<<22)|(1<<23)|(1<<26)|(1<<31);
	
	
    //U1LCR |= 0x04;
    //U1LCR &= 0xF7;
    
	//--- 3.串口UART0中断设置,禁止FIFO ,设置中断通道---//
		//U0FCR = 0x07;	//允许FIFO,一个字节触发
		//U0IER = 0x01;	//使能接收中断
		//VICVectCntl1 = 0x26;	// 串口UART0中断通道分配最高优先级(向量控制器0)
		//VICVectAddr1 = (U32)IRQ_UART0_RecServ; 	// 设置中断服务程序地址向量 
	//--- 4.串口UART1中断设置,禁止FIFO ,设置中断通道---//
	U1FCR = 0x07;	//允许FIFO,一个字节触发x07
	U1IER = 0x03;	//使能接收中断	
	VICVectCntl2 = 0x27;	// 串口UART1中断通道分配第二高优先级(向量控制器1)
	VICVectAddr2 = (U32)US1_interrupt; 	// 设置中断服务程序地址向量 
	//--- 5.清除缓冲区,复位缓冲区指针。 ---//
	InitVariable();
	CfgUART0(9600);
	
 	
		
	//ClearUART0Buf();
	//ClearUART1Buf();
	//--- 6.初始化AD寄存器---//
	
	AD0CR =                                //(1 << 7)				    |		// SEL = 0b1000 0000 ,选择通道7
		((Fpclk / 1000000 - 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);							// EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)
	/*AD1CR = (1 << 5)				|		// SEL = 0b1000 0000 ,选择通道7
		((Fpclk / 1000000 - 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);*/						// EDGE = 0 (CAP/MAT引脚下降沿触发ADC转换)

	//--- 7.使能三个中断 ---//	
	LPC21F_VIC_EnableIt(VIC_SELECT_UART1|VIC_SELECT_UART0|VIC_SELECT_T0|VIC_SELECT_T1);
}

⌨️ 快捷键说明

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