初始化以太网接口和LWIP堆栈:
在main.c中调用以太网和LWIP初始化函数,并在主循环中处理以太网输入和定时器超时:
c
#include "stm32h7xx_hal.h"
#include "lwip.h"
#include "ethernetif.h"
ETH_HandleTypeDef heth;
ETH_TxPacketConfig TxConfig;
struct netif gnetif;
void SystemClock_Config(void);
void MX_GPIO_Init(void);
void MX_ETH_Init(void);
void MX_LWIP_Init(void);
void Error_Handler(void);
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ETH_Init();
MX_LWIP_Init();
while (1)
{
ethernetif_input(&gnetif);
sys_check_timeouts();
}
}
void MX_ETH_Init(void)
{
static uint8_t macaddress[6] = {0x00, 0x80, 0xE1, 0x00, 0x00, 0x00};
heth.Instance = ETH;
heth.Init.MACAddr = macaddress;
heth.Init.MediaInterface = HAL_ETH_RMII_MODE;
heth.Init.RxMode = ETH_RXPOLLING_MODE;
heth.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
heth.Init.PhyAddress = DP83848_PHY_ADDRESS;
if (HAL_ETH_Init(&heth) != HAL_OK)
{
Error_Handler();
}
memset(&TxConfig, 0, sizeof(ETH_TxPacketConfig));
TxConfig.Attributes = ETH_TX_PACKETS_FEATURES_CSUM | ETH_TX_PACKETS_FEATURES_CRCPAD;
TxConfig.ChecksumCtrl = ETH_CHECKSUM_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
TxConfig.CRCPadCtrl = ETH_CRC_PAD_INSERT;
}
void MX_LWIP_Init(void)
{
// 初始化LWIP堆栈
lwip_init();
// 为netif分配内存并初始化
netif_add(&gnetif, NULL, NULL, NULL, NULL, ðernetif_init, &tcpip_input);
netif_set_default(&gnetif);
if (netif_is_link_up(&gnetif))
{
netif_set_up(&gnetif);
}
else
{
netif_set_down(&gnetif);
}
// 启用DHCP客户端(如果需要)
// dhcp_start(&gnetif);
}
|