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

📄 target0919.cpp

📁 采用LPC的芯片做的气体排放检测,包括气体成分分析,数据的处理,数据传输给工作站.
💻 CPP
字号:
#define IN_TARGET
#include "config.h"
#define		PLL_TIMES	1
volatile unsigned int	SysTime;
unsigned int	StartTime;
U8	Data373_2;

volatile unsigned int	UART0RxdCount;
volatile unsigned int	UART1RxdCount;

volatile unsigned char UART0_RxdBuf[UART0_MAX_LENGTH];
volatile unsigned char UART1_RxdBuf[UART1_MAX_LENGTH];

volatile unsigned char g_ucRecFlag;
U8 TimeBuf[8];
//extern	unsigned char		g_ucMachineAddr;
#define 	CPU_Idle(); 
void	InitVariable(void)
{
	SysTime 		= 0;
	StartTime		= 0;
	UART0RxdCount 	= 0;
	UART1RxdCount 	= 0;
	g_ucRecFlag 	= 0;
}	
void MemSet(unsigned char* Buf,unsigned char ucData,unsigned int nLen)
{
	unsigned int ni;
	for(ni=0;ni<nLen;ni++)
		Buf[ni]=ucData;
}
void memcpy(unsigned char* destBuf,unsigned char* srcBuf,unsigned int nLen)
{
	unsigned int ni;
	for(ni=0;ni<nLen;ni++)
		destBuf[ni]=srcBuf[ni];
}
void	SendBlock(unsigned char ucWitchUART, unsigned char const *pByte,unsigned char nLen)
{
	if(ucWitchUART == 2)
		LPC21F_UART_SendBlock(LPC21_UART1_BASE,pByte,nLen);
	else if(ucWitchUART == 1)
		LPC21F_UART_SendBlock(LPC21_UART0_BASE,pByte,nLen);
}
/*********************************************************************************************************
** 函数名称: IRQ_UART0_RecServ(void)	与上位机通讯
** 功能描述: UART0中断处理程序,将收到数据放到全局缓冲区,缓冲区指针加1,
**			 先清零g_ucRecFlag,前台程序空闲就查询g_ucRecFlag。为 1 时,延时100ms,
**			 再清零g_ucRecFlag 和缓冲区指针,就可以进行 PCCmd 处理。
********************************************************************************************************/
void __irq IRQ_UART0_RecServ(void)
{
	unsigned int stat,tmp;
	stat = (U0IIR & 0x0e)>>1;
	if(0x02 == stat){
		tmp = U0RBR;
		g_ucRecFlag=1;
		if(UART0RxdCount < UART0_MAX_LENGTH)
		{
			UART0_RxdBuf[UART0RxdCount++] = tmp;
		}
	}
	VICVectAddr = 0;	// 通知VIC中断处理结束
}
unsigned int IsUART0RecData(void)
{
	return (unsigned int)g_ucRecFlag;
}
unsigned int GetUART0BufLen(void)
{
	return UART0RxdCount;
}
void	ClearUART0Buf(void)
{
	unsigned int nTemp;
	unsigned char i;
	for(nTemp=0;nTemp<16;nTemp++)
		i=U0RBR;
	for(nTemp=0;nTemp<UART0_MAX_LENGTH;nTemp++)	
		UART0_RxdBuf[nTemp]=0;
	UART0RxdCount = 0;
	g_ucRecFlag=0;
}	
void	StoreHostData(unsigned char* pReadByte,unsigned int nBufLen)
{
	unsigned int ni;
	for(ni=0;ni<nBufLen;ni++)
		pReadByte[ni]=UART0_RxdBuf[ni];
}
/*********************************************************************************************************
** 函数名称: IRQ_UART1_RecServ(void)	与仪器通讯
** 功能描述: UART1中断处理程序,将收到数据放到全局缓冲区,缓冲区指针加1,
**			总是主动的。知道大约什么时候有数据到达。	所以只在这段时间开中断,流程如下:
**			1. 发送命令给仪器,
**			2. 开 UART1 中断,根据不同的命令做不同的延时,
**			2. 关 UART1 中断,就可以进行  处理。
********************************************************************************************************/
void __irq IRQ_UART1_RecServ(void)
{
	unsigned int stat,tmp;
	stat = (U1IIR & 0x0e)>>1;
	if(0x02 == stat){
		tmp = U1RBR;
		if(UART1RxdCount < UART1_MAX_LENGTH)
		{
			UART1_RxdBuf[UART1RxdCount++] = tmp;
		}
	}
	VICVectAddr = 0;	// 通知VIC中断处理结束
}
unsigned int GetUART1BufLen(void)
{
	return UART1RxdCount;
}
void	ClearUART1Buf(void)
{
	unsigned int nTemp,i;
	for(nTemp=0;nTemp<16;nTemp++)
		i=U1RBR;
	for(nTemp=0;nTemp<UART1_MAX_LENGTH;nTemp++)	
		UART1_RxdBuf[nTemp]=0;
	UART1RxdCount = 0;
}	
void	StoreDevData(unsigned char* pReadData,unsigned char ReadBufLen)
{
	unsigned char	ucTemp;
	for(ucTemp=0;ucTemp<ReadBufLen;ucTemp++)
		pReadData[ucTemp]=UART1_RxdBuf[ucTemp];
}
void	HappyLED(U8 stat)
{
	if(stat)
	 	Data373_2 &= ~0x10;
	 else
	 	Data373_2 |= 0x10;
	 Write373_2(Data373_2);
}
U8 light;
void Timer0_Handler(void)
{
	SysTime++;
	if(SysTime%500 == 0){
		if(light==0){
			light = 1;
		}else{
			light = 0;
			TimeBuf[0]++;
			if(TimeBuf[0]>=60)
			{//秒
				TimeBuf[0]=0;
				TimeBuf[1]++;
				if(TimeBuf[1]>=60)
				{//分
					TimeBuf[1]=0;
					TimeBuf[2]++;				
				}
			}
		}
    }
	HappyLED(light);
	T0IR = 0x01;	    		// 清除中断标志// 不需要通知VIC中断处理结束				            
	VICVectAddr = 0;	// 通知VIC中断处理结束
}
 unsigned int GetSysTimeTick(void)//__inline
{
	return SysTime;
}
void	ResetClock(void)
{
	StartTime = GetSysTimeTick();
}
unsigned int	IsTimeOut(unsigned int nDelayTime)
{
	if((SysTime - StartTime) >= nDelayTime)		return 1;
	else	return 0;
}
void Sleep(unsigned int	nDelayTime)
{//功能:以毫秒为单位,延时
	unsigned int nStartTime,i;//,nElapsTime;
	nStartTime = SysTime;// GetSysTimeTick();
//	ResetClock();
	for(;;)
	{
		if((SysTime-nStartTime) >= nDelayTime) break;
		for(i=0;i<100;i++);
//		if(IsTimeOut(nDelayTime)) break;
		CPU_Idle();
	}		
}

unsigned int FFPortGetRxBufDataLen(U8	ucWitchUart)
{
	if(ucWitchUart == 1)
		return UART0RxdCount;
	else if(ucWitchUart == 2)
		return UART1RxdCount;
	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]=UART0_RxdBuf[i];
	}
	else if(ucWitchUART == 2)
	{
		for(i=0;i<nLen;i++)
		pByte[i]=UART1_RxdBuf[i];
	}
}
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;
		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;
		UART1RxdCount = 0;	
	}
	/*
	if(ucWitchUART == 3)
	{
		while(US2_getchar() != -1);
		UART2RxdCount = 0;
	}
	*/
}
void TargetResetInit(void)
{
	MEMMAP = 1;					// User RAM mode, Interrupt in SRAM, 1 = FLASH mode
#if		PLL_TIMES  ==	1
	PLLCON = 0;
	VPBDIV = 1;					// pclk =  cclk
	// 设置存储器加速模块
	MAMCR = 0;
	MAMTIM = 1;					// 主频 < 20M
	MAMCR = 2;
#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 TargetInit(void)
{
//	unsigned int nBaudRate=9600;
	//--- 0.初始化 IO 口。
	TargetResetInit();
	PINSEL0 = 0;
	PINSEL1 = 0;

//	ReadBaudAndAddress(&nBaudRate,&g_ucMachineAddr);//从拨码开关读取相关内容
	//g_ucMachineAddr = 1;	//不要拨码开关
	//--- 1.配置定时器0,并设置定时器 0 为 FIQ中断 ---// 
	VICIntSelect = 0x10;					// 设置定时器0中断FIQ,其它中断通道设置为IRQ中断
	//VICVectCntl0 = 0x24;	// TIMER0中断通道分配第二高优先级(向量控制器1)
	//VICVectAddr0 = (uint32)Timer0_Handler; 	// 设置中断服务程序地址向量
	T0IR = 0xFF;
	T0CTCR = 0;
	T0PC = T0PR = 0;
	T0MR0 = 11059;
	T0MCR = 3;
	T0TCR = 3;
	T0TCR = 1;

/*   		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 ---//
    //LPC21F_Cfg_PIOForUART(0);//IO口的第二功能设置为串口
    //LPC21F_Cfg_PIOForUART(1);//
   	PINSEL0 = PIN0_1_USED_UART0_OR|PIN8_9_USED_UART1_OR;
   	PINSEL1 = 0;
   	PINSEL2 = 0;
    LPC21F_UART_SetBaudRate(LPC21_UART0_BASE,	//操作对象是UART0,
    						19200,				//波特率nBaudRate
    						UART_CHRL_8_BIT);	//帧模式:1+8+1
    LPC21F_UART_SetBaudRate(LPC21_UART1_BASE,
    						19200,				//FTY100为9600
    						UART_CHRL_8_BIT);//UART_STOP_2_BIT|UART_PARE_SPACE);
    //U1LCR |= 0x04;
    //U1LCR &= 0xF7;
    
	//--- 3.串口UART0中断设置,禁止FIFO ,设置中断通道---//
	U0FCR = 0x07;	//允许FIFO,一个字节触发
	U0IER = 0x01;	//使能接收中断
	VICVectCntl1 = 0x26;	// 串口UART0中断通道分配最高优先级(向量控制器0)
	VICVectAddr1 = (uint32)IRQ_UART0_RecServ; 	// 设置中断服务程序地址向量 
	//--- 4.串口UART1中断设置,禁止FIFO ,设置中断通道---//
	U1FCR = 0x07;	//允许FIFO,一个字节触发x07
	U1IER = 0x01;	//使能接收中断	
	VICVectCntl2 = 0x27;	// 串口UART1中断通道分配第二高优先级(向量控制器1)
	VICVectAddr2 = (uint32)IRQ_UART1_RecServ; 	// 设置中断服务程序地址向量 
	//--- 5.清除缓冲区,复位缓冲区指针。 ---//
	InitVariable();
	ClearUART0Buf();
	ClearUART1Buf();
	//--- 6.使能三个中断 ---//	LPC21F_VIC_DisableIt
	LPC21F_VIC_EnableIt(VIC_SELECT_UART1|VIC_SELECT_UART0|VIC_SELECT_T0);
}

⌨️ 快捷键说明

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