H743 板级支撑(第一批)

相关仓库: - 网关产品仓:https://github.com/ffffxxxjjj/gateway - 参考仓 h743-hello:https://github.com/ffffxxxjjj/h743-hello - 签名打包服务 sign:https://github.com/ffffxxxjjj/sign

本文件是网关仓 H743 板级支撑的唯一说明。板子是模组星球 STM32H743VIT6 双网口板(卖家原理图)。以后开发调试全部在 gateway 仓里弄,h743-hello 不再开发、只作参考。

1. 移植了什么(第一批,仅限以下)

内容 位置 说明
引脚定义 boards/h743/src/pins.rs 全套引脚表(见第 2 节),W5500/存储/CAN/USB 只列定义
芯片唯一号 boards/h743/src/uid.rs H7 地址 0x1FF1E800,网卡地址与随机种子由此派生
串口初始化 boards/h743/src/uart.rs 调试 USART1、485 UART7、485 UART8(阻塞模式,115200 8N1)
内网口带起 boards/h743/src/net.rs PC0 复位 + MDIO 扫芯片 + RMII + embassy-net(DHCPv4)+ Runner 任务
应用骨架 app/src/main.rs 时钟 + 串口 + 内网口带起 + 链路/IP 变化日志 + 心跳(无应用逻辑)
构建配置 boards/h743/、app/ 各自的 Cargo.toml、.cargo/config.toml 见第 4 节
内存布局 app/memory.x 应用 FLASH 在 bank2 0x08100000,RAM 用 AXI SRAM 0x24000000 512K
打包脚本 app/package.sh、app/tools/stamp_version.py 编 → 转 bin → 打版本块(格式 2,bin 偏移 0x1000)→ 放 dist/
链接脚本 app/link.x 基于 cortex-m-rt 0.7 link.x.in,插入 .version_block 在 Flash+0x1000

2. 引脚表(模组星球 STM32H743VIT6 板,卖家原理图)

内网口(RJ45-1):LAN8720A + MCU 内置 MAC,RMII

信号 MCU 引脚
RMII_REF_CLK PA1(PHY 的 REFCLKO 输出 50MHz,PHY 自带 25MHz 晶振)
RMII_CRS_DV PA7
RMII_RXD0 PC4
RMII_RXD1 PC5
RMII_TX_EN PB11
RMII_TXD0 PB12
RMII_TXD1 PB13
ETH_MDIO PA2
ETH_MDC PC1
PHY 复位 nRST PC0

外网口(RJ45-2):W5500,SPI4(只列定义,本批不写 W5500 代码)

信号 MCU 引脚
SPI4_SCK PE12
SPI4_MISO PE13
SPI4_MOSI PE14
SPI4_NSS(片选) PE11
W5500_RST PE15
W5500_INT PB1

W5500 自带 25MHz 晶振。W5500 先不弄(用户定暂缓),现阶段 LAN8720 单网口(Modbus 轮询与 MQTT 上云都走 LAN8720,因为 内网口已能上外网)。

串口(网关应用实际用的三路)

接口 TX RX 备注
USART1 PA9 PA10 DAPLink 调试串口插座(卖家确认)
UART7 PE8 PE7 接 485 收发器(以芯片功能为准:PE8=TX、PE7=RX)
UART8 PE1 PE0 接 485 收发器(PE1=TX、PE0=RX)

串口(本批不用,只列定义)

接口 TX RX 备注
USART2 PD5 PD6 板上标 ESP(TXD/RXD)
USART3 PD8 PD9 板上标 232(hello 里曾用 PB10/PB11,与引脚表不一致,网关不用它)
USART6 PC6 PC7 hello 六路全撒网的候选之一,网关不用
UART4 PA0 PA1 hello 六路全撒网的候选之一,网关不用(PA1 与内网口 RMII 参考时钟冲突)

存储 / CAN / USB(只列定义,本批不用)

时钟

芯片唯一号

板卡其他引脚(LED/按键/SWD/DCMI,pins.rs 未定义)见 docs/pinmap-h743.md 附录(同目录有 HTML 版)。

3. 没移植什么(留给以后批次,碰都不要碰)

4. 构建配置

结构(网关是三平台产品仓,不只 H743)

gateway/
├── bootloader/        # 启动加载器(已验完,第一批不动它)
├── boards/
│   └── h743/          # H743 板级支撑库(本批新增,包名 h743-board)
│       ├── Cargo.toml
│       ├── .cargo/config.toml
│       └── src/       # lib.rs、pins.rs、uid.rs、uart.rs、net.rs
├── app/               # 网关应用骨架(本批新增,包名 gateway-app)
│   ├── Cargo.toml
│   ├── .cargo/config.toml
│   ├── memory.x       # 应用内存布局(bank2)
│   ├── link.x         # 自定义链接脚本(版本块留位)
│   ├── build.rs       # 拷 memory.x + link.x 到 OUT_DIR
│   ├── package.sh     # 打包脚本(编 → 转 bin → 打版本块 → dist/)
│   ├── tools/
│   │   └── stamp_version.py
│   └── src/
│       └── main.rs
└── docs/
    ├── board-h743.md  # 本文件
    └── firmware-version-block.md

