STM32-HAL

Crate Docs

This library provides access to STM32 peripherals that are similar across families. It's based on the STM32 Peripheral Access Crates generated by svd2rust.

It provides a consistent API across multiple families, with minimal code repetition. This makes it easy to switch MCUs within, or across families, for a given project.

Motivation: Use STM32s in real-world hardware projects. Be able to switch MCUs with minimal code change.

Design priority: Get hardware working with a robust feature set. As of this library's creation, this is not feasible with existing HAL crates due to lack of maintainer time, and differing priorities. When the stm32fyxx ecosystem is viewed as a whole, there's a lot of DRY.

Getting started

Review the syntax overview example for example uses of many of this library's features. Copy and paste the whole example folder (It's set up using Knurling's app template), or copy parts of Cargo.toml and main.rs as required.

Example highlights:

```rust use cortexmrt::entry; use stm32hal::{ clocks::Clocks, gpio::{GpioB, PinNum, PinMode, OutputType, AltFn}, i2c::{I2c, I2cDevice}, lowpower, pac, timer::{Event::TimeOut, Timer}, };

[entry]

fn main() -> ! { let mut cp = cortex_m::Peripherals::take().unwrap(); let mut dp = pac::Peripherals::take().unwrap();

let clocks = Clocks::default();
clocks.setup(&mut dp.RCC, &mut dp.FLASH).unwrap();

let mut gpiob = GpioB::new(dp.GPIOB, &mut dp.RCC);
let mut pb15 = gpioa.new_pin(PinNum::P15, PinMode::Output);
pb15.set_high().ok();

let mut timer = Timer::tim3(dp.TIM3, 0.2, &clocks, &mut dp.RCC);
timer.listen(TimeOut);

let mut scl = gpiob.new_pin(PinNum::P6, PinMode::Alt(AltFn::Af4));
scl.output_type(OutputType::OpenDrain, &mut gpiob.regs);

let mut sda = gpiob.new_pin(PinNum::P7, PinMode::Alt(AltFn::AF4));
sda.output_type(OutputType::OpenDrain, &mut gpiob.regs);

let i2c = I2c::new(dp.I2C1, I2cDevice::One, 100_000, &clocks, &mut dp.RCC);

loop {
    low_power::sleep_now(&mut cp.SCB);
}

} ```

The library is heavily influence by the stm32fyxx HALs, and a number of the modules here are modified versions of those.

The intent isn't to support every STM32 family: Main support will be for newer ones, like L4, L5, H7, and U5.

Most peripheral modules are independent: The only dependency they have within this library is the ClockCfg trait, which we may move to a standalone crate later. This makes it easy to interchange them with other projects.

Pre-release. Currently supports F3, L4, and L5, G4, and H7.

PRs encouraged. Documenting each step using reference manuals is encouraged, but not required.