摘要
本指南说明意法半导体(ST)怎么在 STM32H7 板上用轻量级 Mongoose 网络库把以太网 TCP/IP 拉起来,参考板是 NUCLEO-H723ZG。
步骤:建 STM32CubeMX 工程,配以太网、UART 调试、LED 与 RNG,再经 CubeMX software pack 加入 Mongoose,让工程自动带上源文件与 include 路径。
引言
本指南按步骤把 Mongoose 网络库集成进 STM32H7 固件,做以太网连接。集成后可用嵌入式 Web 仪表盘、MQTT 远程控制、TLS,以及空中(OTA)固件更新。目标很简单:在 STM32H7 上拉起 TCP/IP,跑一个 “Hello world” 嵌入式 Web 服务器,后面再叠更复杂的联网功能。
Mongoose 是轻量、开源、双许可的网络库,就两个文件,自带嵌入式 Web 服务器与网络栈。可以跟 lwIP 等现有 TCP/IP 栈一起用,也可以只用内建栈。TLS 也灵活:Mbed TLS、WolfSSL 等外部库,或 Mongoose 自带 TLS。
想快一点、少踩坑,建议先用内建网络栈。本指南用 NUCLEO-H723ZG;带内建以太网 MAC 的其他 STM32 也可照做。
附件含预配置 h723.ioc。想尽快出结果:用该 *.ioc 生成工程,用提供的 main.c 替换 Core/Src/main.c,用提供的 STM32H723XG_FLASH.ld 改链接脚本,构建并烧录即可。
前置条件
安装:
- STM32CubeMX
- 最新 STM32H7 HAL 驱动
- I-CUBE-Mongoose 包
- Visual Studio Code 的 STM32CubeIDE 扩展
- STM32CubeProg
硬件:NUCLEO-H723ZG。
1. 配置外设
用 STM32CubeMX 从零配置所需外设。
打开 STM32CubeMX。File → New project,在料号栏输入 “H723ZG”,选中微控制器,点击 [Start project]。
出现存储器保护单元对话框时点 [Yes]。在 Project Manager 选项卡设置工程目录与名称;堆 64Kb,栈 8Kb。
Clock Configuration 选择最大系统频率并按 Enter 自动配置。
配置 LED、以太网 MAC、串口调试 UART 以及用于 TLS 的 RNG。各开发板引脚见对应用户手册;下表提供所需引脚速览:
| 板 | UART TX/RX | Ethernet | LED |
| Nucleo-H723ZG | USART3, PD8, PD9 | PA1, PA2, PA7, PC1, PC4, PC5, PB13, PG11, PG13 | PB0, PE1, PB14 |
| STM32H747I-DISCO | USART1, PA9, PA10 | PA1, PA2, PA7, PC1, PC4, PC5, PG11, PG12, PG13 | PI12, PI13, PI14 |
| STM32H735G-DK | USART3, PD8, PD9 | PA1, PA2, PA7, PC1, PC4, PC5, PB11, PB12, PB13 | PC3, PC2 |
| STM32H573I-DK | USART1, PA9, PA10 | PA1, PA2, PA7, PC1, PC4, PC5, PG11, PG12, PG13 | PI8, PI9, PF1 |
| NUCLEO-N657X0-Q | USART1, PE5, PE6 | PF4, PF5, PF7, PF10, PF11, PF12, PF13, PF14, PF15 | PG0, PG8, PG10 |
| NUCLEO-H563ZI | USART3, PD8, PD9 | PA1, PA2, PA7, PC1, PC4, PC5, PB15, PG11, PG13 | PB0, PF4, PG4 |
| NUCLEO-H7S3L8 | USART3, PD8, PD9 | PA2, PA7, PB6, PG4, PG5, PG6, PG11, PG12, PG13 | PD10, PD13, PB7 |
| NUCLEO-H745ZI-Q | USART3, PB10, PB11 | PA1, PA2, PA7, PC1, PC4, PC5, PB13, PG11, PG13 | PI13, PJ2, PD3 |
| NUCLEO-H755ZI-Q | USART3, PD8, PD9 | PA1, A2, A7, C1, C4, C5, G11, G12, PG13 | PB0, PE1, PB14 |
| NUCLEO-H753ZI | USART3, PD8, PD9 | PA1, PA2, PA7, PC1, PC4, PC5, PB11, PB12, PB13 | PC3, PC2, PC2 |
| NUCLEO-H743ZI | USART3, PD8, PD9 | PA1, PA2, PA7, PC1, PC4, PC5, PB13, PG11, PG13 | PB0, PE1, PB14 |
| NUCLEO-Fxxxxx | USART3, PD8, PD9 | PA1, PA2, PA7, PC1, PC4, PC5, PB13, PG11, PG13 | PB0, PB7, PB14 |
在 Pinout & Configuration → System Core → GPIO,将 LED 脚设为 [GPIO_Output]。
Security 中选择 RNG,Mode = [Activated]。
Connectivity 中将 USART 设为 [Asynchronous mode] 并配置 Tx/Rx;将 ETH 设为 [RMII mode] 并配置以太网引脚,确保与上表一致。
2. 生成工程
在 Project Manager 选择目标 IDE,点击 [Generate Code]。本指南使用 VS Code STM32,故选择 CMake。
生成后在 VS Code 中打开该目录,先构建确认无错误。
3. 加入 Mongoose
可以把 GitHub(https://github.com/cesanta/mongoose)上的 mongoose.c / mongoose.h 拷进来,自己写一行 mongoose_config.h;更省事的是走 STM32CubeMX:Mongoose 已作为 middleware,能自动配 include,并带 Web dashboard、MQTT 等模块(后续文章再写)。
Pinouts & Configuration → Software Packs → Manage Software Packs → [Cesanta] → [Refresh],安装最新 I-CUBE-Mongoose(确保 7.21.4 或更高)。
Software Packs → Select Components,选中全部 Mongoose 组件。Middleware and Software Packs → [I-CUBE-Mongoose],使能 [Mongoose Networking Core],再 [Generate Code]。
将加入 Middlewares/Third_Party/Cesanta_Mongoose/,含 mongoose.c、mongoose.h、mongoose_config.h。
在 Core/Src/main.c 的用户代码块中包含:
/* USER CODE BEGIN Includes */ #include "mongoose.h" /* USER CODE END Includes */
在 USER CODE BEGIN 0 加入 _write(将 printf 重定向到串口)以及简单 HTTP 事件处理:
/* USER CODE BEGIN 0 */ int _write(int fd, unsigned char *buf, int len) { HAL_UART_Transmit(&huart3, buf, len, HAL_MAX_DELAY); return len; } static void http_ev_handler(struct mg_connection *c, int ev, void *ev_data) { if (ev == MG_EV_HTTP_MSG) { mg_http_reply(c, 200, "", "Hi from Mongoose! Tick %lu\r\n", HAL_GetTick()); } } /* USER CODE END 0 */
在 main 中初始化并运行 Mongoose:
/* USER CODE BEGIN WHILE */ struct mg_mgr mgr; mg_mgr_init(&mgr); mg_http_listen(&mgr, "http://0.0.0.0:80", http_ev_handler, NULL); while (1) { mg_mgr_poll(&mgr, 0);
Mongoose 用事件驱动处理连接,单任务里也能管多连接。若用 RTOS,把事件循环放独立任务,栈大约 8 KB。RTOS 与裸机都能跑。
4. 编辑链接脚本
打开 STM32H723XG_FLASH.ld,在 .bss (NOLOAD) 之前加入:
.eth_ram : { *(.eth_ram .eth_ram*) } > RAM_D2 AT > FLASH
以太网 MAC 用 DMA 传数据;驱动用 .eth_ram ELF 段定义 DMA 缓冲,必须放在以太网 DMA 够得到的存储器区域。不改的话,.eth_ram 可能跟 .bss 落在同一片区域,DMA 够不着。STM32H723 见 RM0468 第 2.4 节。
5. 构建与运行
重新构建固件。打开串口控制台(Windows 可用 VS Code 集成终端、putty、Tera Term;Linux/macOS 可用 cu):
$ sudo cu -l /dev/cu.usb* -s 115200
确保板卡接入带 DHCP 的以太网(可用 USB 转以太网并开启共享)。用 STM32CubeProgrammer 烧录,或在 VS Code 创建自定义 task.json:
{ "version": "2.0.0", "tasks": [ { "label": "Flash STM32", "type": "shell", "command": "STM32_Programmer_CLI", "args": [ "-c", "port=SWD", "-w", "${workspaceFolder}/build/Debug/*.elf", "-v", "-rst" ], "problemMatcher": [] } ] }
按 Ctrl+P,选 Run Task,再选 “Flash STM32”。
烧录后串口应出现 Mongoose 调试日志(示例含 PHY ID LAN87x、DHCP、READY IP 等)。在浏览器打开该 IP,应看到 Web 服务器输出。
结论
到这里,STM32 已经跑起以太网 TCP/IP 和简单 Web 服务器。Mongoose 还有更多能力,后续文章再写。
来源:https://community.st.com/stm32-mcus-60/stm32h7-ethernet-with-mongoose-getting-started-guide-165096 参数以意法半导体官方最新资料为准。
34