板级支撑放成干净的 H743 板级模块(boards/h743/ 下), 不要把 H743 专属代码散在应用根目录(以后要加别的平台)。 两个新 crate 是独立 crate(不是虚拟工作区成员), 应用用路径依赖引用板级库(h743-board = { path = "../boards/h743" }), 与 bootloader 的独立 crate 做法一致(bootloader 不是工作区成员, 是独立 crate;本批不改 bootloader,不动它的结构)。

目标与工具链

发布版配置(原版照抄,一字不动)

[profile.release]
opt-level = "s"
lto = true
codegen-units = 1
panic = "abort"
debug = false
overflow-checks = false

[profile.release.package.embassy-stm32]
opt-level = 0

这是 2026-10-24 已验证配方:全局 "s" + embassy-stm32 单库 opt-level=0。hello 里 opt 2/3/"s" 单独用都死于时钟初始化同一行; 现行两个仓只有全局 "s" 的偏离版绝不用。 出货那一发必须真板冒烟(发哪一发、测哪一发)。

内存布局

5. 版本块留位(链接器)

应用的链接脚本(app/link.x,基于 cortex-m-rt 0.7 link.x.in 改) 在 Flash 布局里给版本块留了固定位置(其余逐字照抄):

打包脚本(app/package.sh)流程:编 → 转 bin → 打版本块 → 放 dist/ 带版本号命名。版本块格式见 docs/firmware-version-block.md(格式 2,bin 偏移 0x1000, 228 字节;型号 stm32h743vi,固件名 gateway,版本取 app/Cargo.toml,构建日期/时间取打包时的 UTC 时间)。 打戳安全规则:目标区域全零才写;已等于要写的版本块则幂等跳过; 目标区域是其他内容(代码/数据,说明链接器没有留位)则失败退出, 绝不覆盖代码。hello 的打包脚本没有打版本块这步(hello 的 bin 不需要被 sign-tool 打包);网关应用的打包脚本必须补这步, 否则 sign-tool pack 读不到身份,无法打包。

6. 怎么编(Mac 命令)

前置:装 Rust(rustup)+ thumbv7em-none-eabihf 目标 + probe-rs (烧录用)+ Python 3(打版本块用,标准库即可)。

# 1. 拉仓(gateway 仓,main 分支)
#    (按用户本地已有流程拉取,本批不改拉取方式)

# 2. 编板级库(芯片目标,显式带 --target;板级库不设默认目标)
cd boards/h743
cargo build --target thumbv7em-none-eabihf

# 3. 纯函数单文件测试(主机上跑,不用 cargo test)
rustc --test boards/h743/src/uid.rs -o /tmp/uid_test && /tmp/uid_test
# 预期:3 passed(网卡地址、种子精确值、种子确定性/敏感性)

# 4. 编应用(debug;应用设了默认目标,不带 --target 也往芯片编,
#    但显式带 --target 更清楚)
cd app
cargo build --target thumbv7em-none-eabihf

# 5. 编应用(release,发布版用已验证配方)
cargo build --target thumbv7em-none-eabihf --release

# 6. 打包(编 → 转 bin → 打版本块 → dist/,默认 debug)
./package.sh
# release 打包:
./package.sh release
# 产物:dist/gateway-app-v0.1.0.bin(debug)
#       dist/gateway-app-v0.1.0-release.bin(release)

# 7. 烧录(DAPLink,芯片型号 STM32H743VI)
#    注意:本批只给命令,烧录由用户操作(板上验证由用户跑日志)。
probe-rs run --chip STM32H743VI target/thumbv7em-none-eabihf/debug/gateway-app
# release:
probe-rs run --chip STM32H743VI target/thumbv7em-none-eabihf/release/gateway-app

7. 板上验证(等用户跑日志)

接线:DAPLink 调试串口(USART1,PA9 TX / PA10 RX)接电脑串口 (115200 8N1);内网口(RJ45-1,LAN8720)接交换机/路由器 (能 DHCP 分配地址);485 口本批只初始化、不收发,不用接线。

上电后,调试串口(USART1)应先出现一行横幅(应用写出):

gateway-app skeleton: board up, USART1 OK

随后 defmt RTT 日志(probe-rs run 的输出)应依次出现:

gateway-app skeleton: board up
485 UART7 init OK (PE8 TX / PE7 RX)
485 UART8 init OK (PE1 TX / PE0 RX)
UID 0x........ 0x........ 0x........(本板芯片唯一号,每块板不同)
MAC 02:..:..:..:..:..(由唯一号派生,首字节固定 02)
PHY found at MDIO addr ..: id 0x........(LAN8720 芯片编号)
LAN up: PHY 0x........, MAC 02:..:..:..:..:..
link UP
DHCP IP ...(由路由器分配的地址)
heartbeat(每 10 秒一次,证明板子活着)

若某一步不对,先看日志定位,再贴回日志

defmt 日志零输出

板上验证结果(日志)贴回后,再定下一步(Modbus/MQTT/应用逻辑 是后续批次,本批不做)。

8. 本批文件清单

新增:

改动:

未动: