📄 maindemo.c
字号:
/*********************************************************************
*
* Example Web Server Application using Microchip TCP/IP Stack
*
*********************************************************************/
#define THIS_IS_STACK_APPLICATION
#define VERSION "v3.75" // TCP/IP stack version
#define BAUD_RATE (19200) // bps
// These headers must be included for required defs.
#include <string.h>
#include "..\Include\Compiler.h"
#include "..\Include\StackTsk.h"
#include "..\Include\Tick.h"
#include "..\Include\MAC.h"
#include "..\Include\Helpers.h"
#include "..\Include\Delay.h"
#include "..\Include\UART.h"
#include "..\Include\MPFS.h"
#include "..\Include\LCDBlocking.h"
#include "..\Include\GenericTCPClient.h"
#if defined(STACK_USE_DHCP)
#include "..\Include\DHCP.h"
#endif
#if defined(STACK_USE_HTTP_SERVER)
#include "..\Include\HTTP.h"
#endif
#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM)
#include "..\Include\FTP.h"
#endif
#if defined(STACK_USE_ANNOUNCE)
#include "..\Include\Announce.h"
#endif
//#if defined(MPFS_USE_EEPROM)
//#include "..\Include\XEEPROM.h"
//#endif
#if defined(STACK_USE_NBNS)
#include "..\Include\NBNS.h"
#endif
#if defined(STACK_USE_DNS)
#include "..\Include\DNS.h"
#endif
#if defined(STACK_USE_GENERIC_TCP_EXAMPLE)
#include "..\Include\GenericTCPClient.h"
#endif
// The SPBRG_VAL is used for PIC18s only. See InitializeBoard() for
// PIC24, dsPIC initialization of the baud rate generator.
#define USART_USE_BRGH_LOW
#if defined(USART_USE_BRGH_LOW)
#define SPBRG_VAL ( ((INSTR_FREQ/BAUD_RATE)/16) - 1)
#else
#define SPBRG_VAL ( ((INSTR_FREQ/BAUD_RATE)/4) - 1)
#endif
#if (SPBRG_VAL > 255) && !defined(__C30__)
#error "Calculated SPBRG value is out of range for currnet CLOCK_FREQ."
#endif
// This is used by other stack elements.
// Main application must define this and initialize it with proper values.
APP_CONFIG AppConfig =
{
{MY_DEFAULT_IP_ADDR_BYTE1, MY_DEFAULT_IP_ADDR_BYTE2, MY_DEFAULT_IP_ADDR_BYTE3, MY_DEFAULT_IP_ADDR_BYTE4},
{MY_DEFAULT_MAC_BYTE1, MY_DEFAULT_MAC_BYTE2, MY_DEFAULT_MAC_BYTE3, MY_DEFAULT_MAC_BYTE4, MY_DEFAULT_MAC_BYTE5, MY_DEFAULT_MAC_BYTE6},
{MY_DEFAULT_MASK_BYTE1, MY_DEFAULT_MASK_BYTE2, MY_DEFAULT_MASK_BYTE3, MY_DEFAULT_MASK_BYTE4},
{MY_DEFAULT_GATE_BYTE1, MY_DEFAULT_GATE_BYTE2, MY_DEFAULT_GATE_BYTE3, MY_DEFAULT_GATE_BYTE4},
{MY_DEFAULT_DNS_BYTE1, MY_DEFAULT_DNS_BYTE2, MY_DEFAULT_DNS_BYTE3, MY_DEFAULT_DNS_BYTE4},
{0b00000001}, // Flags, enable DHCP
};
BYTE myDHCPBindCount = 0;
#if defined(STACK_USE_DHCP)
extern BYTE DHCPBindCount;
#else
#define DHCPBindCount (0xFF)
#endif
/*
* Set configuration fuses
*/
#if defined(__18CXX)
#if defined(__18F8722)
// PICDEM HPC Explorer board
#pragma config OSC=HSPLL, FCMEN=OFF, IESO=OFF, PWRT=OFF, WDT=OFF, LVP=OFF
#elif defined(__18F87J10) || defined(__18F86J15) || defined(__18F86J10) || defined(__18F85J15) || defined(__18F85J10) || defined(__18F67J10) || defined(__18F66J15) || defined(__18F66J10) || defined(__18F65J15) || defined(__18F65J10)
// PICDEM HPC Explorer board
#pragma config XINST=OFF, WDTEN=OFF, FOSC2=ON, FOSC=HSPLL
#elif defined(__18F97J60) || defined(__18F96J65) || defined(__18F96J60) || defined(__18F87J60) || defined(__18F86J65) || defined(__18F86J60) || defined(__18F67J60) || defined(__18F66J65) || defined(__18F66J60)
// PICDEM.net 2 board
#pragma config XINST=OFF, WDT=OFF, FOSC2=ON, FOSC=HSPLL, ETHLED=ON
#elif defined(HI_TECH_C)
// PICDEM HPC Explorer board
__CONFIG(1, HSPLL);
__CONFIG(2, WDTDIS);
__CONFIG(3, MCLREN);
__CONFIG(4, XINSTDIS & LVPDIS);
#elif defined(__18F4620)
// PICDEM.net board
// #pragma config OSC=HS, WDT=OFF, MCLRE=ON, PBADEN=OFF, LVP=OFF, XINST=OFF
#elif defined(__18F452)
// PICDEM.net board
#pragma config OSC=HS, WDT=OFF, LVP=OFF
#endif
#elif defined(__PIC24F__)
// Explorer 16 board
_CONFIG2(FNOSC_PRIPLL & POSCMOD_XT) // Primary XT OSC with 4x PLL
_CONFIG1(JTAGEN_OFF & FWDTEN_OFF) // JTAG off, watchdog timer off
#elif defined(__dsPIC33F__) || defined(__PIC24H__)
// Explorer 16 board
_FOSCSEL(FNOSC_PRIPLL) // PLL enabled
_FOSC(OSCIOFNC_OFF & POSCMD_XT) // XT Osc
_FWDT(FWDTEN_OFF) // Disable Watchdog timer
// JTAG should be disabled as well
#elif defined(__dsPIC30F__)
// dsPICDEM 1.1 board
_FOSC(XT_PLL16) // XT Osc + 16X PLL
_FWDT(WDT_OFF) // Disable Watchdog timer
_FBORPOR(MCLR_EN & PBOR_OFF & PWRT_OFF)
#endif
// Private helper functions.
// These may or may not be present in all applications.
static void InitAppConfig(void);
static void InitializeBoard(void);
static void ProcessIO(void);
BOOL StringToIPAddress(char *str, IP_ADDR *buffer);
static void DisplayIPValue(IP_ADDR *IPVal);
static void SetConfig(void);
static void FormatNetBIOSName(BYTE Name[16]);
#if defined(MPFS_USE_EEPROM)
static BOOL DownloadMPFS(void);
static void SaveAppConfig(void);
#else
#define SaveAppConfig()
#endif
// NOTE: Several PICs, including the PIC18F4620 revision A3 have a RETFIE FAST/MOVFF bug
// The interruptlow keyword is used to work around the bug when using C18
#if defined(HI_TECH_C)
void interrupt HighISR(void)
#else
#pragma interruptlow HighISR
void HighISR(void)
#endif
{
#ifdef __18CXX
TickUpdate();
#endif
#if defined(STACK_USE_SLIP)
MACISR();
#endif
}
#if defined(__18CXX) && !defined(HI_TECH_C)
#pragma code highVector=0x08
void HighVector (void)
{
_asm goto HighISR _endasm
}
#pragma code // Return to default code section
#endif
ROM char NewIP[] = "New IP Address: ";
ROM char CRLF[] = "\r\n";
// Main application entry point.
int main(void)
{
static TICK t = 0;
// Initialize any application specific hardware.
InitializeBoard();
TickInit();
MPFSInit();
StackInit();
HTTPInit();
// Once all items are initialized, go into infinite loop and let
// stack items execute their tasks.
// If application needs to perform its own task, it should be
// done at the end of while loop.
// Note that this is a "co-operative mult-tasking" mechanism
// where every task performs its tasks (whether all in one shot
// or part of it) and returns so that other tasks can do their
// job.
// If a task needs very long time to do its job, it must broken
// down into smaller pieces so that other tasks can have CPU time.
while(1)
{
// Blink SYSTEM LED every second.
AppConfig.MyIPAddr.Val = 0xC8FDA8C0ul ; //192.168.253.200 0xC8FDA8C0u
if ( TickGetDiff(TickGet(), t) >= TICK_SECOND/2 )
{
t = TickGet();
LED0_IO ^= 1;
}
// This task performs normal stack task including checking
// for incoming packet, type of packet and calling
// appropriate stack entity to process it.
StackTask();
HTTPServer();
}
}
/*********************************************************************
* Function: void HTTPExecCmd(BYTE** argv, BYTE argc)
********************************************************************/
#if defined(STACK_USE_HTTP_SERVER)
ROM char COMMANDS_OK_PAGE[] = "INDEX.CGI";
ROM char CONFIG_UPDATE_PAGE[] = "CONFIG.CGI";
ROM char CMD_UNKNOWN_PAGE[] = "INDEX.CGI";
// Copy string with NULL termination.
#define COMMANDS_OK_PAGE_LEN (sizeof(COMMANDS_OK_PAGE))
#define CONFIG_UPDATE_PAGE_LEN (sizeof(CONFIG_UPDATE_PAGE))
#define CMD_UNKNOWN_PAGE_LEN (sizeof(CMD_UNKNOWN_PAGE))
void HTTPExecCmd(BYTE** argv, BYTE argc)
{
BYTE command;
BYTE var;
#endif
/*********************************************************************
* Function: WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
********************************************************************/
#if defined(STACK_USE_HTTP_SERVER)
WORD HTTPGetVar(BYTE var, WORD ref, BYTE* val)
{
// Temporary variables designated for storage of a whole return
// result to simplify logic needed since one byte must be returned
// at a time.
static BYTE VarString[20];
#if ENABLE_REMOTE_CONFIG
static BYTE VarStringLen;
BYTE *VarStringPtr;
BYTE i;
BYTE *DataSource;
#endif
return HTTP_END_OF_VAR;
}
#endif
#if defined(STACK_USE_FTP_SERVER) && defined(MPFS_USE_EEPROM)
ROM char FTP_USER_NAME[] = "ftp";
ROM char FTP_USER_PASS[] = "microchip";
#undef FTP_USER_NAME_LEN
#define FTP_USER_NAME_LEN (sizeof(FTP_USER_NAME)-1)
#define FTP_USER_PASS_LEN (sizeof(FTP_USER_PASS)-1)
BOOL FTPVerify(char *login, char *password)
{
if ( !memcmppgm2ram(login, (ROM void*)FTP_USER_NAME, FTP_USER_NAME_LEN) )
{
if ( !memcmppgm2ram(password, (ROM void*)FTP_USER_PASS, FTP_USER_PASS_LEN) )
return TRUE;
}
return FALSE;
}
#endif
/*********************************************************************
* Function: void InitializeBoard(void)
*
* PreCondition: None
*
* Input: None
*
* Output: None
*
* Side Effects: None
*
* Overview: Initialize board specific hardware.
*
* Note: None
********************************************************************/
static void InitializeBoard(void)
{
// LEDs
LED0_TRIS = 0;
LED1_TRIS = 0;
LED0_IO = 0;
LED1_IO = 0;
DelayMs(5000);
LED0_IO = 1;
LED1_IO = 1;
T0CON = 0;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -