LWIP 无OS RAW-API UDP实例

http://wj86843248.blog.163.com/blog/static/68643012201281993943977/

以太网是TI公司9b96这款芯片特色外设,或者说之所以选择9b96这款芯片,就是要用它的以太网。但是开发板给的光盘中有关以太网的例子,如enet_lwip,初学者搞不清楚这个目录中的这些文件是干什么的,这些文件都需要吗?


大家可以看出enet_lwip例子文件结构比较混乱,不知道哪些是我们要用到的源文件,不知道哪些是该工程必须用到的库文件,有些学生可能自己新建一个工程,但是编译时会出现错误,提示找不到包含的头文件,但又不知道这些头文件到哪去找?

下面是以太网最简单的例子,用网络助手发送数据,可以进入到以太网中断处理函数中。

/* 头文件包含区 --------------------------------------------------------------*/ #include "string.h" // strcmp函数和memset函数 #include "inc/lm3s9b96.h" #include "inc/hw_ints.h" #include "inc/hw_memmap.h" #include "inc/hw_nvic.h" #include "inc/hw_types.h" #include "inc/hw_i2c.h" #include "driverlib/i2c.h" #include "driverlib/ethernet.h" #include "driverlib/flash.h" #include "driverlib/gpio.h" #include "driverlib/timer.h" #include "driverlib/interrupt.h" #include "driverlib/sysctl.h" #include "driverlib/systick.h" #include "driverlib/uart.h" #include "driverlib/watchdog.h" #include "utils/locator.h" #include "utils/lwiplib.h" #include "utils/uartstdio.h" #include "utils/ustdlib.h" #include "drivers/set_pinout.h" #include "utils/uartstdio.h" /* 数据类型定义区 ------------------------------------------------------------*/ typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; typedef enum {FALSE = 0, TRUE = !FALSE} bool; /* Defines for setting up the system clock -----------------------------------*/ #define SYSTICKHZ 100 #define SYSTICKMS (1000 / SYSTICKHZ) #define SYSTICKUS (1000000 / SYSTICKHZ) #define SYSTICKNS (1000000000 / SYSTICKHZ) /* Position and movement granularity for the status indicator shown while the IP address is being determined--------*/ #define STATUS_X 50 #define STATUS_Y 100 #define MAX_STATUS_X (320 - (2 * STATUS_X)) #define ANIM_STEP_SIZE 8 /* 9b96主板的PF1宏定义 <调试时看门狗对应的LED> ------------------------------*/ #define LED_PERIPH SYSCTL_PERIPH_GPIOF #define LED_PORT GPIO_PORTF_BASE #define LED_PIN GPIO_PIN_1 #define LED_ON 1 << 1 #define LED_OFF 0 BYTE UDPData[1020] = {0x30}; // 全为0,网络助手时间戳显示有问题??? struct ip_addr local_addr; struct udp_pcb *UdpPcb; struct pbuf *p_tx; // the pointer of transmit buffer struct ip_addr IP_Addr_Tmp; // 用于UDP_Receive函数中,临时保存UdpPcb->remote_ip中的IP地址 /* External Application references -------------------------------------------*/ extern void fs_init(void); extern void fs_tick(unsigned long ulTickMS); //***************************************************************************** // // The error routine that is called if the driver library encounters an error. // //***************************************************************************** #ifdef DEBUG void __error__(char *pcFilename, unsigned long ulLine) { } #endif //***************************************************************************** // // 系统时钟初始化函数 // //***************************************************************************** void SysClk_Init(void) { // 配置系统主时钟, 使用外部晶振16M. SysCtlClockSet(SYSCTL_SYSDIV_1 | SYSCTL_USE_OSC | SYSCTL_OSC_MAIN | SYSCTL_XTAL_16MHZ); } //***************************************************************************** // // 以太网初始化函数 // //***************************************************************************** void ETH_Init(void) { DWORD ulUser0, ulUser1; BYTE pucMACArray[6]; // Set the pinout appropriately for this board. PinoutSet(); // Enable and Reset the Ethernet Controller. SysCtlPeripheralEnable(SYSCTL_PERIPH_ETH); SysCtlPeripheralReset(SYSCTL_PERIPH_ETH); // PA4(以太网A、B网切换)管脚为输出(数字功能默认使能,默认2mA驱动) GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4); // Enable Port F for Ethernet LEDs. // LED0 Bit 3 Output // LED1 Bit 2 Output GPIOPinTypeEthernetLED(GPIO_PORTF_BASE, GPIO_PIN_2 | GPIO_PIN_3); // Configure the hardware MAC address for Ethernet Controller filtering of // incoming packets. ulUser0 = 0x00000080; ulUser1 = 0x00ACDE48; // Convert the 24/24 split MAC address from NV ram into a 32/16 split MAC // address needed to program the hardware registers, then program the MAC // address into the Ethernet Controller registers. pucMACArray[0] = ((ulUser0 >> 0) & 0xff); pucMACArray[1] = ((ulUser0 >> 8) & 0xff); pucMACArray[2] = ((ulUser0 >> 16) & 0xff); pucMACArray[3] = ((ulUser1 >> 0) & 0xff); pucMACArray[4] = ((ulUser1 >> 8) & 0xff); pucMACArray[5] = ((ulUser1 >> 16) & 0xff); // Initialze the lwIP library, using STATIC. lwIPInit(pucMACArray, 0xC0A8010A, 0xFFFFFF00, 0, IPADDR_USE_STATIC); //192.168.1.10 } /******* 这是一个回调函数,当有UDP数据收到时会被调用********/ // addr:笔记本的IP地址(存放向开发板发送数据的PC的IP地址) // port:笔记本的端口号(远端端口号) void UDP_Receive(void *arg, struct udp_pcb *upcb, struct pbuf *p_rx, struct ip_addr *addr, u16_t port) { memset(UDPData, 0, 1020); if (p_rx != NULL) // 如果收到的数据不为空 { memcpy(UDPData, (char *)p_rx->payload, p_rx->len); p_tx->len = p_tx->tot_len = p_rx->len; IP_Addr_Tmp = UdpPcb->remote_ip; UdpPcb->remote_ip = *addr; // 获取笔记本的IP地址(远端IP地址) udp_send(UdpPcb, p_tx); } UdpPcb->remote_ip = IP_Addr_Tmp; pbuf_free(p_rx); // 释放缓冲区数据 } // 如果在回调函数中发送数据,不用connect; 在回调函数外发送数据必须要connect,否则接收不到数据 void UDP_Test_Init(void) { p_tx = pbuf_alloc(PBUF_RAW, sizeof(UDPData), PBUF_RAM); // 按照指定类型分配一个pbuf结构体 // struct pbuf *p_tx; p_tx->payload = (void *)UDPData; // DI16实际发送数据内存区 local_addr.addr = 0x0A01A8C0; // 本地IP地址:192.168.1.10 UdpPcb = udp_new(); // 创建udp协议控制块 udp_bind(UdpPcb, &local_addr, 1025); // 在协议控制块中绑定本地ip地址和本地端口号,本地:开发板(程序下到开发板中) udp_connect(UdpPcb, IP_ADDR_ANY, 1025); // 与远端udp主机建立连接,远端:笔记本 udp_recv(UdpPcb, UDP_Receive, NULL); // 设置数据接收时的回调函数 } //***************************************************************************** // // 主函数 // //***************************************************************************** int main(void) { // 系统时钟初始化,16MHz SysClk_Init(); // 以太网初始化 ETH_Init(); UDP_Test_Init(); // Enable processor interrupts. IntMasterEnable(); while (1) { } } //***************************************************************************** // // The interrupt handler for the SysTick interrupt. // //***************************************************************************** void SysTickIntHandler(void) { // Call the lwIP timer handler. lwIPTimer(SYSTICKMS); } //***************************************************************************** // // Required by lwIP library to support any host-related timer functions. // //***************************************************************************** void lwIPHostTimerHandler(void) { }


按照前面讲的中断映射表的配置,将startup_ewarm.c文件中添加两处代码。编译、运行即可。

我的土豆视频: LM3S9B96的以太网ethernet配置

有什么错误,请大家批评指正

你可能感兴趣的:(LWIP 无OS RAW-API UDP实例)