?? main.c
字號:
/****************************************Copyright (c)**************************************************
** Guangzhou ZHIYUAN electronics Co.,LTD.
**
** http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name: main.c
** Last modified Date: 2008.7.18
** Last Version: 1.0
** Description: Luminary系列MicroControllers以太網應用uIP TCP/IP協議棧應用模板,包含了主函數控制
** 循環
**
**------------------------------------------------------------------------------------------------------
** Created By: 任海波
** Created date: 2008.7.18
** Version: 1.0
** Descriptions: The original version 初始版本
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/
#include"includes.h"
uint8 IPAddress[4]=MY_IP_ID;
uint8 IPNetMask[4]=IP_MARK_ID;
uint8 MACAddress[6]=My_Mac_ID;
uint8 IPGateWAY[4]=MY_GATEWAY_ID;
/*************************************************************************************
***設定系統時鐘定時器的常數
**************************************************************************************/
#define SYSTICKHZ 100
#define SYSTICKMS (1000 / SYSTICKHZ)
#define SYSTICKUS (1000000 / SYSTICKHZ)
#define SYSTICKNS (1000000000 / SYSTICKHZ)
/******************************************************************************
**定義一個宏,可以訪問緩沖區中以太網數據報的報頭信息
******************************************************************************/
#define BUF ((struct uip_eth_hdr *)&uip_buf[0])
/**********************************************************************
**設置一些標志位,各標志位的定義如下:
**標志位0:指示一個系統時鐘定時器中斷發生
**標志位1:一個以太網數據包接收中斷發生
************************************************************************/
#define FLAG_SYSTICK 0
#define FLAG_RXPKT 1
static volatile unsigned long g_ulFlags;
/**********************************************************************
***uIP TCP/IP協議棧的定時器常數(以ms為單位)
************************************************************************/
#define UIP_PERIODIC_TIMER_MS 500
#define UIP_ARP_TIMER_MS 10000
/**********************************************************************
***如果系統的驅動庫調用出錯,將會彈出提示,可以查出相應的錯誤
************************************************************************/
#ifdef DEBUG
void
__error__(char *pcFilename, unsigned long ulLine)
{
}
#endif
/****************************************************************************
**函數原型: SysTickIntHandler()
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: 系統時鐘定時器中斷,標志中斷發生
*****************************************************************************/
void
SysTickIntHandler(void)
{
// 標志一個系統時鐘定時器中斷已經發生.
HWREGBITW(&g_ulFlags, FLAG_SYSTICK) = 1;
}
/****************************************************************************
**函數原型: EthernetIntHandler()
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: 以太網中斷,標志中斷發生
*****************************************************************************/
void
EthernetIntHandler(void)
{
unsigned long ulTemp;
/****************讀取并清除中斷*************/
ulTemp = EthernetIntStatus(ETH_BASE, false);
EthernetIntClear(ETH_BASE, ulTemp);
// 檢查發生的是否是一個數據包接收的中斷
if(ulTemp & ETH_INT_RX)
{
// 指示一個數據包已經被接收
HWREGBITW(&g_ulFlags, FLAG_RXPKT) = 1;
// 禁止以太網接收中斷
EthernetIntDisable(ETH_BASE, ETH_INT_RX);
}
}
/****************************************************************************
**函數原型: main()
**入口參數: 無
**出口參數: 無
**返 回 值: 無
**說 明: uIP TCP/IP協議棧應用的主函數,其中包含了底層的硬件驅動
*****************************************************************************/
int
main(void)
{
uip_ipaddr_t ipaddr;
static struct uip_eth_addr sTempAddr;
long lPeriodicTimer, lARPTimer, lPacketLength;
unsigned long ulTemp;
// 根據硬件電路的晶振設置系統時鐘
SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN |
SYSCTL_XTAL_8MHZ);
// 使能并復位以太網控制器
SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH);
SysCtlPeripheralReset(SYSCTL_PERIPH_ETH);
// 使能PF口的以太網控制器的發生接收指示燈.
// LED0 Bit 3 輸出
// LED1 Bit 2 輸出
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
GPIODirModeSet(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3, GPIO_DIR_MODE_HW);
GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3,
GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD);
// 配置初始化系統時鐘定時器,并使能該定時器中斷
SysTickPeriodSet(SysCtlClockGet() / SYSTICKHZ);
SysTickEnable();
SysTickIntEnable();
// 初始化以太網控制器,并禁止以太網控制器的所有中斷源
EthernetIntDisable(ETH_BASE, (ETH_INT_PHY | ETH_INT_MDIO | ETH_INT_RXER |
ETH_INT_RXOF | ETH_INT_TX | ETH_INT_TXER | ETH_INT_RX));
ulTemp = EthernetIntStatus(ETH_BASE, false);
EthernetIntClear(ETH_BASE, ulTemp);
// 初始化以太網控制器,以便可以操作它
EthernetInitExpClk(ETH_BASE, SysCtlClockGet());
// 配置以太網控制器,使它以正常的模式工作.
// - 全雙工
// - TX CRC 校驗自動產生
// - TX Padding Enabled
EthernetConfigSet(ETH_BASE, (ETH_CFG_TX_DPLXEN | ETH_CFG_TX_CRCEN |
ETH_CFG_TX_PADEN));
// 使能以太網控制器.
EthernetEnable(ETH_BASE);
// 使能以太網控制器的中斷.
IntEnable(INT_ETH);
// 使能以太網控制器的數據包接收中斷.
EthernetIntEnable(ETH_BASE, ETH_INT_RX);
// 使能系統總中斷
IntMasterEnable();
// 初始化 uIP TCP/IP 協議棧.
uip_init();
uip_ipaddr(ipaddr, IPAddress[0], IPAddress[1], IPAddress[2],
IPAddress[3]);
uip_sethostaddr(ipaddr);
uip_ipaddr(ipaddr, IPNetMask[0], IPNetMask[1], IPNetMask[2],
IPNetMask[3]);
uip_setnetmask(ipaddr);
//配置以太網控制器的硬件物理地址(即MAC地址)
sTempAddr.addr[0] = MACAddress[0];
sTempAddr.addr[1] = MACAddress[1];
sTempAddr.addr[2] = MACAddress[2];
sTempAddr.addr[3] = MACAddress[3];
sTempAddr.addr[4] = MACAddress[4];
sTempAddr.addr[5] = MACAddress[5];
EthernetMACAddrSet(ETH_BASE, (unsigned char *)&sTempAddr);
uip_setethaddr(sTempAddr);
/*********這這里初始化一個具體的應用***********************************/
httpd_init();
// 主控制應用程序循環.
lPeriodicTimer = 0;
lARPTimer = 0;
while(true)
{
//等待一個事件發生。該事件可以是一個系統時鐘定時器的事件也可以是一個RX數據包接收的中斷
while(!g_ulFlags)
{
}
//事件發生,如果是系統時鐘定時器中斷,則清除中斷標志位,并給計數定時器加 1
if(HWREGBITW(&g_ulFlags, FLAG_SYSTICK) == 1)
{
HWREGBITW(&g_ulFlags, FLAG_SYSTICK) = 0;
lPeriodicTimer += SYSTICKMS;
lARPTimer += SYSTICKMS;
}
//
//檢查RX接收緩沖區中是否有數據,并讀取.
//
lPacketLength = EthernetPacketGetNonBlocking(ETH_BASE, uip_buf,
sizeof(uip_buf));
if(lPacketLength > 0)
{
// 設置 uip_len 用來指示uIP stack 可用.
uip_len = (unsigned short)lPacketLength;
// 清除RX數據包接收中斷,并重新使能該中斷
if(HWREGBITW(&g_ulFlags, FLAG_RXPKT) == 1)
{
HWREGBITW(&g_ulFlags, FLAG_RXPKT) = 0;
EthernetIntEnable(ETH_BASE, ETH_INT_RX);
}
// 這里處理IP數據包接收
if(BUF->type == htons(UIP_ETHTYPE_IP))
{
uip_arp_ipin();
uip_input();
//
// If the above function invocation resulted in data that
// should be sent out on the network, the global variable
// uip_len is set to a value > 0.
//
if(uip_len > 0)
{
uip_arp_out();
EthernetPacketPut(ETH_BASE, uip_buf, uip_len);
uip_len = 0;
}
}
//
// 這里處理ARP數據包接收
//
else if(BUF->type == htons(UIP_ETHTYPE_ARP))
{
uip_arp_arpin();
//
// If the above function invocation resulted in data that
// should be sent out on the network, the global variable
// uip_len is set to a value > 0.
//
if(uip_len > 0)
{
EthernetPacketPut(ETH_BASE, uip_buf, uip_len);
uip_len = 0;
}
}
}
//這里處理Timer決定的TCP/IP周期性事件.
if(lPeriodicTimer > UIP_PERIODIC_TIMER_MS)
{
lPeriodicTimer = 0;
for(ulTemp = 0; ulTemp < UIP_CONNS; ulTemp++)
{
uip_periodic(ulTemp);
//
// If the above function invocation resulted in data that
// should be sent out on the network, the global variable
// uip_len is set to a value > 0.
//
if(uip_len > 0)
{
uip_arp_out();
EthernetPacketPut(ETH_BASE, uip_buf, uip_len);
uip_len = 0;
}
}
#if UIP_UDP
for(ulTemp = 0; ulTemp < UIP_UDP_CONNS; ulTemp++)
{
uip_udp_periodic(i);
//
// If the above function invocation resulted in data that
// should be sent out on the network, the global variable
// uip_len is set to a value > 0.
//
if(uip_len > 0)
{
uip_arp_out();
EthernetPacketPut(ETH_BASE, uip_buf, uip_len);
uip_len = 0;
}
}
#endif // UIP_UDP
}
//
// Process ARP Timer here.
//
if(lARPTimer > UIP_ARP_TIMER_MS)
{
lARPTimer = 0;
uip_arp_timer();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -