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


This article describes another release for Marlin this version is based on the release from 22nd October 2020 for use with the Ender 3 Pro and a custom hardware configuration: BigTreeTech SKR 1.4 board, TMC2209 drivers, BLTouch v3.1 (others supported check wiring).

Important information

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

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

  • TMC2209 drivers with Stealth-chop & Hybrid threshold enabled on X, Y, Z axis.
  • BLTouch for ABL Bilinear.
    • Bed levelling is used in addition to a 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.
  • Emergency stop interrupt commands supported
  • PID Tuning
  • Extruder fan after 50°C
  • Z Safe homing
  • Advanced pause and filament change
  • Classic Jerk or Junction Deviation (see note below)

Read more on changes/fixes in the official Marlin change log and Marlin change log.

It’s assumed that you have the following equipment:

  • 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).
  • Ender 3 Pro or 3.


PlatformIO Installation

I suggest VSCode as a quick method for compiling 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 release

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 requiring inversion:

To build your own variant from source; start by downloading the relevant Marlin releases used in this article from Marlin 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 sources
  2. Copy the 4 files to the Marlin directory contained within the extracted Marlin 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 (BitBucket)
  2. Compare file: /Marlin/Configuration_adv.h with custom file: Configuration_adv.h (BitBucket)

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.