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 嵌入式开发
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.toml
中 stm32-eth
相同版本的 smoltcp
依赖项添加到其中,并激活所需的功能来实现。
示例
这些示例应该在具有符合 802.3 规范的 PHY 并能生成所需 50 MHz 时钟信号的任何 MCU 上运行和编译,该 PHY 连接到默认的 RMII 引脚。
示例使用 defmt
和 defmt_rtt
进行日志记录,并通过 defmt_rtt
使用 panic_probe
打印 panic 追踪。
替代引脚配置,HSE & PPS
如果你的开发板具有连接到正确引脚的高速外部振荡器,可以通过在编译时将 STM32_ETH_EXAMPLE_HSE
环境变量设置为 oscillator
或 bypass
来激活 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 版(LICENSE 或 https://www.apache.org/licenses/LICENSE-2.0)许可。
贡献
除非您明确声明,否则您提交的任何有意包含在本作品中的贡献,如 Apache-2.0 许可证中定义,应按上述方式许可,不附加任何额外条款或条件。
依赖关系
~1-27MB
~760K SLoC