Skip to content

rust-embedded/awesome-embedded-rust

Repository files navigation

Embedded Rust

Awesome

This is a curated list of resources related to embedded and low-level programming in the Rust programming language, including a selection of useful crates.

This project is developed and maintained by the Resources team.

Don't see something you want or need here? Add it to the Not Yet Awesome Embedded Rust list!

Table of Contents

Community

In 2018, the Rust community created an embedded working group to help drive adoption in the Rust ecosystem.

  • Embedded WG, including newsletters with progress updates.

Community Chat Rooms

Books, blogs, and training materials

Tools

  • xargo Rust package manager with support for non-default std libraries — build Rust runtime for your embedded system.
    • xargo is great, but since it's in maintenance mode, cargo-xbuild is catching up as its intended replacement.
  • svd2rust Generate Rust structs with register mappings from SVD files.
  • edc2svd Generate SVD files for PIC32 devices from EDC files. - crates.io
  • embedded-hal-mock Mock implementation of embedded-hal traits for testing without accessing real hardware. - crates.io
  • bindgen Automatically generates Rust FFI bindings to C and C++ libraries. - crates.io
  • cortex-m semihosting Semihosting for ARM Cortex-M processors
  • bobbin-cli A Rust command line tool to simplify embedded development and deployment.
  • ferros A Rust-based userland which also adds compile-time assurances to seL4 development.
  • cargo-flash A small cargo subcommand to download your binary to your target chip. - crates.io
  • cargo-embed A superset of cargo-flash with additional useful features like configuration file support, an RTT terminal, or a GDB server. - crates.io
  • cargo-hf2 A small cargo subcommand to download cargo builds to Microsoft UF2 bootloaders via HID USB . - crates.io
  • cargo-bloat Find out what takes most of the space in your executable.
  • cargo-call-stack Static, whole program stack usage analyzer.
  • cargo-dfu Cargo extension for flashing embedded rust programs via DFU.
  • espflash Serial flasher utility for Espressif SoCs and modules. - crates.io
  • espup Tool for installing and maintaining Espressif Rust ecosystem. - crates.io
  • uf2 Converts binary files to Microsoft's UF2 format for copying over to mass storage device uf2 bootloaders - crates.io
  • Knurling Tools are developed by Ferrous Systems to ease the development process for building, debugging, and testing embedded Rust systems. These tools include:
    • Probe Run: a cargo runner to flash and run embedded applications just like you would native applications, including backtraces and panicking behavior
    • defmt: a highly efficient logging framework that targets resource-constrained devices, like microcontrollers.
    • flip-link, a linker wrapper that provides stack overflow protection without an MMU by flipping the standard memory layout of ARM Cortex-M programs
    • app-template, a cargo-generate powered project template for quickly setting up new projects using the Knurling Tools.
    • defmt-test, an embedded test harness that lets you write and run unit tests as if you were using the built-in #[test] attribute, but will run on an embedded target
  • embedded-hal-compat, a compatibility layer to provide interoperability between v0.2.x and v1.x.x hal implementations and drivers
  • Embassy start is a GitHub repo template for setting up async embedded Rust projects that use Embassy. This particular template targets nRF hardware and networking using the Uarte for the purposes of illustration only.
  • svd-generator CLI tool to parse flattened device tree files, and create a SVD file. - crates.io

Real-time

Real-time Operating System (RTOS)

  • Drone OS An Embedded Operating System for writing real-time applications in Rust.
  • FreeRTOS.rs Rust interface for the FreeRTOS API
  • FreeRTOS-rust Rust interface for FreeRTOS with Rust entry point and build support crate.
  • RIOT-OS directly supports applications written in Rust, both in terms of build system integration and by having safe and idiomatic wrappers.
  • Tock An embedded operating system designed for running multiple concurrent, mutually distrustful applications on low-memory and low-power microcontrollers
  • Hubris A real-time operating system built by Oxide Computer to run the Service Controller processor in the mainboards of their rack-mount servers.

