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

📄 main.c

📁 一个基于三星s3c44b0x的串口协议转换器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		if(load_addr>0)
			load_addr = start;						
	}
	start = load_addr;
	
#define WAIT_TIME	0x3000000	
	time_out = WAIT_TIME;	
	do{
		if(kbhit())
		{
			*((U8 *)load_addr++) = getkey();
			time_out = WAIT_TIME;
		}
	}while(--time_out);
	
	printf("Received 0x%x bytes from serial port.\n", load_addr-start);
	
	return 0;
#undef	WAIT_TIME	
}

int RunProgram(int argc, char *argv[])
{
	void (*fp)(U32, U32) = (void (*)(U32, U32))DFT_DOWNLOAD_ADDR;
	
	if(argc>1)
	{
		int	p = strtoul(argv[1]);
		if(p>0)
			fp = (void (*)(U32, U32))p;			
	}
	
	printf("Run program from 0x%x, are you sure? [y/n]", fp);
	
	while(1)
	{
		if(kbhit())
		{
			int key = getkey();
			if(key=='y'||key=='Y')
			{
				putch(key);
				next_line();
				break;
			}
			if(key=='n'||key=='N')
			{
				putch(key);
				next_line();
				return 0;
			}				
		}
	}
	
	(*fp)(0, 178);
	
	return 0;		
}

int MoveFlashToRam(int argc, char *argv[])
{
	int rd_addr, wr_addr, size;
	
	if(argc<4)
	{
		puts("Please enter move a1 a2 size\na1 = flash addr, a2 = ram addr\n");
		return -1;		
	}
	
	rd_addr = strtoul(argv[1]);
	wr_addr = strtoul(argv[2]);
	size    = strtoul(argv[3]);
	if(rd_addr==-1||wr_addr==-1||size==-1)
	{
		puts("Parameter erroe\n");
		return -1;
	}
	
	FlashRead(rd_addr, (U16 *)wr_addr, size);
	
	return 0;
}

//#define	__LZ44B0x
#ifdef	__LZ44B0X
static void fill_lcd(char dat)
{
	int x, y;
	
	printf("fill lcd with 0x%x\n", dat);
	for(x=0; x<8; x++) {
		delay(200);
		outportb(0x04000000, 0xb8|x);
		delay(200);
		outportb(0x04000000, 0x40);
		delay(200);
		outportb(0x04000000, 0xc0);		
		for(y=0; y<64; y++ ) {
			delay(200);
			outportb(0x04000001, dat);
		}
	}
}

static int LcdDemo(int argc, char *argv[])
{
	int cs;
		
	puts("LCD test, press Esc key to quit\n");
		
	rPDATC |= 0x8;		//backlight on, enable cs1,cs2,cs3
	rPDATC &= ~0x7;
	outportb(0x04000000, 0x3e);		//display off
	rPDATC |= 0x7;
		
	for(cs=0; cs<3; cs++) {	
		rPDATC &= ~(1<<cs);
		delay(200);
		outportb(0x04000000, 0x3f);	//display on		

		fill_lcd(0xff);
		if(getkey_con())
			break;
		fill_lcd(0);
		if(getkey_con())
			break;
		fill_lcd(0xf0);
		if(getkey_con())
			break;
		fill_lcd(0xf);
		if(getkey_con())
			break;
		fill_lcd(0xaa);
		if(getkey_con())
			break;
		fill_lcd(0x55);
		if(getkey_con())
			break;		

		outportb(0x04000000, 0x3e);	//display off
		rPDATC |= 1<<cs;
	}				

	delay(200);
	rPDATC &= ~0xf;					//backlight off
	outportb(0x04000000, 0x3e);		//display off
	rPDATC |= 0x7;	
	
	return 0;
}
#endif
/*********************************************************/
int Help(int argc, char *argv[]);

typedef int (*cmdproc)(int argc, char *argv[]);
typedef struct {
	char *cmd;
	char *hlp;
	cmdproc proc;
}CMD_STRUC;

