前段时间,项目中用到 STM32H743 的网络通信功能,一开始遇到不少问题,在网上查找了相关的教程,发现遇到此问题的还不在少数。现总结一下最简单的方法移植Lwip网络协议栈实现 STM32H743 的网络通信功能。
一、开发平台
- 开发环境:MDK5.30
- 移植驱动:STM32Cube_FW_H7_V1.9.0
- 硬件平台:STM32H743VITX + LAN8742
二、开发流程
目前,是在 STM32Cube_FW_H7_V1.9.0 的基础上应用 NUCLEO-H743ZI 的 Lwip 例程,主要有一处修改项,就是网络相关管脚的分配。也就是说如果自己的开发硬件和 NUCLEO-H743ZI 的硬件在网络相关管脚分配不一致时,需要修改成自己的。如下代码所示。
/* Ethernet pins configuration ************************************************/ /* RMII_REF_CLK ----------------------> PA1 RMII_MDIO -------------------------> PA2 RMII_MDC --------------------------> PC1 RMII_MII_CRS_DV -------------------> PA7 RMII_MII_RXD0 ---------------------> PC4 RMII_MII_RXD1 ---------------------> PC5 RMII_MII_RXER ---------------------> PG2 RMII_MII_TX_EN --------------------> PG11 RMII_MII_TXD0 ---------------------> PG13 RMII_MII_TXD1 ---------------------> PB13 */ /* Configure PA1, PA2 and PA7 */ GPIO_InitStructure.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStructure.Mode = GPIO_MODE_AF_PP; GPIO_InitStructure.Pull = GPIO_NOPULL; GPIO_InitStructure.Alternate = GPIO_AF11_ETH; GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_7; HAL_GPIO_Init(GPIOA, &GPIO_InitStructure); /* Configure PB13 */ GPIO_InitStructure.Pin = GPIO_PIN_11; HAL_GPIO_Init(GPIOB, &GPIO_InitStructure); /* Configure PC1, PC4 and PC5 */ GPIO_InitStructure.Pin = GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5; HAL_GPIO_Init(GPIOC, &GPIO_InitStructure); /* Configure PG2, PG11, PG13 and PG14 */ GPIO_InitStructure.Pin = GPIO_PIN_13 | GPIO_PIN_14; HAL_GPIO_Init(GPIOG, &GPIO_InitStructure);
除此之外,也要注意 LAN8742 的复位引脚的设置。例如,正点原子的开发板对 LAN8742 复位引脚的处理就是通过另一个芯片实现的,所以这一点要注意。
三、STM32H743 网络通信验证
修改完上述代码之后,编译下载,插上网线,并确保电脑的 IP 地址与 STM32H743 的 IP 处于同一局域网中,然后在命令窗口中查看局域网中的 IP 地址,可以看到 STM32H743 的 IP,并通过 ping 命令,也可以 ping 通,如下图所示。
另外,在浏览器中打开 STM32H743 的 IP 地址,就可以看到如下界面了。
可以看出,STM32H743 的网络通信验证成功。
其实这里除了移植 Lwip 外,还移植了 RTOS 嵌入式操作系统,详细的代码分析,后续介绍。
另外,在 STM32CubeMX 中创建网络通信功能的实验,后续再作补充。