flexi-bot/docs/marlin/_development/hal.md
2023-09-05 20:38:49 +02:00

89 lines
5.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Hardware Access Layer
description: Overview of the Hardware Access Layer in Marlin
tag: coding
author: chepo92
contrib: thinkyhead
category: [ development ]
---
The Hardware Access Layer "HAL" for short allows Marlin to run on a wide variety of boards by providing a common interface for low-level resources like timers, serial ports, i2c and SPI buses, EEPROM, SDIO, and so on.
## HAL Rationale
Marlin was originally derived in 2011 from [Sprinter](//github.com/kliment/Sprinter) and [GRBL](//github.com/gnea/grbl). Initially, Marlin could only run on Arduino's AVR boards, but it was quickly ported to DUE. Soon we saw boards based on the LPC1768/9 appearing, along with a Grbl-based firmware called [Smoothieware](//reprap.org/wiki/Smoothieboard).
Another ARM processor, the STM32, was poised to take over as the new frontrunner, so we put our heads together to pick a course for extended hardware support. We decided not to rebuild Marlin from the ground up, but to preserve the existing work by adding a layer to abstract away the platform.
## HAL Alternatives
We could have chosen to use an RTOS to build this abstraction, but there are just too many points against:
- We want to stay compatible with AVR and small boards. That rules out RTOS.
- While possible to make the AVR version separate it's much simpler to keep a single codebase so everyone gets the latest features, patches and all platforms can benefit from improvements. We also catch bugs much faster when we're running the same code on more architectures.
- Marlin was designed to use direct interrupts, so it requires the least work to keep the same design. The extra benefit is that Marlin continues to run hardware-direct. The aim is for Marlin to obtain the best performance possible on the board using the least amount of power.
### Current Marlin HALs
#### AVR (8-bit)
board|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Arduino AVR](//www.arduino.cc/)|ATmega, ATTiny, etc.|16-20MHz|64-256k|2-16k|5V|no
#### DUE
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Arduino Due](//www.arduino.cc/en/Guide/ArduinoDue), [RAMPS-FD](//www.reprap.org/wiki/RAMPS-FD), etc.|[SAM3X8E ARM-Cortex M3](//www.microchip.com/wwwproducts/en/ATsam3x8e)|84MHz|512k|64+32k|3.3V|no
#### ESP32
board|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[ESP32](//www.espressif.com/en/products/hardware/esp32/overview)|Tensilica Xtensa LX6|240MHz|---|---|3.3V|---
#### LPC1768 / LPC1769
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Re-ARM](//www.kickstarter.com/projects/1245051645/re-arm-for-ramps-simple-32-bit-upgrade)|[LPC1768 ARM-Cortex M3](//www.nxp.com/products/microcontrollers-and-processors/arm-based-processors-and-mcus/lpc-cortex-m-mcus/lpc1700-cortex-m3/512kb-flash-64kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|100MHz|512k|32+16+16k|3.3-5V|no
[MKS SBASE](//forums.reprap.org/read.php?13,499322)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no
[Selena Compact](//github.com/Ales2-k/Selena)|LPC1768 ARM-Cortex M3|100MHz|512k|32+16+16k|3.3-5V|no
[Azteeg X5 GT](//www.panucatt.com/azteeg_X5_GT_reprap_3d_printer_controller_p/ax5gt.htm)|LPC1769 ARM-Cortex M3|120MHz|512k|32+16+16k|3.3-5V|no
[Smoothieboard](//reprap.org/wiki/Smoothieboard)|LPC1769 ARM-Cortex M3|120MHz|512k|64k|3.3-5V|no
#### SAMD51
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Adafruit Grand Central M4](//www.adafruit.com/product/4064)|[SAMD51P20A ARM-Cortex M4](//www.microchip.com/wwwproducts/en/ATSAMD51P20A)|120MHz|1M|256k|3.3V|yes
#### STM32
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Arduino STM32](//github.com/rogerclarkmelbourne/Arduino_STM32)|[STM32F1](//www.st.com/en/microcontrollers-microprocessors/stm32f103.html) ARM-Cortex M3|72MHz|256-512k|48-64k|3.3V|no
[Geetech GTM32](//github.com/Geeetech3D/Diagram/blob/master/Rostock301/Hardware_GTM32_PRO_VB.pdf)|[STM32F1](//www.st.com/en/microcontrollers-microprocessors/stm32f103.html) ARM-Cortex M3|72MHz|256-512k|48-64k|3.3V|no
[STEVAL-3DP001V1](//www.st.com/en/evaluation-tools/steval-3dp001v1.html)|[STM32F401VE Arm-Cortex M4](//www.st.com/en/microcontrollers/stm32f401ve.html)|84MHz|512k|64+32k|3.3-5V|yes
#### Teensy++ 2.0
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Teensy++ 2.0](//www.microchip.com/wwwproducts/en/AT90USB1286)|[AT90USB1286](//www.microchip.com/wwwproducts/en/AT90USB1286)|16MHz|128k|8k|5V|no
#### Teensy 3.1 / 3.2
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Teensy 3.2](//www.pjrc.com/store/teensy32.html)|[MK20DX256VLH7](//www.mouser.com/ProductDetail/NXP-Freescale/MK20DX256VLH7) ARM-Cortex M4|72MHz|256k|32k|3.3V-5V|yes
#### Teensy 3.5 / 3.6
boards|processor|speed|flash|sram|logic|fpu
----|---------|-----|-----|----|-----|---
[Teensy 3.5](//www.pjrc.com/store/teensy35.html)|[MK64FX512VMD12](//www.mouser.com/ProductDetail/NXP-Freescale/MK64FX512VMD12) ARM-Cortex M4|120MHz|512k|192k|3.3-5V|yes
[Teensy 3.6](//www.pjrc.com/store/teensy36.html)|[MK66FX1M0VMD18](//www.mouser.com/ProductDetail/NXP-Freescale/MK66FX1M0VMD18) ARM-Cortex M4|180MHz|1M|256k|3.3V|yes