# Introduction
---
## A Layered Approach
When building Embedded Systems in Rust, we use Rust crates to help us build a modular system.
The elements are:
* The program you are writing
* The MCU are running on
* The PCB (or Board) your MCU is on
* The external devices connected to your MCU
---
## The Layers
To support these elements, we (usually) have these layers.
* Application
* Board Support
* External Drivers (e.g. SPI LCD Driver)
* Hardware Abstraction Layer Traits
* MCU Hardware Abstraction Layer Implementation
* MCU Peripheral Access Crate
* Core Peripherals
* Core Runtime
---
```mermaid
graph TB
app(Application
my_application)
bsc[Board Support
nrf52840_dk]
hal[MCU HAL Implementation
nrf52480_hal]
lcd_driver[SPI LCD Driver
ssd1306]
hal_traits[[HAL Traits
embedded_hal]]
pac[MCU PAC
nrf52840]
rt[Core Runtime
cortex_m_rt]
cp[Core Peripherals
cortex_m]
subgraph Key
note1[Embedded Working Group]
note2[nrf-rs]
note3[You]
note4[Others]
end
direction TB
app --> bsc
app & bsc --> hal
app --> lcd_driver
app & lcd_driver --> hal_traits
hal -- Implements --o hal_traits
app & hal --> pac
app & pac --> rt
app & pac & rt --> cp
class app binary;
class bsc library;
class lcd_driver library;
class hal mcu_library;
class pac mcu_library;
class hal_traits ewg_library;
class rt ewg_library;
class cp ewg_library;
class note1 ewg_library;
class note2 mcu_library;
class note3 binary;
class note4 library;
classDef binary fill:#fb8,stroke:#333,stroke-width:4px;
classDef library fill:#cf9,stroke:#333,stroke-width:2px;
classDef ewg_library fill:#f9c,stroke:#333,stroke-width:2px;
classDef mcu_library fill:#9cf,stroke:#333,stroke-width:2px;
```
---
## Don't worry!
There's a lot here. We're going to take it step by step, starting at the bottom.