Marlin 2.0.8, Ender 3 Pro, BTT SKR 1.4 Turbo with ABL using BLTouch v3.1


This article describes another release for Marlin this version is 2.0.8 based on the release from 30th April 2021 and prepared for use with the Ender 3 Pro and a custom hardware configuration comprising of the: BigTreeTech SKR 1.4 board, TMC2209 stepper drivers and the BLTouch v3.1 (other versions supported review wiring diagram for your variant).

Important information

There are newer versions of this article and Marlin configurations available:

  • Marlin v2.0.8.2 – Posted 13th July 2021
  • Marlin v2.0.8 – This article posted 16th May 2021

Here are some highlights on key features enabled in this custom version of Marlin 2.0.8:

  • TMC2209 drivers with Stealth-chop & Hybrid threshold enabled on X, Y, Z axis.
  • BLTouch for ABL Bilinear.
    • Bed levelling is used in addition to the Z-stop switch.
    • Menu for levelling bed corners.
    • Restore bed levelling after G28.
    • Probes bed once at each point.
  • Movement on any axis is restricted until axis’s are homed.
  • PID Tuning
  • Extruder fan after 50°C
  • Z Safe homing
  • Advanced pause and filament change
  • Classic Jerk or Junction Deviation (see note below)
  • Mute menu sound capability

To read more on changes introduced check the official Marlin 2.0.8 change log. Before we begin it’s assumed that you have the following equipment:

  • Ender 3 Pro or 3.
  • BTT SKR 1.4 Board.
  • BLTouch v3.1 (other versions of the BLTouch will work but you will need to adjust settings related to it and check your wiring).


PlatformIO Installation

I suggest VSCode as a quick method for compiling the Marlin 2.0.x from source.

  1. Download VSCode and install.
  2. Open VSCode > Extension Manager > Search for and install the official PlatformIO IDE extension.

Firmware sources

Binary release

View Binary release v2.0.8 on GitLab

Building your own binary

I have made my Marlin configurations available for download they feature the same changes mentioned within this article; if you use my configuration you will need to review your Probe offsets & determine if your endstops require inversion:

To build your own variant from source; start by downloading the relevant Marlin releases used in this article from Marlin 2.0.8 branch:

Once you have downloaded the sources above you will need to extract them to an accessible location, use the following steps as a reference:

  1. Download and extract Marlin 2.0.8 sources
  2. Copy the 4 files to the Marlin directory contained within the extracted Marlin 2.0.8 sources.

Firmware configuration modifications

Next we will be modifying 2 specific files from the release to customise the firmware for to our requirements:

  • /Marlin/Configuration.h
  • /Marlin/Configuration_adv.h

Depending upon whether you used my configurations or the stock configurations will determine if you need to merge the changes required to support the new hardware:

  1. Compare file: /Marlin/Configuration.h with custom file: Configuration.h (GitLab)
  2. Compare file: /Marlin/Configuration_adv.h with custom file: Configuration_adv.h (GitLab)

Switching between Classic Jerk and Junction Deviation

In the configuration provided you can change between classic jerk and junction deviation by commenting out #CLASSIC_JERK (found on line 787 in Configuration.h).

//#define CLASSIC_JERK
  #define DEFAULT_XJERK 10.0
  #define DEFAULT_YJERK 10.0
  #define DEFAULT_ZJERK  0.3

  //#define TRAVEL_EXTRA_XYJERK 0.0     // Additional jerk allowance for all travel moves

  //#define LIMITED_JERK_EDITING        // Limit edit via M205 or LCD to DEFAULT_aJERK * 2
    #define MAX_JERK_EDIT_VALUES { 20, 20, 0.6, 10 } // ...or, set your own edit limits

#define DEFAULT_EJERK    5.0  // May be used by Linear Advance

 * Junction Deviation Factor
 * See:
  #define JUNCTION_DEVIATION_MM 0.08  // (mm) Distance from real junction edge
  #define JD_HANDLE_SMALL_SEGMENTS    // Use curvature estimation instead of just the junction angle
                                      // for small segments (< 1mm) with large junction angles (> 135°).

When using these device configurations you should take care to check the following are suited to your setup/configuration:

  • Probe offsets for X, Y, Z (important; see below).
  • Require Fade height?
  • PID tuning (recommended).
  • E-Step calibration.
  • Endstops may need inverting depending on your wiring see below.

Important note on Probe offsets

Keep in mind that in using this; you will likely need to adjust your X, Y, Z offset settings specific to your setup. The change is simple and the key settings to look for is NOZZLE_TO_PROBE_OFFSET if you wish to make the change in source. Once found, this branch of Marlin requires the offsets to be defined as an array: {x, y, z}.

The alternative is updating the probe offset values after the new firmware has been installed.

Updating Probe offset values manually using G-code M851

The following example shows the G-Code I would use to set the offset values after flashing a new firmware. You will need to adjust these offsets to accommodate your own requirements.

Set the Z offset for the BLTouch by sending G-code:

M851 Z-1.46 

Set the X and Y distance (probe left front of nozzle) by sending G-code:

M851 X-46.00 Y-16.00 

Save the setting to the EEPROM by sending G-code:


Setting Fade Height manually via G-code M420

Set the Fade Height with G-Code:

M420 Z10

Determining if Endstops need to be inverted

Get all endstop states by sending G-Code:


It will report something similar to:

Reporting endstop status
x_min: open
y_min: open
z_probe: open
filament: open

If an endstop is reporting triggered but is not actually triggered (by this I mean pushed) or is reporting open when the switch is pushed then you will need to invert the endstop. If was true initially set to false and vice-versa.

Below are two options for addressing this requirement.

Endstop inversion option 1

If you would prefer to change the inversion on a endstop or endstops in the configuration to compile yourself look for the following:

// Mechanical endstop with COM to ground and NC to Signal uses "false" here (most common setup).
#define X_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Y_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Z_MIN_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define X_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Y_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Z_MAX_ENDSTOP_INVERTING false // Set to true to invert the logic of the endstop.
#define Z_MIN_PROBE_ENDSTOP_INVERTING true // Set to true to invert the logic of the probe.

Endstop inversion option 2

Alternatively; if you wish avoid editing the configuration and utilise the binaries available on this blog; you could swap the placement of the two wires in the DuPont connector, carefully ejecting each wire with a pin/needle and repositioning them by swapping them around.

The mod could be made on either end of the cable plugged in to the endstop; cable closest to the endstop would likely be a easier option for most.