Real-time tools

  • RTIC v1.0 Real-Time Interrupt-driven Concurrency — A concurrency framework for building real-time systems:

Peripheral Access Crates

Register definition for microcontroller families. Usually generated using svd2rust. - crates.io

Peripheral Access Crates were also called Device Crates.

NOTE You may be able to find even more peripheral access crates by searching for the svd2rust keyword on crates.io!

Microchip

  • atsamd11 Peripheral access API for Microchip (formerly Atmel) SAMD11 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsamd21 Peripheral access API for Microchip (formerly Atmel) SAMD21 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsamd51 Peripheral access API for Microchip (formerly Atmel) SAMD51 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsame53 Peripheral access API for Microchip (formerly Atmel) SAME53 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsame54 Peripheral access API for Microchip (formerly Atmel) SAME54 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • atsamx7x-rust Peripheral access API for Microchip (formerly Atmel) SAM S70/E70/V70/V71 microcontrollers. This git repo hosts both the peripheral access crate and the hal.
  • avr-device Peripheral access API for Microchip (formerly Atmel) AVR microcontroller family.
  • sam3x8e Peripheral access API for Atmel SAMD3X8E microcontrollers (generated using svd2rust) - crates.io
  • pic32-pac Peripheral access API for PIC32MX1/2xx - crates.io

Nordic

  • nrf51 Peripheral access API for nRF51 microcontrollers (generated using svd2rust) - crates.io
  • nrf52810-pac - Peripheral access API for the nRF52810 microcontroller (generated using svd2rust) - crates.io
  • nrf52811-pac - Peripheral access API for the nRF52811 microcontroller (generated using svd2rust) - crates.io
  • nrf52832-pac - Peripheral access API for the nRF52832 microcontroller (generated using svd2rust) - crates.io
  • nrf52833-pac - Peripheral access API for the nRF52833 microcontroller (generated using svd2rust) - crates.io
  • nrf52840-pac - Peripheral access API for the nRF52840 microcontroller (generated using svd2rust) - crates.io
  • nrf5340-app-pac - Peripheral access API for the nRF5340 application core (generated using svd2rust) - crates.io
  • nrf5340-net-pac - Peripheral access API for the nRF5340 network core (generated using svd2rust) - crates.io
  • nrf9160-pac - Peripheral access API for the nRF9160 system-in-package (generated using svd2rust) - crates.io

NXP

Raspberry Pi Silicon

  • rp2040-pac - Peripheral access API for the RP2040 dual-core system-on-chip (generated using svd2rust) - crates.io

SiFive

Silicon Labs

  • efm32pg12-pac - Peripheral access API for Silicon Labs EFM32PG12 microcontrollers - crates.io

The efm32-rs project has peripheral access APIs for most EFM32 microcontrollers (generated using svd2rust):

StarFive

STMicroelectronics

The stm32-rs project has peripheral access APIs for most STM32 microcontrollers (generated using svd2rust):

Texas Instruments

  • tm4c123x Peripheral access API for TM4C123x microcontrollers (generated using svd2rust)
  • tm4c129x Peripheral access API for TM4C129x microcontrollers (generated using svd2rust)

MSP430

Espressif

Ambiq Micro

  • ambiq-apollo1-pac Peripheral access API for Ambiq Apollo 1 microcontrollers (generated using svd2rust)
  • ambiq-apollo2-pac Peripheral access API for Ambiq Apollo 2 microcontrollers (generated using svd2rust)
  • ambiq-apollo3-pac Peripheral access API for Ambiq Apollo 3 microcontrollers (generated using svd2rust)
  • ambiq-apollo3p-pac Peripheral access API for Ambiq Apollo 3 Plus microcontrollers (generated using svd2rust)

