这篇来学习下LWIP协议栈的移植,实现ping通网络。官网SDK包里面是lwip-1.4.1版本,下面移植最新版本到开发板。
一、下载源码:
下载最新版本的lwip源码
下载地址:http://download.savannah.nongnu.org/releases/lwip/
二、项目中添加文件
2.1、将下载的源码解压到前篇创建的项目工程文件下的Middlewares文件夹
2.2、复制arch文件
复制官网SDK下ETH例程中的arch文件到Middlewares\lwip-2.1.3文件下
2.3、复制LWIP和网卡文件
2.4、在工程中添加文件
2.4.1、添加api
2.4.2、添加core
2.4.3、添加netif
2.4.5、添加网卡驱动程序
2.4.6、添加头文件
2.4.5、systick中断函数添加代码
2.4.6、添加文件后,编译代码,根据提示的错误修改对应的文件,这里就不列举了 。
三、主程序
main.c
#include "main.h"
#include "Board.h"
#include "oled.h"
#include "stdio.h"
#include "usart.h"
/** Global pointers on Rx descriptor used to transmit and receive descriptors */
extern ETH_DMADescConfig_T *DMARxDescToGet;
/** current Ethernet LocalTime value */
volatile uint32_t ETHTimer = 0;
/** lwip network interface structure for ethernetif */
struct netif UserNetif;
/** TCP periodic Timer */
uint32_t TCPTimer = 0;
/** ARP periodic Timer */
uint32_t ARPTimer = 0;
/** MAC address */
uint8_t SetMACaddr[6] = {0,0,0,0,0,8};
int main(void)
{
SysTick_Init();
init_led();
//init_i2c1();
I2CInit();
init_usart();
ConfigEthernet();
LwIP_Init();
//OLED_Init();
// led2_off();
// led3_on();
while (1)
{
/** check if any packet received */
if (ETH_ReadRxPacketSize(DMARxDescToGet))
{
/** process received ethernet packet */
LwIP_Pkt_Handle();
}
/** handle periodic timers for LwIP */
LwIP_Periodic_Handle(ETHTimer);
}
}
void LwIP_Init(void)
{
ip4_addr_t ipaddr;
ip4_addr_t netmask;
ip4_addr_t gw;
/** Initializes the dynamic memory heap */
mem_init();
/** Initializes the memory pools */
memp_init();
IP4_ADDR(&ipaddr, 192, 168, 1, 22);
IP4_ADDR(&netmask, 255, 255 , 255, 0);
IP4_ADDR(&gw, 192, 168, 1, 1);
/** Config MAC Address */
ETH_ConfigMACAddress(ETH_MAC_ADDRESS0, SetMACaddr);
/** Add a network interface to the list of lwIP netifs */
netif_add(&UserNetif, &ipaddr, &netmask, &gw, NULL, ðernetif_init, ðernet_input);
/** Registers the default network interface */
netif_set_default(&UserNetif);
/** When the netif is fully configured this function must be called */
netif_set_up(&UserNetif);
/** Use Com printf static IP address*/
printf("\n Static IP address \r\n");
printf("IP: %d.%d.%d.%d\r\n",192,168,1,22);
printf("NETMASK: %d.%d.%d.%d\r\n",255,255,255,0);
printf("Gateway: %d.%d.%d.%d\r\n",192,168,1,1);
}
/*!
* @brief This function received ethernet packet
*
* @param None
*
* @retval None
*/
void LwIP_Pkt_Handle(void)
{
/** Read a received packet from the Ethernet buffers and send it to the lwIP for handling */
ethernetif_input(&UserNetif);
}
/*!
* @brief This function LwIP periodic tasks
*
* @param ETHTimer the current Ethernet Timer value
*
* @retval None
*/
void LwIP_Periodic_Handle(__IO uint32_t ETHTimer)
{
#if LWIP_TCP
/** TCP periodic process every 250 ms */
if (ETHTimer - TCPTimer >= TCP_TMR_INTERVAL)
{
TCPTimer = ETHTimer;
tcp_tmr();
}
#endif
/** ARP periodic process every 5s */
if ((ETHTimer - ARPTimer) >= ARP_TMR_INTERVAL)
{
ARPTimer = ETHTimer;
etharp_tmr();
}
}
四、程序运行
4.1、连接网线到硬件
4.2、串口输出
4.3、ping网络
引用: Jacktang 发表于 2023-5-31 07:28 程序移植是门学问,跟着楼主学习移植LWIP协议栈
共同学习