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

📄 main_1205.c

📁 Linux的实时性如何得到改观
💻 C
字号:

#include "RS232.h"
#include "KeyPad.h"
#include "LCD.h"

#include "44b.h"

//////////////////////////////////
void Test_LowPwr(void)
{
	//Mode_LowPwr();
}

/////////////////////////////////
void Test_RS232(void)
{
	int Msg = 32;
	
	RS232_open(115200l,COM_8BIT|COM_NOPARITY|STOP_1BIT);
	
	while( Msg < 128 )
	{		
		RS232_send_char( Msg );		
		Msg++;	
	}	
}


#define RX_FRAME_START	0x00
#define RX_FRAME_LENGTH	0xF1
#define RX_FRAME_DATA	0xF2
#define RX_FRAME_CRC	0xF3
#define RX_FRAME_END	0xF4
#define RX_FRAME_OK		0xF5

#define RX_BUF_NULL		0x00
#define RX_BUF_OK		0xB1
#define RX_BUF_READING	0xB2

#define COM_TIMER_MAX	3000

struct RS232_STRUCT{
	unsigned char 	Active;
	unsigned char 	State;
	unsigned char 	BufState;
	unsigned int 	Timer;			
	unsigned int 	Position;
	unsigned char 	TmpBuf[16];
	unsigned char 	Msg[2048];
	unsigned char 	Data[2048];
};

struct RS232_STRUCT RS232_inf; 

unsigned char RS232_FrameBuf[2048];

volatile unsigned int RS232_Timer;
volatile unsigned int RS232_Count;

void RS232_RxScan(unsigned char Count)
{
	unsigned int i,length;
	
	if(Count > 16){
		RS232_inf.State = RX_FRAME_START;
		return;
	}
	
	//RS232_send_char(0xAA);	//----For test
	//RS232_send_char(0x55);
	//for(i=0;i<Count;i++)	RS232_send_char( RS232_inf.TmpBuf[i] );

	i = 0;	
	while( Count > i )
	{			
		switch( RS232_inf.State )
		{
			//---------------------
			case	RX_FRAME_START:
			{
				for( ; i<Count; i++)
				{
					if( RS232_inf.TmpBuf[i]	== 0x7E){
						RS232_inf.Msg[0]  	= 0x7E;
						RS232_inf.Position 	= 1;
						RS232_inf.State 	= RX_FRAME_LENGTH;
						i++;
						break; 
					}
				}
				
				break;
			}
			//---------------------				
			case	RX_FRAME_LENGTH:
			{
				if( RS232_inf.Position == 1 ){
					
					if( RS232_inf.TmpBuf[i] == 0x4B){
						if( RS232_inf.BufState != RX_BUF_READING ){
							RS232_inf.Data[0] 	= 0x7E;
							RS232_inf.Data[1] 	= 0x4B;
							RS232_inf.BufState  = RX_BUF_OK;
						}
						RS232_inf.State = RX_FRAME_START;	
						i = Count + 1;											
					}else{
						RS232_inf.Msg[1]  	= RS232_inf.TmpBuf[i];
						RS232_inf.Position 	= 2;
						i++;						
					}
					
				}else if( RS232_inf.Position == 2 ){
									
					RS232_inf.Msg[2] = RS232_inf.TmpBuf[i];
					
					if( ( ((unsigned int)(RS232_inf.Msg[1])<<8)+RS232_inf.Msg[2])<2040 ){						
						RS232_inf.State = RX_FRAME_DATA;
						RS232_inf.Position 	= 3;
						i++;
						//RS232_send_char(0xaa);	//For test
					}else{
						RS232_inf.State = RX_FRAME_START;						
					}
										
				}else{
					RS232_inf.State = RX_FRAME_START;
				}
				
				break;
			}
			//---------------------			
			case	RX_FRAME_DATA:
			{
				length = ((unsigned int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2];
				
				for( ; i<Count; )
				{							
					if( (RS232_inf.Position-3) < length ){
						RS232_inf.Msg[RS232_inf.Position] = RS232_inf.TmpBuf[i];
						RS232_inf.Position += 1;
						i++;
					}else{
						RS232_inf.State 	= RX_FRAME_CRC;
						//RS232_send_char(0xbb);	//For test
						//RS232_send_char( (RS232_inf.Position)>>8 );
						//RS232_send_char( i );
						//RS232_send_char( RS232_inf.Position );
						//RS232_send_char( length );
						break;					
					}
				}
				
				break;
			}
			//---------------------			
			case	RX_FRAME_CRC:
			{
				if( RS232_inf.Position  == ( ((int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2] +3) ){
					RS232_inf.Msg[RS232_inf.Position] = RS232_inf.TmpBuf[i];
					RS232_inf.Position  += 1;
					i++;
					//RS232_send_char( (RS232_inf.Position)>>8 );	//For test
					//RS232_send_char( RS232_inf.Position );
					//RS232_send_char(0xc1);	//For test										
				}else if( RS232_inf.Position == ( ((int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2] +4) ){
					RS232_inf.Msg[RS232_inf.Position] = RS232_inf.TmpBuf[i];
					RS232_inf.Position  += 1;
					RS232_inf.State 	= RX_FRAME_END;	
					i++;
					//RS232_send_char(0xcc);	//For test
					//RS232_send_char( i );
					//RS232_send_char( RS232_inf.TmpBuf[i] );								
				}else{
					RS232_inf.State 	= RX_FRAME_START;
					//RS232_send_char(0xc0);	//For test					
				}
				
				break;
			}
			//---------------------			
			case	RX_FRAME_END:
			{
				if( RS232_inf.Position  == ( ((int)(RS232_inf.Msg[1])<<8) + RS232_inf.Msg[2] +5) )
				{
					if(RS232_inf.TmpBuf[i] 	== 0x7E){						
						RS232_inf.Msg[ RS232_inf.Position ] = 0x7E;
						
						if( RS232_inf.BufState != RX_BUF_READING ){
							for( i=0; i<=RS232_inf.Position; i++)
								RS232_inf.Data[i] = RS232_inf.Msg[i];
							
							RS232_inf.BufState = RX_BUF_OK;							
							//RS232_send_char(0xee);	//For test
						}						
						
						RS232_inf.State = RX_FRAME_START;
						i = Count + 1;	//----To Exit,
										//since every frame is tragged by 'PC';	
						//RS232_send_char(0xdd);	//For test
						
					}else{
						RS232_inf.State = RX_FRAME_START;				
					}
					
				}else{
					RS232_inf.State = RX_FRAME_START;
				}				
				i++;
				
				break;
			}		
			//-------------------
			default:
			{
				RS232_inf.State   	= RX_FRAME_START;
				i = Count + 1;	//----To Exit;
				break;
			}
		}
	}

}

void __irq ISR_RS232_Rx(void)
{
	unsigned char i;
	
    rI_ISPC = BIT_URXD1;

	if(rUFSTAT1 & 0xf){
		
		RS232_Timer = 0;
		i = 0;
		
	    while( (rUFSTAT1&0xf) >0 )
	    {
			RS232_inf.TmpBuf[ i++ ] = rURXH1;
			if(i >= 15){	break;}
	    }
	    
	    RS232_RxScan(i);	    
	}

}

//=============================
int RS232_init(unsigned int baud, unsigned int mode)
{
	rCLKCON	|= (1<<9);
	rPCONC	|= 0x0f000000;
	rPDATC	|= 0x4000;
	
	RS232_Timer = 0;
	RS232_Count = 0;
	RS232_inf.Position = 0;
	RS232_inf.Timer	   = 0;
	RS232_inf.State    = RX_FRAME_START;
	RS232_inf.BufState = RX_BUF_NULL;
	
	pISR_URXD1=(unsigned)ISR_RS232_Rx;
	
	rUBRDIV1= ( (int)(MCLK/(16*baud) + 0.5) -1 );
	
	
	//rUFCON1 = 0xf7;	// Reset FIFO
	//rUFCON1 = 0x00;
	rUFCON1 = (1<<4) | (3<<1) | 1;
	rUMCON1 = 0x0;
	
	rULCON1 = mode;	//
	
	//rUCON1 = 0x245; 
	//rUCON1 	= 0x05; 
	rUCON1 	= 0x285;  
	
	rINTMSK=~(BIT_GLOBAL|BIT_URXD1);    
		
	//rUBRDIV1=((mul_div(MCLK,2,baud<<4)+1)>>1)-1;//
	//rUBRDIV1= ( (int)(MCLK/(16*baud) + 0.5) -1 );
	//rUFCON1 = 0xf1;	// normal FIFO
	
	//while(1);
	
	return 0;
}

////////////////////////////////

volatile unsigned int Key_Flag;
volatile unsigned int Key_Buf;

volatile unsigned int Timer_Count;
volatile unsigned int Key_Time;
volatile unsigned int Com_Time;

extern struct KEY_struct KEY_inf;
extern void Key_scan();


void __irq Timer5Done(void)
{
    rI_ISPC |= BIT_TIMER5;
    Timer_Count++;  
    
    //RS232_send_char(variable);
    //rPDATE ^= (1<<3);
    //===== KeyPad scan =====
    if( KEY_inf.Work ){
    	KEY_inf.Timer++;
    	
    	if(KEY_inf.Timer > KEY_TIMER_MAX){
    		KEY_inf.Timer = 0;
    		Key_scan();
    	}    	
    }
    
    //===== Com Timer =====
    if( RS232_inf.State != RX_FRAME_START ){
    	RS232_inf.Timer++;
    	
    	if(RS232_inf.Timer > COM_TIMER_MAX){
    		RS232_inf.Timer = 0;
    		RS232_inf.State = RX_FRAME_START;
    	}
    	
    }      
    
} 
 
void Timer5_init(void)
{
	rINTMSK |= BIT_TIMER5;
	
    Timer_Count = 0;
    
    pISR_TIMER5=(int)Timer5Done;  

//    rINTMSK=~(BIT_GLOBAL|BIT_TIMER5);    
//    pISR_TIMER5=(int)Timer5Done; 
	rPCONE = ( rPCONE & (~(3<<6)) ) | ( (0x1)<<6 ); 
	rPDATE &= ~(1<<3);  

    //rTCFG0 = 0xf0f0f;
    //rTCFG1 = 0x01234;
    rCLKCON	|= 1<<3;
    rTCFG0 	&= 0x0000FFFF;
    rTCFG1 	&= 0x000FFFFF;
    rTCFG1 	|= 0x3<<20;

    //rTCNTB5=0xffff;
    rTCNTB5	 = ( MCLK )/(1000*16);

    //rTCON=0x2222202;
    //rTCON=0x5999901;
    rTCON = 0x2<<24;
    rTCON = 0x5<<24;
    
    rINTMSK &= ~(BIT_GLOBAL|BIT_TIMER5);    

	
	//while(1);
    //rINTMSK=BIT_GLOBAL;   
}

///////////////////////////////
void Test_KeyPad(void)
{
	Key_open();
	Timer5_init();
	
	while(1){
		
		if(KEY_inf.Value != 0){
			RS232_send_char(KEY_inf.Value);
			KEY_inf.Value = 0;
		}
	}
}

//////////////////////
unsigned short Crc16_check(unsigned char *Dat, unsigned int Length)
{
	unsigned short Crc;
    int i;
      
    Crc =0;
    for(i=0; i<Length; i++)
    {
    	Crc  = (unsigned char)(Crc >> 8) | (Crc << 8);
        Crc ^= Dat[i];
        Crc ^= (unsigned char)(Crc & 0xff) >> 4;
        Crc ^= (Crc << 8) << 4;
        Crc ^= ((Crc & 0xff) << 4) << 1;
    }
    
    return Crc;
}


int RS232_frame_get(void)
{
	unsigned int i,length;
	unsigned short crc;

	i = 0;
		
	if( RS232_inf.BufState == RX_BUF_OK )
	{
		RS232_inf.BufState = RX_BUF_READING;	
		
		if( RS232_inf.Data[1] == 0x4B ){
			RS232_FrameBuf[0] = 0x4B;
			i = 1;			
		}else{
			length = ( (unsigned int)(RS232_inf.Data[1]) << 8 ) + RS232_inf.Data[2];
			if( length < 2040){
				for(i=0; i<length; i++)	{RS232_FrameBuf[i] = RS232_inf.Data[i+3];}
				crc = Crc16_check( RS232_FrameBuf, length);
				
				if( crc != ( ((unsigned short)(RS232_inf.Data[length+3])<<8) + RS232_inf.Data[length+4]) )
				{	i = 0;	}
							
			}else{
				i = 0;		
			}		
		}
		
		RS232_inf.BufState = RX_BUF_NULL;	
	}
	
	return i;
}

void Test_Com(void)
{
	int num;
	int i;
	
	while(1)
	{
		num = RS232_frame_get();
		if( num ){			
			for(i=0;i<num;i++)	{ RS232_send_char( RS232_FrameBuf[i] ); }
		}		
	}	
}

///////////////////////////////
int Main(void)
{
	unsigned char k;

StartTest:

	//RS232_open(115200,COM_8BIT|COM_NOPARITY|STOP_1BIT);
	LCD_open();	
	Key_open();
	
	LCD_clear_screen();	
	LCD_locate(1,6);	LCD_write_string("功能测试",1);
	LCD_locate(6,4);  	LCD_write_string("[1] 中断测试",0); 
	LCD_locate(8,4);  	LCD_write_string("[2] 低功耗测试",0);
	LCD_locate(10,4);  	LCD_write_string("[3] 串口测试",0);

	//Test_PWM();
	//Test_EINT4567();
	RS232_init(115200,COM_8BIT|COM_NOPARITY|STOP_1BIT);
	Timer5_init();
	Test_Com();

	k=0;	
	while(k<'1' || k>'3'){
		k = Key_get(1);
	}
	
	switch(k)
	{
		case '1':
			//Test_Interrupt();
			break;
		
		case '2':
			//Test_LowPwr();
			break;
			
		case '3':
			//Test_RS232();
			break;
						
		default:
			break;		
	}

	goto StartTest;	
	
}


⌨️ 快捷键说明

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