CMD_STRUC CMD_INNER[] =
				{ 	{"help", "show help", Help},
					{"?", "= help", Help},
					{"date", "show or set current date", GetDate},
					{"time", "show or set current time", GetTime},
					{"setweek", "set weekday", SetWeek},
					{"clock", "show system running clock", SysClock},
					{"setmclk", "set system running clock", ChgSysMclk},
					{"setbaud", "set baud rate", ChgBaudRate},
					{"load", "load file to memory", LoadFile2Mem},
					{"comload", "load file from serial port", LoadFromUart},
					{"prog", "program flash", ProgFlash},
					{"boot", "boot from flash", BootLoader},
					{"ap", "auto load image flie and program flash", AutoProgFlash},
					{"copy", "copy flash from src to dst address", CopyFlash},
					{"ipcfg", "show or set IP address", SetIPAddr},					
					{"run", "run from ram", RunProgram},
					{"move", "move data from flash to ram", MoveFlashToRam},
#ifdef	__LZ44B0X					
					{"lcdtest", "test lcd(192x64)", LcdDemo},
#endif					
					{NULL, NULL, NULL}
				};

int Help(int argc, char *argv[])
{
	int i;	
	
	for(i=0; CMD_INNER[i].cmd!=NULL; i++)
	{
		if(CMD_INNER[i].hlp!=NULL)
		{
			puts(CMD_INNER[i].cmd);
			puts("	------	");
			puts(CMD_INNER[i].hlp);
			putch('\n');
		}
	}
	
	return 0;
}

/*********************************************************/
static void ParseArgs(char *cmdline, int *argc, char **argv)
{
#define STATE_WHITESPACE	0
#define STATE_WORD			1

	char *c;
	int state = STATE_WHITESPACE;
	int i;

	*argc = 0;

	if(strlen(cmdline) == 0)
		return;

	/* convert all tabs into single spaces */
	c = cmdline;
	while(*c != '\0')
	{
		if(*c == '\t')
			*c = ' ';
		c++;
	}
	
	c = cmdline;
	i = 0;

	/* now find all words on the command line */
	while(*c != '\0')
	{
		if(state == STATE_WHITESPACE)
		{
			if(*c != ' ')
			{
				argv[i] = c;		//将argv[i]指向c
				i++;
				state = STATE_WORD;
			}
		}
		else
		{ /* state == STATE_WORD */
			if(*c == ' ')
			{
				*c = '\0';
				state = STATE_WHITESPACE;
			}
		}
		c++;
	}
	
	*argc = i;
#undef STATE_WHITESPACE
#undef STATE_WORD
}

static int GetCmdMatche(char *cmdline)
{
	int i;	
	
	for(i=0; CMD_INNER[i].cmd!=NULL; i++)
	{
		if(strncmp(CMD_INNER[i].cmd, cmdline, strlen(CMD_INNER[i].cmd))==0)
			return i;
	}
	
	return -1;
}

static int ParseCmd(char *cmdline, int cmd_len)
{
	int argc, num_commands;
	char *argv[MAX_ARGS];

	ParseArgs(cmdline, &argc, argv);

	/* only whitespace */
	if(argc == 0) 
		return 0;
	
	num_commands = GetCmdMatche(argv[0]);
	if(num_commands<0)
		return -1;
		
	if(CMD_INNER[num_commands].proc!=NULL)	
		CMD_INNER[num_commands].proc(argc, argv);
				
	return 0;			
}


void LEDON(char i)
{

if(i==1)
{ rPDATC&=0xfff1;
rPDATC|=2;

}
if(i==2){
 rPDATC&=0xfff1;
rPDATC|=4;

}
if(i==3){
 rPDATC&=0xfff1;
rPDATC|=8;

}
}

void beep(char i)
{
if(i==0)
rPDATE|=0x20;
if(i==1)
rPDATE&=~0x20;
}