GigaDevice

  • gd32vf103-pac Peripheral access API for GD32VF103 RISC-V microcontrollers (generated using svd2rust) - crates.io
  • gd32e2 Peripheral access API for GD32E23x Cortex-M23 microcontrollers (generated using svd2rust) - crates.io
  • gd32f1 Peripheral access API for GD32F1x0 Cortex-M3 microcontrollers (generated using svd2rust) - crates.io
  • gd32f2 Peripheral access API for GD32F20x Cortex-M3 microcontrollers (generated using svd2rust) - crates.io

XMC

Peripheral access crates for the different XMC4xxx families of microcontrollers

Vorago

Wiznet

  • w7500x-pac Peripheral Access Crate for Wiznet's W7500x microcontrollers (generated using svd2rust) - crates.io

Renesas

  • ra2a1 Peripheral Access Crate for ra2a1 microcontrollers (generated using svd2rust) - crates.io
  • ra2e1 Peripheral Access Crate for ra2e1 microcontrollers (generated using svd2rust) - crates.io
  • ra2e2 Peripheral Access Crate for ra2e2 microcontrollers (generated using svd2rust) - crates.io
  • ra2l1 Peripheral Access Crate for ra2l1 microcontrollers (generated using svd2rust) - crates.io
  • ra4e1 Peripheral Access Crate for ra4e1 microcontrollers (generated using svd2rust) - crates.io
  • ra4m1 Peripheral Access Crate for ra4m1 microcontrollers (generated using svd2rust) - crates.io
  • ra4m2 Peripheral Access Crate for ra4m2 microcontrollers (generated using svd2rust) - crates.io
  • ra4m3 Peripheral Access Crate for ra4m3 microcontrollers (generated using svd2rust) - crates.io
  • ra4w1 Peripheral Access Crate for ra4w1 microcontrollers (generated using svd2rust) - crates.io
  • ra6e1 Peripheral Access Crate for ra6e1 microcontrollers (generated using svd2rust) - crates.io
  • ra6m1 Peripheral Access Crate for ra6m1 microcontrollers (generated using svd2rust) - crates.io
  • ra6m2 Peripheral Access Crate for ra6m2 microcontrollers (generated using svd2rust) - crates.io
  • ra6m3 Peripheral Access Crate for ra6m3 microcontrollers (generated using svd2rust) - crates.io
  • ra6m4 Peripheral Access Crate for ra6m4 microcontrollers (generated using svd2rust) - crates.io
  • ra6t1 Peripheral Access Crate for ra6t1 microcontrollers (generated using svd2rust) - crates.io
  • ra6t2 Peripheral Access Crate for ra6t2 microcontrollers (generated using svd2rust) - crates.io
  • da14531 Peripheral Access Crate for DA14531 Ultra-Low Power BT 5.1 System-on-Chip - crates.io

HAL implementation crates

Implementations of embedded-hal for microcontroller families and systems running some OS. - crates.io

NOTE You may be able to find even more HAL implementation crates by searching for the embedded-hal-impl and embedded-hal keywords on crates.io!

OS

Microchip

  • atsam4-hal - HAL for SAM4E, SAM4N and SAM4S - crates.io
  • atsamd-hal - HAL for SAMD11, SAMD21, SAMD51 and SAME54 - crates.io
  • atsamx7x-hal - HAL for SAM S70/E70/V70/V71-based devices - crates.io
  • avr-hal - HAL for AVR microcontroller family and AVR-based boards
  • pic32-hal - HAL for PIC32MX - crates.io

Nordic

NXP

Also check the list of NXP board support crates!

Raspberry Pi Silicon

  • rp2040-hal - HAL for the RP2040 dual-core system-on-chip - crates.io

SiFive

STMicroelectronics

Also check the list of STMicroelectronics board support crates!

Texas Instruments

MSP430

  • msp430fr2x5x-hal
    • HAL implementation for the MSP430FR2x5x family of microcontrollers

