#arm #cortex-m #stm32f4xx #hal

no-std stm32f4xx-hal

Peripheral access API for STM32F4 series microcontrollers

31 unstable releases

0.16.0 May 7, 2023
0.15.0 Mar 13, 2023
0.14.0 Dec 13, 2022
0.13.2 May 16, 2022
0.2.5 Nov 17, 2018

#23 in Embedded development

Download history 2735/week @ 2023-02-06 2281/week @ 2023-02-13 2261/week @ 2023-02-20 1724/week @ 2023-02-27 2269/week @ 2023-03-06 2018/week @ 2023-03-13 2085/week @ 2023-03-20 1947/week @ 2023-03-27 1764/week @ 2023-04-03 1842/week @ 2023-04-10 1707/week @ 2023-04-17 1904/week @ 2023-04-24 1925/week @ 2023-05-01 2340/week @ 2023-05-08 2712/week @ 2023-05-15 2355/week @ 2023-05-22

9,800 downloads per month
Used in 38 crates

0BSD license

20K SLoC


Crates.io Crates.io Released API docs Minimum Supported Rust Version Continuous integration Bors enabled

stm32f4xx-hal contains a multi device hardware abstraction on top of the peripheral access API for the STMicro STM32F4 series microcontrollers. The selection of the MCU is done by feature gates, typically specified by board support crates. Currently supported configurations are:

  • stm32f401
  • stm32f405
  • stm32f407
  • stm32f410
  • stm32f411
  • stm32f412
  • stm32f413
  • stm32f415
  • stm32f417
  • stm32f423
  • stm32f427
  • stm32f429
  • stm32f437
  • stm32f439
  • stm32f446
  • stm32f469
  • stm32f479

The idea behind this crate is to gloss over the slight differences in the various peripherals available on those MCUs so a HAL can be written for all chips in that same family without having to cut and paste crates for every single model.

Other optional features

  • rtic — support monotonic timers that can be used by RTIC framework.
  • defmt — implementation of defmt::Format for public enums and structures. See defmt.
  • can — bxCAN peripheral support. See bxcan.
  • i2s — I2S peripheral support. See stm32_i2s_v12x.
  • usb_fs or usb_hs — USB OTG FS/HS peripheral support. See synopsys-usb-otg.
  • fsmc_lcd — LCD support via FMC/FSMC peripheral. See display-interface.
  • sdio-host — SDIO peripheral support. See sdio-host.

Collaboration on this crate is highly welcome as are pull requests!

This crate relies on Adam Greigs fantastic stm32f4 crate to provide appropriate register definitions and implements a partial set of the embedded-hal traits.

Some of the implementation was shamelessly adapted from the stm32f1xx-hal crate originally started by Jorge Aparicio.

Setting up your project

Check if the BSP for your board exists in the stm32-rs page. If it exists, the stm32f4xx-hal crate should be already included, so you can use the bsp as BSP for your project.

Otherwise, create a new Rust project as you usually do with cargo init. The "hello world" of embedded development is usually to blink a LED. The code to do so is available in examples/delay-syst-blinky.rs. Copy that file to the main.rs of your project.

You also need to add some dependencies to your Cargo.toml:

embedded-hal = "0.2"
nb = "1"
cortex-m = "0.7"
cortex-m-rt = "0.7"
# Panic behaviour, see https://crates.io/keywords/panic-impl for alternatives
panic-halt = "0.2"

version = "0.16.0"
features = ["stm32f407"] # replace the model of your microcontroller here
                         # and add other required features

We also need to tell Rust how to link our executable and how to lay out the result in memory. To accomplish all this, copy .cargo/config and memory.x from the stm32f4xx-hal repository to your project and make sure the sizes match up with the datasheet. Also note that there might be different kinds of memory which are not equal; to be on the safe side only specify the size of the first block at the specified address.


0-clause BSD license.


~1.5M SLoC