文章中,针对各种特殊情况:如menuconfig找不到相关驱动选项、驱动文件添加但不成功,以及IP非静态等问题做了一系列的解释解答和解决。并且指明了各种源码的位置,和移植位置。入门简单,容易上手!
【教程前的叨叨叨】目前看到各位大佬的文章,基本STM32+LAN8700教程居多,因为最近手上新项目使用的是GD32F4XX + DP83848,摸索的过程记录并分享一下,希望能给后来者一些引导和帮助。
客观来说GD属于国产芯片,作为研发可以投入更多的精力去维护和督促它们和各个开源的接轨和更新。相信软件技术+硬件支持,我们国内芯片的研发市场才能打开,后来人的研发环境才能更好~
教程比较粗浅,有哪里不明白的地方,欢迎小白们在评论区互动,欢迎大佬们多多指点![抱拳]
**启用 lwIP 与 net device**
第一处:(记得选对芯片)
第二处:开启network的驱动
此处可参考<官网教程>:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/application-note/components/network/an0010-lwip-driver-porting?id=驱动移植
如果menuconfig 打开找不到如上的勾选项,那么就是borad的Kconfig里缺少了驱动设置,需要移植一下。
将如下内容写入”menu Onboard Peripheral Drivers”内,再重新在env输入menuconfig,接着按照第一步进行即可
config BSP_USING_ETH
bool "Enable Ethernet"
select RT_USING_LWIP
default n
if BSP_USING_ETH
choice
prompt "Select Eth PHY"
default PHY_USING_DP83848C
config PHY_USING_LAN8720A
bool "PHY_USING_LAN8720A"
config PHY_USING_DP83848C
bool "PHY_USING_DP83848C"
config PHY_USING_DM9161CEP
bool "PHY_USING_DM9161CEP"
endchoice
endif
从RTT源码中复制以下几个文件到项目中
('drv_enet.c’, ‘synopsys_emac.c’,’synopsys_emac.h’)
RTT_PATH (rt-thread-master\bsp\gd32450z-eval\drivers\)
目标_PATH(\libraries\gd32_drivers\)
查看(\libraries\gd32_drivers\SConscript),是否添加了drv_enet的文件编译。如果没有,则添加如下内容。
# add Ethernet drivers.
if GetDepend('RT_USING_LWIP'):
src += ['drv_enet.c', 'synopsys_emac.c']
添加后,env终端输入:scons --target=mdk5
进行更新编译。
记得勾选芯片类型:(DP83848 || LAN8700)
ps:我手里的板子使用的是DP83848
#ifndef _PHY_H_
#define DP83848 1
#define LAN8700 0
#define PHY_TYPE DP83848
//[下面的地址,两个芯片的起始位置不同]:
//DP是从1U开始;LAN是从0U开始
#define PHY_ADDRESS ((uint16_t)1U) /*!< phy address determined by the hardware */
静态IP的定义问题
在项目的rtconfig.h中,并添加IP相关的内容
/* Static IPv4 Address */
#define RT_LWIP_IPADDR "192.168.1.30"
#define RT_LWIP_GWADDR "192.168.1.1"
#define RT_LWIP_MSKADDR "255.255.255.0"
并找到关于静态IP的定义:RT_LWIP_DHCP,注释掉(短期修改)。
或者将DHCP的选项从menuconfig中取消勾选(长期修改)。
图片要素解释:
【方框内容】:rt_hw_gd32_eth_init 函数初始化后的反馈log
【使用命令】:
ifconfig
//来查看以太网的相关设置。
ping (局域网内的某主机IP)
//可以看到反馈正常
本地某主机反ping设备,发现反馈也正常
如果存在本地ping设备可通,但是设备ping本地某主机不通的情况
可以看下是不是本地主机开启了防火墙,如果开了,就关闭防火墙后再次尝试一下。