void    __irq Uart0_RxInt(void)
{
	struct UartBuffS *ubs;
	ubs = &bufin0;
	rI_ISPC=BIT_URXD0;
	while(rUTRSTAT0&0x1)
	{
		*(ubs->data)=rURXH0;
		//printf("buf : %02x\n",*ubs->data);
		ubs->data++;
		ubs->truelen++;
		if(ubs->data-ubs->buf==MAX_UART_BUFF_LEN)
			ubs->data=ubs->buf;
			//delay(100000);
			//printf("%s",ubs->buf);
	}
}
	
void ISR_INIT(void)
{
  	initIRQ();//enable irq
	pISR_URXD0=(int)Uart0_RxInt;
	rINTCON=0x5;	  // Non-vectored,IRQ enable,FIQ disable  
   	rINTMOD=0x0;	  // All=IRQ mode
    	//rINTMSK=~(BIT_GLOBAL|BIT_URXD0);
    	rINTMSK=~(BIT_GLOBAL|BIT_URXD0);
}

void EX3init(void)
{
	WORD UartNo;
	
	ReadUartcnfg();
	LibInit();		//init Libs
	alloc_buff();	
	for(UartNo=0;UartNo<LIMIT_UART_NUM;UartNo++)
       	 InitBuff(UartNo);
}

void alloc_buff(void)
{
	struct UartBuffS *ubs;
	ubs=&bufin0;
	alloc_ubs(ubs);
	ubs=&bufin1;
	alloc_ubs(ubs);
}

void ReadUartcnfg(void)
{
	Uart[0].Usage=UART_FOR_MODBUS;
	Uart[1].Usage=UART_FOR_AC;
	Lib.AcYxNum=32;
	Lib.AcYcNum=10;
	Lib.AcYkNum=32;
}

void LibInit(void)
{
	int i;
	//test
	BYTE YxTest[4]={0x34,0x24,0xfe,0x7a};
	BYTE YcTest[20]={0x34,0x24,0xfe,0x7a,0x38,0xe7,0xff,0x92,0x75,0x54,0x24,0xfe,0x7a,0x38,0xe7,0xff,0x92,0x75,0x54,0x21};
	Lib.StartUp=OFF;
	Lib.InitNeed=ON;
	//mytime(&Lib.StartUpTime);
	Lib.pYxDown=OFF;
	Lib.TotalYcNum=Lib.AcYcNum;
	Lib.TotalYxNum=Lib.AcYxNum;
	Lib.TotalYkNum=Lib.AcYkNum;
	/*for(i=0;i<LIMIT_YC_IN_NUM*2;i++)
		Lib.YcInBuff[i]=0;
	for(i=0;i<LIMIT_YC_OUT_NUM*2;i++)
		Lib.YcInBuff[i]=0;
	for(i=0;i<LIMIT_YX_IN_NUM/8;i++)
		Lib.YxInBuff[i]=0;
	for(i=0;i<LIMIT_YX_OUT_NUM/8;i++)
		Lib.YxInBuff[i]=0;
	*/
	//test
	for(i=0;i<4;i++)
	{
		Lib.YxInBuff[i]=YxTest[i];
		//printf("%02x",Lib.YxInBuff[i]);
	}
	for(i=0;i<20;i++)
	{
		Lib.YcInBuff[i]=YcTest[i];
		//printf("%02x",Lib.YcInBuff[i]);
	}
	Lib.ModBusStat=STOPPED;
	Lib.ModBusCmd=0;
	Lib.AcStat=STOPPED;

	Lib.WaitNodeSet=OFF;
	Lib.SetNodeOk=OFF;
	Lib.Isdown=OFF;
	Lib.pYxDown=NULL;
	Lib.pYcDown=NULL;
	Lib.RcvModeBytes=0;
	for(i=0;i<256;i++)
		Lib.RcvModBuff[i]=0;
	Lib.DownRegAddr=0;
	Lib.DownRegCount=0;	
}

void InitBuff(WORD i)
{
	#ifdef  MODBUS_PORT
		if(Uart[i].Usage==UART_FOR_MODBUS)
			{
				ModBusBuffInit(i);
			}
	#endif

	#ifdef  AC_PORT
		if(Uart[i].Usage==UART_FOR_AC)
			{
				//AcBuffInit(i);
			}
	#endif
}

int Main()
{
	int i, key,temp;
	char command[MAX_CMD_LEN];	
	WORD UartNo;
	
	ChangePllValue(120, 8, 1);	//修改系统主频为6.4倍频
	PortInit();
	UartInit(CONSOLE_UART, SERIAL_BAUD);
	//UartInit(MODBUS_UART, SERIAL_BAUD);
	next_line();
	puts(table_begin);
	SysClock(0, NULL);
	printf("Serial Baud rate is %d\n", SERIAL_BAUD);
	puts("Build date : ");
	puts(__DATE__);
	putch('-');
	puts(__TIME__);
	next_line();
	puts(table_begin);
	
	SysTime.year    = 5;
	SysTime.month   = 11;
	SysTime.day     = 12;
	SysTime.weekday = 3;
	SysTime.hour    = 0x17;
	SysTime.min     = 0x09;
	SysTime.sec     = 0;
	
	RtcSetDay(&SysTime);
	RtcSetTime(&SysTime);
	GetDate(0, NULL);
	GetTime(0, NULL);	
	beep(1);
/*************************************/
	printf("Flash ID is : %x\n", GetFlashID());
	puts("Flash ID is : ");
	outportw(0, 0x90);
	printf("%x", inportw(2));
	outportw(0, 0x90);
	printf("%x", inportw(4));
	prompt();
	LCDIni();
	LCD_BACK_LIGHT(0);//open back light    
	TextDisplayInit();
	DelayNS(1);
	clearpicture();//图片显示
	DelayNS(1);
	displaypicture( );
	graphshow();
	DelayNS(10);
	TextDisplayInit();
	printsentence(0,"欢迎使用简易ARM7");//xdenotes the start line  the 12864module is 4 line and 8 column
	printsentence(1,"arm44b0-实验平台");
	printsentence(2,"嵌入式系统网出品");
	printsentence(3,"www.myarm.net   ");
	Blink(2);//此函数用来测试反白效果
//LCD_BACK_LIGHT(1);	
	puts("\ntype ? for help\nconnect UART0 to your host pc and type ap inside super terminal\n");
	prompt();
 	ISR_INIT();
	
	EX3init();
	while(1)
	{
		for(UartNo=0;UartNo<LIMIT_UART_NUM;UartNo++)
		{
			switch(Uart[UartNo].Usage)
			{
				case  UART_FOR_AC:
                                FromToAC(UartNo);break;
				case  UART_FOR_MODBUS:
                                FromToModBus(UartNo);break;
				default : break;
			}
		}
	}
	/*
	i = 0;
	for(;;)
	{
temp++;
	if(temp%100000==0)	
    LEDON(1);
   	if(temp%300000==0)	
	LEDON(2);
	if(temp%600000==0)	
	LEDON(3);
	if(temp%900000==0)	
	temp=0;

		if(kbhit())
		{
			key = getkey();
			if(key == BACK_KEY)
			{					
				if(i)
				{
					putch(key);
					putch(' ');
					putch(key);	
				}
				i -= i?1:0;	
			}
			else
			if(key == ENTER_KEY)
			{
				int tmp;
				command[i] = 0;
				putch('\n');
				tmp = ParseCmd(command, i);
				if(tmp<0)
					puts("Bad command\n");
				prompt();
				
				i = 0;
			}
			else
			{
				if(i<MAX_CMD_LEN-1)
				{
					command[i++] = key;
					putch(key);
				}
			}				
		}
	}
	*/
}

/*********************************************************/
int pIrqStart = 0;
int pIrqHandler = 0;
int pIrqFinish = 0;

⌨️ 快捷键说明

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