Expand description


stm32f3xx-hal contains a multi device hardware abstraction on top of the peripheral access API for the STMicro STM32F3 series microcontrollers.


HAL (meaning Hardware Abstraction Layer) is a generic term used in many contexts, but in the specific context of this crate, it is meant to abstract away the control exposed by the devices “peripheral access crate” to simplify initialization routines, with a robust interface avoiding miss-configurations while still not abstracting away too much.

Also, this crate’s goal is to integrate well with the rest of the rust embedded ecosystem, for example by implementing the embedded_hal traits or using crates like embedded_time, or rtcc.

Basic Usage


use cortex_m::asm;
use cortex_m_rt::entry;
use panic_halt as _;
use stm32f3xx_hal::{self as hal, pac, prelude::*};

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

      let mut rcc = dp.RCC.constrain();
      let mut gpioe = dp.GPIOE.split(&mut rcc.ahb);

      let mut led = gpioe
            .into_push_pull_output(&mut gpioe.moder, &mut gpioe.otyper);

      loop {

Cargo features

Target chip selection

This crate requires you to specify your target chip as a feature.

Please select one of the following (x denotes any character in [a-z]):

  • stm32f301x6, stm32f301x8, stm32f318x8
  • stm32f302x6, stm32f302x8, stm32f302xb, stm32f302xc, stm32f302xd, stm32f302xe
  • stm32f303x6, stm32f303x8, stm32f303xb, stm32f303xc, stm32f303xd, stm32f303xe
  • stm32f328x8
  • stm32f358xc
  • stm32f398xe
  • stm32f373x8, stm32f373xb, stm32f373xc, stm32f378xc
  • stm32f334x4, stm32f334x6, stm32f334x8

Example: The STM32F3Discovery board has a STM32F303VCT6 chip. So you need to specify stm32f303xc in your Cargo.toml (note that VC → xc).

For more information, see the README.


When this feature is enabled the memory.x linker script for target chip is automatically provided by this crate. See cortex-m-rt document for more info.


This feature enables stm32f3’s rt feature. See cortex-m-rt document for more info.


Enable CAN peripherals on supported targets. The can implementation of the interface is backed by bxcan


Enable USB peripherals on supported targets via the stm32-usbd crate.


Enables RTC support, build upon rtcc crate.


Enable functions, which leverage enumset. This is especially usefull to get all set status events at once, see for example serial::Serial::triggered_events()


Currently these are only used for panicking calls, like assert! panic! or unwrap(). These are enabled using the defmt filter. For now defmt is mostly intended for internal development and testing to further reduce panicking calls in this crate. The support of this feature is subject to change as the development of defmt is advancing.

To use this feature follow the Application Setup of the defmt-book.


pub use embedded_hal as hal;
pub use nb;
pub use embedded_time as time;


Analog to Digital Converter.

Controller Area Network.


Direct memory access (DMA) controller.

Flash memory

General Purpose Input / Output

Inter-Integrated Circuit (I2C) bus

Common Interrupt interface defintions shared between peipherals.

Peripheral access Peripheral access API for STM32F303 microcontrollers (generated using svd2rust v0.19.0 ( ))


Pulse width modulation

Reset and Clock Control

Real Time Clock


Device electronic signature

Serial Peripheral Interface (SPI) bus

System configuration controller


USB peripheral.



Turns the non-blocking expression $e into a blocking operation.


A generic Error type for failable integer to enum conversions used in multiple occasions inside this crate.


Toggle something on or off.

Enable use of interrupt macro. Enumeration of all the interrupts.

Attribute Macros

Enable use of interrupt macro.