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

📄 main.c

📁 μC/OS-II实验程序说明 软件版本:V1.0 日期:2005-05-25 多任务是指多个任务在操作系统的控制下同时运行
💻 C
字号:
/****************************************************************************
		Copyright (c) 深圳市民德电子科技有限公司  http://www.szminde.cn

  文件名称:MAIN.c
  版本号:	1.0
  日期:	2005-05-25
  说明:	此文件包含主函数。
  调用列表:Port_init.c
			sys_UART.c
  修改历史:--
****************************************************************************/

#include "def.h"
#include "option.h"
#include "44b.h"
#include "Port_init.h"
#include "sys_UART.h"
#include "armnet.h"
#include <string.h>


/****************************************************************************
  函数名称:Delay()
  说明:	延时函数
  调用函数:无
  输入参数:time 要延时的时间,为1时约延时0.1ms,为0时为校正延时时间
  输出参数:无
****************************************************************************/
static int delayLoopCount=0x190;
void Delay(int time)
{
    int i,adjust=0;

    if(time==0)
    {
		time=200;
		adjust=1;
		delayLoopCount=400;
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);  
		rWTDAT=0xffff;
		rWTCNT=0xffff; 
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3)|(1<<5);
    }

    for(;time>0;time--)

	for(i=0;i<delayLoopCount;i++);

    if(adjust==1)
    {
		rWTCON=((MCLK/1000000-1)<<8)|(2<<3);
		i=0xffff-rWTCNT;		
		delayLoopCount=8000000/(i*64);   
    }
}

/*定义MAC地址*/
unsigned char default_mac[MACLEN] = {0x12,0x34,0x56,0x78,0x90,0xab};

NODE locnode;

ETHERFRAME __align(4) etherframe;

/*定义IP地址,网关地址,掩码*/
unsigned int IP_ADDRESS = IP4_ADDR(192,168,0,250);
unsigned int GATE_ADDRESS = IP4_ADDR(255,255,255,0);
unsigned int MASK_ADDRESS = IP4_ADDR(192,168,0,1);

unsigned int download_addr;
unsigned int download_begin;
unsigned int download_end;
unsigned int download_len;


/****************************************************************************
  函数名称:NodeInit()
  说明:	节点初始化,用定义好的数据初始化ES-TAD7100开发板的网络参数
  调用函数:ResetNic()
  			memcpy()
  输入参数:无
  输出参数:无
****************************************************************************/
void NodeInit(void)
{	
	ResetNic();
	locnode.ip = IP_ADDRESS;	
	locnode.mask = MASK_ADDRESS;
	locnode.gate = GATE_ADDRESS;
	memcpy(locnode.mac,default_mac,6);
	locnode.port = 9000;
}


/****************************************************************************
  函数名称:NetIntPreInit()
  说明:	网络芯片产生中断位的设置
  调用函数:无
  输入参数:无
  输出参数:无
****************************************************************************/
void NetIntPreInit(void)
{
	rPCONG = rPCONG | 0x000c;
	rPUPG = rPUPG & 0xf7;
	rEXTINT |= 0x0040;
}


/****************************************************************************
  函数名称:Main()
  说明:	主函数,调用各初始化函数,然后实现可以响应另一个网络节点(比如PC)
  			的ping请求
  调用函数:Port_Init()
  			UART_Init()
  			UART_Printf()
  			NodeInit()
  			NetIntPreInit()
  			ArpInit()
  			ResetNic()
  			memset()
  			GetEthernet()
  			SwapEther()
  			IsArp()
  			READ_PACKED()
  			ArpRcvPacket()
  			IsIp()
  			IsIcmp()
  			IcmpRcvPacket()
  输入参数:无
  输出参数:返回整型值,但一般到不了返回值的地方
****************************************************************************/
int Main(void)
{
	unsigned short rxlen,ip_len;
	volatile unsigned char net_isr;
	ARPKT *arp;
	ETHERFRAME *efp;
	IPKT *ip;
	efp = &etherframe;
		
	rSYSCFG=SYSCFG_8KB;
	rNCACHBE0 = ((unsigned int)(Non_Cache_End>>12)<<16)|(Non_Cache_Start>>12); 
	Port_Init();
	Delay(0);
	
	UART_Init(0,115200);
	UART_SendByte('\n');
	UART_Printf("********************************************\n");	
	UART_Printf("*   Shenzhen MinDe Elec. Tech. Co., Ltd.   *\n");
	UART_Printf("*       ES-TAD7100 Development Board       *\n");
	UART_Printf("*        Ethernetnet Testing Module        *\n");
	UART_Printf("********************************************\n");	

	
	NodeInit();
	NetIntPreInit();
	ArpInit();
 	ResetNic();

    while(1)
    {
    	net_isr = EN_ISR;		
		if(net_isr & ENISR_RX)
		{
			EN_ISR |= ENISR_RX;

			memset((unsigned char *)efp, 0, sizeof(ETHERFRAME));
			rxlen = GetEthernet(efp);
			SwapEther(efp);		// 把ETHERHDR的ptype高低位互换
			
			if(IsArp(efp, rxlen))
			{	
				arp = (ARPKT *)(efp->edata);
				
				if(READ_PACKED(arp->dip)==locnode.ip &&(arp->op==ARPREQ || arp->op==ARPRESP))
				{
					ArpRcvPacket(efp);
				}
			}
			else
			{
				ip_len = IsIp(efp, rxlen);
				
				if(ip_len)
				
				{
					ip = (IPKT *)(efp->edata);
					if(IsIcmp(ip, ip_len))
					{
						IcmpRcvPacket(efp);
					}
				}
			}
		}
		
		if(net_isr & ENISR_RX_ERR)
		{
			EN_ISR |= ENISR_RX_ERR;
		}
		
		if(net_isr & ENISR_TX)
		{
			EN_ISR |= ENISR_TX;
		}
		
		if(net_isr & ENISR_TX_ERR)
		{
			EN_ISR |= ENISR_TX_ERR;
		}    	    	
    }  	
}

⌨️ 快捷键说明

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