[MCU] 【极海APM32F407 Tiny Board】移植LWIP协议栈

TL-LED   2023-5-30 20:56 楼主

这篇来学习下LWIP协议栈的移植,实现ping通网络。官网SDK包里面是lwip-1.4.1版本,下面移植最新版本到开发板。

 

一、下载源码:

下载最新版本的lwip源码

下载地址:http://download.savannah.nongnu.org/releases/lwip/

001.png

二、项目中添加文件

2.1、将下载的源码解压到前篇创建的项目工程文件下的Middlewares文件夹

002.png

2.2、复制arch文件

复制官网SDK下ETH例程中的arch文件到Middlewares\lwip-2.1.3文件下

003.png

2.3、复制LWIP和网卡文件

004.png 005.png

2.4、在工程中添加文件

2.4.1、添加api

006.png

2.4.2、添加core

007.png

2.4.3、添加netif

008.png 2.4.4、添加arch

009.png

2.4.5、添加网卡驱动程序

010.png

2.4.6、添加头文件

011.png

 

2.4.5、systick中断函数添加代码

015.png

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, &ethernetif_init, &ethernet_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、连接网线到硬件

014.jpg

4.2、串口输出

012.png

4.3、ping网络

013.png

回复评论 (5)

程序移植是门学问,跟着楼主学习移植LWIP协议栈

点赞  2023-5-31 07:28
引用: Jacktang 发表于 2023-5-31 07:28 程序移植是门学问,跟着楼主学习移植LWIP协议栈

共同学习

点赞  2023-5-31 09:29
大佬,lwip学习起来难不难,如何做网络控制。
点赞 (1) 2023-6-1 07:50

点赞加关注,

gitee/casy
点赞  2023-6-1 08:37

 

楼主能把工程代码分享一下吗?谢谢了

我今天用sdk的tcp demo,直接卡死!!!

man函数进来,第一个时钟初始化过不去:

image.png  

gitee/casy
点赞  2023-6-4 11:25
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复