下面是使用CubeMX配置STM32F407VET6,实现以太网通讯(PHY芯片为LAN8720)的具体步骤总结:
一、硬件连接方式:
-
硬件原理图:
使用外部晶振为PHY芯片提供时钟。
- STM32F407VET6 与 LAN8720 采用 RMII 模式连接。
STM32F407VET6引脚 | 功能(RMII) | LAN8720引脚 |
---|---|---|
PA1 | ETH_REF_CLK | REF_CLK(50MHz时钟输入) |
PA2 | ETH_MDIO | MDIO |
PC1 | ETH_MDC | MDC |
PA7 | ETH_CRS_DV | CRS_DV |
PC4 | ETH_RXD0 | RXD0 |
PC5 | ETH_RXD1 | RXD1 |
PB11 | ETH_TX_EN | TX_EN |
PB12 | ETH_TXD0 | TXD0 |
PB13 | ETH_TXD1 | TXD1 |
PA8 | ETH_RESET | nRST |
注意:
-
LAN8720使用RMII模式,需提供50MHz外部时钟至LAN8720芯片的XTAL1/CLKIN引脚。
-
LAN8720芯片外接的晶振频率为 25MHz,连接至LAN8720的XTAL1/CLKIN管脚。
STM32F407在使用RMII模式进行以太网通信时,LAN8720内部会将这个25MHz时钟倍频为50MHz后输出到STM32的PA1引脚(ETH_REF_CLK),因此你只需要给LAN8720提供一个25MHz的晶振即可。
- 外部晶振:25MHz
- RMII参考时钟:LAN8720输出50MHz到STM32
-
-
LAN8720的地址引脚PHYAD0置0(接地),则默认PHY地址为0(我这里默认接地了,只是原理图没画出来)。
- 根据LAN8720官方Datasheet说明:
- 当PHYAD0引脚 下拉到GND 时,PHY地址为 0。
- 当PHYAD0引脚 上拉到VDDIO 时,PHY地址为 1。
在原理图中,这个引脚既未上拉也未下拉(即悬空状态),通常会导致PHY地址不确定,在实际工作中可能会导致STM32无法正确识别PHY芯片。
二、CubeMX软件配置步骤:
(1)以太网ETH配置:
-
打开ETH外设,选择
Mode
为RMII
。 -
其他配置保持默认即可:
- Ethernet MAC address:可以自定义,例如:00:80:E1:00:00:00。此处不做任何处理,保持默认即可。
-
根据硬件设计,确认IO口是否配置成功(默认配置)
-
配置PHY芯片复位引脚,这个引脚用于复位芯片,使得芯片初始化成功
(2)使能LWIP中间件:
- 在Middleware选项中使能
LWIP
。 - 配置PHY芯片:
PHY(Port Physical Layer),可称之为端口物理层,是一个对 OSI 模型物理层的简称。现在常用于STM32 的有 DP83848,LAN8270,DM9161/9162 等。这些 PHY 芯片都大同小异,基本寄存器都是一样的,只有扩展寄存和厂商专门设置的寄存器不同。如果将其中一个 PHY 驱动成功了,驱动另一个也是非常方便的,所以这里选择LAN8742即可(我们使用的芯片是LAN8720)
-
配置LWIP的参数,
-
使能
ICMP
(方便PING测试) -
IP地址、子网掩码、网关等信息。 示例:
IP地址:192.168.100.100 子网掩码:255.255.255.0 网关:192.168.100.1
-
配置LWIP 关键参数:
(3)配置中断(可选):
- 通常默认已开启以太网相关中断,无需额外配置。
三、软件代码实现:
(1)初始化函数:
在生成的代码中,以太网和LWIP初始化函数自动生成,无需手动更改:
MX_LWIP_Init(); // LWIP协议栈初始化
(2)代码编写:
CUBEMX生成工程代码后,只需要编写如下函数即可实现网络初始化,实现和电脑网络以太网连接:
-
主循环中必须调用
MX_LWIP_Process()
,否则网络栈不能正常工作,若不周期性调用,则导致网络数据包未及时处理,无法建立连接。 -
需要初始化的时候给复位引脚一个脉冲,使PHY芯片开始工作。
HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_RESET); HAL_Delay(55); HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_SET); HAL_Delay(55);
-
如果PHY芯片还是初始化不成功,则在MX_LWIP_Init()运行之前加入5-10s的延时。
-
由于这个版本LWIP库的原因,需要我们在程序中手动设置PHY芯片的地址,根据上文分析,PHY芯片地址为0X00:
-
如下为初始化代码,完成下买的代码即可PING通:
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_USART1_UART_Init();
MX_USART6_UART_Init();
MX_LWIP_Init();
/* USER CODE BEGIN 2 */
//芯片复位
HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_RESET);
HAL_Delay(55);
HAL_GPIO_WritePin(ETH_RESET_GPIO_Port, ETH_RESET_Pin, GPIO_PIN_SET);
HAL_Delay(55);
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* LWIP协议栈定时任务处理 */
MX_LWIP_Process();
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
(3)网络PING测试:
编译并烧写程序后,使用PC机的CMD命令行输入:
如果能够ping通,说明硬件连接、LWIP协议栈工作正常。
四、注意事项与调试:
- LAN8720供电电压为3.3V。
- 必须确保LAN8720芯片接收到50MHz外部时钟,否则通讯无法正常进行。
- 网络线连接方式需采用交叉线或连接到交换机。
- 代码编写部分需要特别注意一下。