参考例程是基于GD32F450的,在移植过程中遇到一些容易忽略的地方,导致程序卡在gd32fxx_enet.c中enet_phy_config的位置。将GD32F450上的代码全部移植到GD32F470平台后,一直卡在卡在gd32fxx_enet.c中enet_phy_config,经过排查发现GD32的官方库文件也需要修改,分别为gd32f4xx_enet.h和gd32f4xx_enet.c。
需要修改的地方如下:
1,如下添加宏定义:
#ifndef _PHY_H_#define DP83848 0#define LAN8700 1#define SR8201F 2#define PHY_TYPE SR8201F
#define PHY_ADDRESS ((uint16_t)0x3U) /*!< phy address determined by the hardware */
2,在头文件88行位置添加如下内容:
#if(PHY_TYPE == LAN8700) #define PHY_SR 31U /*!< tranceiver status register */#define PHY_SPEED_STATUS ((uint16_t)0x0004) /*!< configured information of speed: 10Mbit/s */#define PHY_DUPLEX_STATUS ((uint16_t)0x0010) /*!< configured information of duplex: full-duplex */#elif(PHY_TYPE == DP83848)#define PHY_SR 16U /*!< tranceiver status register */#define PHY_SPEED_STATUS ((uint16_t)0x0002) /*!< configured information of speed: 10Mbit/s */#define PHY_DUPLEX_STATUS ((uint16_t)0x0004) /*!< configured information of duplex: full-duplex */#elif(PHY_TYPE == SR8201F)#define PHY_SR PHY_REG_BCR /*!< tranceiver status register */#define PHY_SPEED_STATUS ((uint16_t)0x2000) /*!< configured information of speed: 10Mbit/s */#define PHY_DUPLEX_STATUS ((uint16_t)0x0100) /*!< configured information of duplex: full-duplex */#endif /* PHY_TYPE */
3,修改函数ErrStatus enet_init,修改内容如下图所示

4,修改static void enet_default_init,修改内容如下图所示:

修改以上内容后,程序可以正确运行:

关键字:以太网芯片 宏定义
引用地址:
芯片GD32与以太网芯片的坑
推荐阅读最新更新时间:2026-03-25 12:33
STM32中C语言宏定义与数组大小管理的实用技巧
一、代码原理解析 这段代码围绕 “用宏定义(#define )确定数组大小,结合不同类型变量 / 数组满足数据存储需求” 设计,核心是 C 语言中宏定义、类型别名、数组声明的基础语法与逻辑,拆解如下: 1. 宏定义的作用(#define SENDBUFF_SIZE 100 ) 功能:用 #define 定义一个 “符号常量”SENDBUFF_SIZE,代表数值 100 。宏定义是 C 语言预处理指令,在编译前会把代码中所有 SENDBUFF_SIZE 替换为 100 。 优势: 便于修改:若需调整串口 DMA 发送缓冲区大小,只需修改宏定义处的 100,无需逐行改数组声明,降低维护成本。 增强可读性:SENDBUFF_
[单片机]
浅谈单片机开发中宏定义的使用
(1)IO口管脚使用见名知意的宏定义,比如LED1,LED_ONE_PIN (2)IO口电平高低使用宏定义,例如PIN_ON/PIN_OFF (3)某一个需要与变量进行比较的数值,使用宏定义 ... 当然,我说的也只是一些很片面的,但是宏定义对于我们去修改程序就有了很大的便利之处, (1)将软件层与硬件层分割开,比如IO管脚使用宏定义,那么管脚变了,只要修改成另一个管脚,软件其他部分不用去管, 在本人的项目中遇到过,硬件工程师出的板子与样机的板子的灯的位置正好相反,但是我一开始没有注意,直接就按照我们自己的板子上的顺序写的软件,然后出来的效果正好与样机相反,并且程序中有大量的对这些灯的操作语句。但是我只
[单片机]
STM32的宏定义问题
在刚开始学习STM32单片机的时候,我们会遇到这样的问题: #if !defined (STM32F10X_LD) && !defined (STM32F10X_LD_VL) && !defined (STM32F10X_MD) && !defined (STM32F10X_MD_VL) && !defined (STM32F10X_HD) && !defined (STM32F10X_HD_VL) && !defined (STM32F10X_XL) && !defined (STM32F10X_CL) /* #define STM32F10X_LD */ /*! STM32F10X_LD: STM32 Low densi
[单片机]
STM32学习记录9:STM32F10X_XX宏定义的选择
如果你使用stm32f10x_stdperiph_lib,会发现在stm32f10x.h文件会有一段关于宏选择的代码,如: view plain copy #if !defined (STM32F10X_LD) && !defined (STM32F10X_MD) && !defined (STM32F10X_HD) && !defined (STM32F10X_CL) /* #define STM32F10X_LD */ /*! STM32F10X_LD: STM32 Low density devices */ /* #define STM32F10X_MD */ /*! STM32F10
[单片机]
ARM中断宏定义
MACRO $HandlerLabel HANDLER $HandleLabel $HandlerLabel sub sp,sp,#4 ;decrement sp(to store jump address) 存贮PC跳转地址 stmfd sp!,{r0} ;PUSH the work register to stack(lr does not push because it return to original address) ldr r0,=$HandleLabel ;load the address of HandleXXX to r0 ldr r0,
[单片机]
arm中的宏定义
语法格式如下: MACRO macroname{ $ parameter1, $ parameter, } 其他指令 MEND MACRO伪操作标识宏定义的开始,MEND标识宏定义的结束。用MACRO及MEND定义一段代码,称为宏定义体,这样在程序中就可以通过宏指令多次调用该代码段。 其中, $ label在宏指令被展开时,label会被替换成相应的符号,通常是一个标号。宏定义中的$label是一个可选参数,在一个符号前使用$表示程序被汇编时将使用相应的值来替代$后的符号。 macroname为所定义的宏的名称。 $para
[单片机]
STM32启动文件的选择及宏定义
startup_stm32f10x_cl.s 互联型的器件,STM32F105xx,STM32F107xx startup_stm32f10x_hd.s 大容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_hd_vl.s 大容量的STM32F100xx startup_stm32f10x_ld.s 小容量的STM32F101xx,STM32F102xx,STM32F103xx startup_stm32f10x_ld_vl.s 小容量的STM32F100xx startup_stm32f10x_md.s 中容量的STM32F101xx,STM32F102xx,STM32
[单片机]
GD32芯片怎么样?GD32芯片运行速度慢的原因
GD32芯片是一种基于ARM Cortex-M3内核的微控制器(MCU),是中国长江存储器有限责任公司(GigaDevice)推出的产品系列。与NXP LPC、STMicroelectronics STM32、TI MSP、Freescale Kinetis等常见的MCU产品相比,GD32芯片具有低功耗、高性价比和良好的性能等特点。 GD32芯片怎么样? GD32芯片具有以下优点: 1.高性价比:GD32芯片生产成本相对较低,价格也相对更为实惠。 2.低功耗:采用低功耗技术,能够长时间运行。 3.高集成度:具备丰富的外设,包括LCD、CAN、USB、SPI、I2C等通用接口,适用于多种应用场景。 4.可扩展性好:GD32芯片的应
[单片机]