#以太网 #stm32 #stm32f4 #stm32f7 #eth

无 std stm32-eth

STM32 MCU 系列嵌入式 Rust 以太网驱动程序

13 个不稳定版本 (6 个破坏性更新)

0.6.0 2024年3月16日
0.5.2 2023年9月21日
0.5.0 2023年7月26日
0.4.1 2023年2月10日
0.0.0 2018年4月25日

#49 in 嵌入式开发

Apache-2.0

145KB
3K SLoC

Rust 以太网驱动程序,支持 STM32F* 微控制器

支持的微控制器

  • STM32F107
  • STM32F4xx
  • STM32F7xx

欢迎提交拉取请求 :)

用法

将以下之一添加到你的 [dependencies] 部分中(指定正确的 MCU)

stm32-eth = { version = "0.6.0", features = ["stm32f429"] } # For stm32f4xx-like MCUs
stm32-eth = { version = "0.6.0", features = ["stm32f767"] } # For stm32f7xx-like MCUs
stm32-eth = { version = "0.6.0", features = ["stm32f107"] } # For stm32f107

stm32_eth 将底层 HAL 作为 stm32_eth::hal 重新导出。

src/main.rs 中添加

use stm32_eth::{
    hal::gpio::GpioExt,
    hal::rcc::RccExt,
    stm32::Peripherals,
    dma::{RxRingEntry, TxRingEntry},
    EthPins,
};
use fugit::RateExtU32;

fn main() {
    let p = Peripherals::take().unwrap();

    let rcc = p.RCC.constrain();
    // HCLK must be at least 25MHz to use the ethernet peripheral
    let clocks = rcc.cfgr.sysclk(32.MHz()).hclk(32.MHz()).freeze();

    let gpioa = p.GPIOA.split();
    let gpiob = p.GPIOB.split();
    let gpioc = p.GPIOC.split();
    let gpiog = p.GPIOG.split();

    let eth_pins = EthPins {
        ref_clk: gpioa.pa1,
        crs: gpioa.pa7,
        tx_en: gpiog.pg11,
        tx_d0: gpiog.pg13,
        tx_d1: gpiob.pb13,
        rx_d0: gpioc.pc4,
        rx_d1: gpioc.pc5,
    };

    let mut rx_ring: [RxRingEntry; 16] = Default::default();
    let mut tx_ring: [TxRingEntry; 8] = Default::default();

    let parts = stm32_eth::PartsIn {
        mac: p.ETHERNET_MAC,
        mmc: p.ETHERNET_MMC,
        dma: p.ETHERNET_DMA,
        ptp: p.ETHERNET_PTP,
    };

    let stm32_eth::Parts { dma: mut eth_dma, mac: _, ptp: _ } = stm32_eth::new(
        parts,
        &mut rx_ring[..],
        &mut tx_ring[..],
        clocks,
        eth_pins,
    )
    .unwrap();
    eth_dma.enable_interrupt();

    loop {
        if let Ok(pkt) = eth_dma.recv_next(None) {
            // handle received pkt
        }

        let size = 42;
        eth_dma.send(size, None, |buf| {
            // write up to `size` bytes into buf before it is being sent
        }).expect("send");
    }
}

use stm32_eth::stm32::interrupt;
#[interrupt]
fn ETH() {
    stm32_eth::eth_interrupt_handler();
}

smoltcp 支持

使用功能标志 smoltcp-phy

为了正确使用 smoltcp,你还需要激活额外的 smoltcp 功能。你可以通过将与你自己的 Cargo.tomlstm32-eth 相同版本的 smoltcp 依赖项添加到其中,并激活所需的功能来实现。

示例

这些示例应该在具有符合 802.3 规范的 PHY 并能生成所需 50 MHz 时钟信号的任何 MCU 上运行和编译,该 PHY 连接到默认的 RMII 引脚。

示例使用 defmtdefmt_rtt 进行日志记录,并通过 defmt_rtt 使用 panic_probe 打印 panic 追踪。

替代引脚配置,HSE & PPS

如果你的开发板具有连接到正确引脚的高速外部振荡器,可以通过在编译时将 STM32_ETH_EXAMPLE_HSE 环境变量设置为 oscillatorbypass 来激活 HSE 配置。

如果你的开发板使用 nucleo 引脚分配(PG11 和 PG13 而不是 PB11 和 PB12),可以通过在编译时将 STM32_ETH_EXAMPLE_PINS 环境变量设置为 nucleo 来更改引脚配置。

如果您希望使用替代的 PPS 输出引脚(PG8 而不是 PB5)来配置 rtic-timestamp 示例,可以在编译时将环境变量 STM32_ETH_EXAMPLE_PPS_PIN 设置为 alternate 以更改引脚配置。

构建示例

要构建示例,请运行以下命令

cargo build --release --example <example> \
    --features <MCU feature>,<additional required features> \
    --target <MCU compilation target>

例如,如果我们想为 stm32f429 构建示例,应运行以下命令

cargo build --release --example ip \
        --features stm32f429,smoltcp-phy \
        --target thumbv7em-none-eabihf

如果我们想为带有 HSE 振荡器的 Nucleo-F767ZI 构建 arp 示例

STM32_ETH_EXAMPLE_HSE=bypass STM32_ETH_EXAMPLE_PINS=nucleo \
cargo build --release --example arp \
    --features stm32f767

运行示例

使用 cargo install probe-run --version '~0.3' 安装 probe-run

probe-run --list-chips 提供的列表中找到您 MCU 的 PROBE_RUN_CHIP 正确值。

确保 probe-run 可以连接到您的 MCU

然后,运行以下命令

DEFMT_LOG=info PROBE_RUN_CHIP=<probe-run chip> \
cargo run --release --example <example> \
    --features <MCU feature>,<additional required features> \
    --target <MCU compilation target>

例如,如果我们想在 STM32F107RCT6 上运行 rtic-echo 示例,应运行以下命令

DEFMT_LOG=info PROBE_RUN_CHIP=STM32F107RC \
cargo run --release --example rtic-echo \
    --features stm32f107,smoltcp-phy \
    --target thumbv7m-none-eabi

或者,如果我们想在带有 HSE 振荡器的 Nucleo-F767ZI 上运行 arp 示例

DEFMT_LOG=info PROBE_RUN_CHIP=STM32F767ZGTx \
STM32_ETH_EXAMPLE_PINS=nucleo STM32_ETH_EXAMPLE_HSE=oscillator \
cargo run --release --example arp \
    --features stm32f767 \
    --target thumbv7em-none-eabihf

许可

所有源代码(包括代码片段)均受 Apache 许可证 2.0 版(LICENSEhttps://www.apache.org/licenses/LICENSE-2.0)许可。

贡献

除非您明确声明,否则您提交的任何有意包含在本作品中的贡献,如 Apache-2.0 许可证中定义,应按上述方式许可,不附加任何额外条款或条件。

依赖关系

~1-27MB
~760K SLoC