Espressif

  • esp-idf-hal
    • An embedded-hal implementation for Rust on ESP32 microcontrollers and ESP-IDF
  • esp-hal
    • A no_std Hardware Abstraction Layers for ESP32 microcontrollers

Silicon Labs

  • tomu-hal
    • HAL implementation targeted for Tomu USB board with EFM32HG309F64 ARMv6-M core. Has support to configure tomu bootloader directly from an application via the toboot_config macro.

XMC

GigaDevice

  • gd32vf103xx-hal - crates.io
    • HAL for GD32VF103xx microcontrollers
  • gd32vf103-hal - crates.io
    • (WIP) Hardware abstract layer (HAL) for the GD32VF103 RISC-V microcontroller
  • gd32f1x0-hal - crates.io
    • HAL implementation for GD32F1x0 microcontrollers

Vorago

Renesas

  • da14531-hal HAL crate for DA14531 Ultra-Low Power BT 5.1 System-on-Chip - crates.io

StarFive

Architecture support crates

Crates tailored for general CPU architectures.

ARM

  • cortex-a Low-level access to Cortex-A processors (early state) - crates.io
  • cortex-m Low-level access to Cortex-M processors - crates.io

RISC-V

  • riscv Low-level access to RISC-V processors - crates.io

MIPS

  • mips Low-level access to MIPS32 processors - crates.io
  • mips-mcu Low-level access to MIPS MCU cores - crates.io

Board support crates

Crates tailored for specific boards.

1BitSquared

Adafruit

Arduino

Nordic

NXP

Pimoroni

Raspberry Pi

  • rp-pico - Board Support Crate for the RP2040-based Raspberry Pi Pico.

Sparkfun

SeeedStudio

SiFive

Sipeed

Sony

  • prussia - SDK for the PlayStation 2.

STMicroelectronics

Teensy

  • teensy4-rs Board Support crate for the [Teensy 4.0]

Vorago

Texas Instruments

  • monotron - A 1980s home-computer style application for the Texas Instruments Stellaris Launchpad. PS/2 keyboard input, text output on a bit-bashed 800x600 VGA signal. Uses menu, vga-framebuffer and pc-keyboard.
  • stellaris-launchpad - For the Texas Instruments Stellaris Launchpad and Tiva-C Launchpad crates.io
  • tm4c129-launchpad - For the Texas Instruments TM4C129-XL Launchpad board

Special Purpose

  • betafpv-f3 - For the BetaFPV F3 drone flight controller

Sodaq

Other

Component abstraction crates

The following crates provide HAL-like abstractions for subcomponents of embedded devices that go beyond what is available in embedded-hal:

  • accelerometer - Generic accelerometer support, including traits and types for taking readings from 2 or 3-axis accelerometers and tracking device orientations - crates.io
  • embedded-graphics: 2D drawing library for any size display - crates.io
  • radio - Generic radio transceiver traits, mocks, and helpers - crates.io
  • smart-leds: Support for addressable LEDs including WS2812 and APA102
  • usb-device: Abstraction layer between USB peripheral crates & USB class crates - crates.io
  • atat: Abstraction crate to ease writing AT based driver crates - crates.io
  • embedded-nal: An Embedded Network Abstraction Layer - crates.io
  • embedded-storage: An Embedded Storage Abstraction Layer
  • switch-hal: An "on"/"off" abstraction for input and output switches - crates.io

Driver crates

Platform agnostic crates to interface external components. These crates use the embedded-hal interface to support all the devices and systems that implement the embedded-hal traits.

