多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
该函数主要是根据实际情况对网卡进行一系列的初始化工作,例如:初始化MAC地址、长度,设置最大传输包的大小,设置网卡的属性字段,支持广播、多播、ARP等功能,如果是使用操作系统的话,还需要建立接收数据、发送数据的任务以及一些需要的消息队列、信号量等,此处讲解的是裸机底层驱动的编写,low\_level\_init()源码具体见代码清单 4‑8。 ``` 1 static void low_level_init(struct netif *netif) 2 { 3 HAL_StatusTypeDef hal_eth_init_status; 4 5 //初始化bsp—eth 6 hal_eth_init_status = Bsp_Eth_Init(); (1) 7 8 if (hal_eth_init_status == HAL_OK) 9 { 10 /* Set netif link flag */ 11 netif->flags |= NETIF_FLAG_LINK_UP; 12 } 13 14 #if LWIP_ARP || LWIP_ETHERNET 15 16 /* set MAC hardware address length */ 17 netif->hwaddr_len = ETH_HWADDR_LEN; 18 19 /* set MAC hardware address */ 20 netif->hwaddr[0] = heth.Init.MACAddr[0]; 21 netif->hwaddr[1] = heth.Init.MACAddr[1]; 22 netif->hwaddr[2] = heth.Init.MACAddr[2]; 23 netif->hwaddr[3] = heth.Init.MACAddr[3]; 24 netif->hwaddr[4] = heth.Init.MACAddr[4]; 25 netif->hwaddr[5] = heth.Init.MACAddr[5]; 26 27 /* maximum transfer unit */ 28 netif->mtu = NETIF_MTU; 29 30 #if LWIP_ARP 31 netif->flags |= NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; 32 #else 33 netif->flags |= NETIF_FLAG_BROADCAST; 34 #endif /* LWIP_ARP */ 35 36 #endif /* LWIP_ARP || LWIP_ETHERNET */ 37 38 HAL_ETH_Start(&heth); (2) 39 } ``` * (1):调用我们自己实现的以太网驱动初始化函数Bsp\_Eth\_Init(),这是根据网卡的驱动所编写的函数,不同的网卡是不一样的,由用户实现,该函数在代码清单 3‑1中实现,此处就不再赘述。 * (1):初始化完成就需要启动网卡,才能进行数据的收发操作。 本章就暂时讲解网卡初始相关的函数,而对于网卡的接收数据和发送数据都涉及到pbuf,我们会在后续进行详细讲解。