The list below contains drivers that have achieved the "released" status. To add a driver to this list, please ensure that your driver has a short blog post, article, or sufficiently explanatory README showing an example of its use. Ideally, this post would demonstrate using the device in a small project so that a Rust and/or embedded newcomer can also understand it. Otherwise, please add it to the WIP section below.

  1. AD983x - SPI - AD9833/AD9837 waveform generators / DDS - Intro blog post - crates.io
  2. adafruit-alphanum4 - I2C - Driver for Adafruit 14-segment LED Alphanumeric Backpack based on the ht16k33 chip - crates.io
  3. ADE791x - SPI - ADE7912/ADE7913 3-Channel, Isolated, Sigma-Delta ADC - github - crates.io
  4. ADS1x1x - I2C - 12/16-bit ADCs like ADS1013, ADS1015, ADS1115, etc. - Intro blog post - crates.io
  5. ADXL313 - SPI - 3-axis accelerometer - crates.io
  6. ADXL343 - I2C - 3-axis accelerometer - crates.io
  7. ADXL355 - SPI - 3-axis accelerometer - Intro blog post - crates.io
  8. AFE4404 - I2C - Pulse oximeter - crates.io
  9. AHT20 - I2C - Humidity and temperature sensor - github - crates.io
  10. AHT20-driver - I2C - Humidity and temperature sensor - Intro blog post - github - crates.io
  11. AnyLeaf - I2C - pH sensor module - github - crates.io
  12. AT86RF212 - SPI - Low power IEEE 802.15.4-2011 ISM RF Transceiver - Intro blog post - crates.io
  13. BlueNRG - SPI - driver for BlueNRG-MS Bluetooth module - Intro post crates.io
  14. BMA400 - I2C/SPI - Bosch 12-bit 3-axis accelerometer - github crates.io
  15. BNO055 - I2C - Bosch Sensortec BNO055 9-axis IMU driver - Intro post crates.io
  16. CD74HC4067 - GPIO - 16-channel digital and analog multiplexer - Intro blog post - github - crates.io
  17. dht-sensor - 1-Wire - DHT11/DHT22 temperature/humidity sensor driver - github - crates.io
  18. DRV8825 - DRV8825 Stepper Motor Driver (based on Stepper) - Intro blog post - crates.io
  19. DS1307 - I2C - Real-time clock driver - Intro blog post - crates.io
  20. ebyte-e32 - SERIAL - Ebyte E32 LoRa module driver - Intro blog post - crates.io
  21. EEPROM24x - I2C - 24x series serial EEPROM driver - Intro blog post - crates.io
  22. embedded-ccs811 - I2C - Gas and VOC sensor driver for monitoring indoor air quality - Intro blog post - crates.io
  23. embedded-sdmmc - SPI - SD/MMC Card Driver with MS-DOS Partition and FAT16/FAT32 support - Intro post crates.io
  24. ENC28J60 - SPI - Ethernet controller - Intro blog post - crates.io
  25. FUSB302B - I2C - Programmable USB Type‐C Controller with USB Power Delivery - github
  26. HC-12 - SERIAL - Wireless serial transceiver module - Intro blog post - github - crates.io
  27. HTS221 - I2C - Humidity and temperature sensor - Intro blog post - crates.io
  28. IIS2MDC - I2C - ST's High accuracy, ultra-low-power, 3-axis digital output magnetometer - crates.io
  29. ISM330DHCX - I2C - ST's IMU with 3D accelerometer, 3D gyroscope, ML core and more - crates.io
  30. keypad - GPIO - Keypad matrix circuits - Intro post - crates.io
  31. KXCJ9 - I2C - KXCJ9/KXCJB 3-axis accelerometers - Intro blog post - crates.io
  32. L3GD20 - SPI - Gyroscope - Intro blog post - crates.io
  33. LSM303DLHC - I2C - Accelerometer + compass (magnetometer) - Intro blog post - crates.io
  34. MAX6675 - SPI - A driver for the MAX6675 digital thermocouple converter - Intro blog post - crates.io
  35. MAX6955 - I2C - Driver for Alphanumeric LED display driver - Intro blog post - crates.io
  36. MAX116xx-10bit - SPI - Driver for the MAX11619-MAX11621, MAX11624 and MAX11625 10-bit ADCs - Intro blog post - crates.io
  37. MCP25LCXX - SPI - Driver for Microchip's 25LC series of EEPROMs - crates.io
  38. MCP3008 - SPI - 8 channel 10-bit ADC - Intro blog post - crates.io
  39. MCP3425 - I2C - 16-bit ADC - Intro blog post - crates.io
  40. MCP794xx - I2C - Real-time clock / calendar driver - Intro blog post - crates.io
  41. MMA7660FC - I2C - 3-axis accelerometer - Intro blog post
  42. OPT300x - I2C - Ambient light sensor family driver - Intro blog post - crates.io
  43. PAC194X - I2C - Single/multi channel power monitor - Intro blog post - crates.io
  44. port-expander - I2C - Driver for I2C port expanders (supports PCA95xx, PCF85xx) - Intro blog post - crates.io
  45. pwm-pca9685 - I2C - 16-channel, 12-bit PWM/Servo/LED controller - Intro blog post - crates.io
  46. rainbow-hat-rs - I2C/SPI/GPIO - Pimoroni Rainbow HAT driver for Raspberry Pi - github - crates.io
  47. rotary-encoder-hal - GPIO - A rotary encoder driver using embedded-hal - Intro blog post - crates.io
  48. sega-controller - GPIO - Sega controller input - github - crates.io
  49. SGP30 - I2C - Gas sensor - Intro blog post - crates.io
  50. SH1106 - I2C - Monochrome OLED display controller - Intro post crates.io
  51. shared-bus - I2C - utility driver for sharing a bus between multiple devices - Intro post crates.io
  52. shift-register-driver - GPIO - Shift register - Intro blog post - crates.io
  53. Si4703 - I2C - FM radio turner (receiver) driver - Intro blog post - crates.io
  54. SRAM23x - SPI - Microchip 23x series serial SRAM/NVSRAM driver - Intro blog post - crates.io
  55. SSD1306 - I2C/SPI - OLED display controller - Intro blog post - crates.io
  56. SSD1309 - I2C/SPI - OLED display controller - Intro blog post - crates.io
  57. STSPIN220 - STSPIN220 Stepper Motor Driver (based on Stepper) - Intro blog post - crates.io
  58. Sx127x - SPI - Long Range Low Power Sub GHz (Gfsk, LoRa) RF Transceiver - Intro blog post - crates.io
  59. Sx128x - SPI - Long range, low power 2.4 GHz (Gfsk, Flrc, LoRa) RF Transceiver - Intro blog post - crates.io
  60. TC72 - SPI - Microchip TC72 temperature sensor - crates.io
  61. TCN75A - I2C - Microchip TCN75A temperature sensor - crates.io
  62. TMP006 - I2C - Contact-less infrared (IR) thermopile temperature sensor driver - Intro post crates.io
  63. TMP1x2 - I2C - TMP102 and TMP112x temperature sensor driver - Intro blog post crates.io
  64. TSIC - GPIO - TSIC 306 temperature sensor driver - Intro blog post crates.io
  65. TSL256X - I2C - Light Intensity Sensor - Intro blog post - crates.io
  66. VEML6030/VEML7700 - I2C - Ambient light sensors - Intro blog post - crates.io
  67. VEML6075 - I2C - UVA and UVB light sensor - Intro blog post - crates.io
  68. usbd-serial - USB CDC-ACM class (serial) implementation - github - crates.io
  69. usbd-hid - USB HID class implementation - github - crates.io
  70. usbd-hid-device - USB HID class implementation without unsafe - github - crates.io
  71. usbd-human-interface-device - Batteries included embedded USB HID library for usb-device. Includes concrete Keyboard (boot and NKRO), Mouse and Consumer Control implementations as well as support for building your own HID classes - github - crates.io
  72. usbd-midi - USB MIDI class implementation - github - crates.io
  73. usbd-webusb - USB webUSB class implementation - github - crates.io
  74. SHTCx - I2C - Temperature / humidity sensors - github -