SKR V1.4 Turbo Upgrade - The Ultimate Step by Step Guide

Written by Chanh Phoung and Gavin Balcomb 

What's Needed

A lot of people have been asking me to write an in-depth guide to the SKR Turbo upgrade. I’ve been hesitant for a couple of reasons,
(1) there’s a lot to cover,
(2) I had a lot of help from others while attempting to complete the upgrade. 

So, to address concern #1, I will be doing this guide in multiple parts. I’m hoping it should not be more than 3 or 4 parts. And I will release them weekly. Concern #2, I did get help from many people, but I can document exactly what I did to make this upgrade work. So, if what I did doesn’t work for you, I will try my best to try to troubleshoot, but this will be likely a learning experience for both of us. 

I will start this series off with what’s needed in terms of hardware and software. I will list everything I use and what the purpose of that thing is. 



  • Marlin 2.0 (Latest Official Version). I would always start with the latest official version found here: https://marlinfw.org/meta/download/ You can use my version but I think it’s important you know how the firmware is working so that you can debug it if something isn’t working correctly. If you just blindly take someones configured FW and do not understand the changes, it'll be hard to go in and figure out why it’s not working.
  • The other thing that you need is Visual Studio Code: https://code.visualstudio.com/ I think there is mention of people using other code editors, but this is the one I use. If you’re not familiar with this stuff, get over it and dive right in. It looks daunting but it’s really not that bad. If I can do it, surely you can. This is what we’ll use to compile the firmware and use it on the SKR. No more Arduino IDE. Once you familiarize yourself with VSCode, you’ll really appreciate it. It’s actually a pretty cool application. 

Wiring and Hardware Installation

Now that you have everything you need, you can start installing and wiring everything up. This is actually the easiest part of this upgrade. For the most part, everything matches the stock location, so you just remove it from the old location, find it on the SKR board and connect. 

I have sensorless homing, so my installation guide will be around that. If you want to use the stock end-stops, adjust my instructions accordingly.  The way I see it, this board is capable of many things, might as well take advantage of what you can. Alright, let’s get started!


  • Step 1. First things first, make sure you’ve printed my mounting bracket. Due to the SD Card reader, you can’t mount the SKR board in the stock location. If you haven’t printed it: Click Here. If you already have your printer apart and forgot to print it, you can buy a kit from my store: Click Here.
  • Step 2. Remove the 4 bolts holding in the stock MKS Gen L board. Save these bolts, they will be used to hold in my mount. Don’t disconnect any of the wiring yet. We want to do them one by one.
  • Step 3. Push the stock MKS board to the side and grab your new SKR board. We’re going to install everything one connector at a time starting with power. These are oriented straight out from the board so it’s easier to do these when the board isn’t installed on the case.

  • Step 4. Now that the power stuff is connected, we can start installing my mount to the X1 case. First, install the mount using the stock bolts holding the MKS board. If you lost them, they’re M3x5.
  • Step 5. Next, install the USB Type B extender to my mount using 2 M3x10 bolts. I highly recommend you have this USB extender. If you don’t, flashing your board will not be fun.
  • Step 6. Then we can install the SKR board to my mount using 4 M3x5 bolts. 
  • Step 7. Here’s how it should look. We can now start connecting everything else, one connector at a time so we don’t lose our place.
  • Step 8. Stepper Drivers – Let’s install the TMC2209’s next. I have these stepper drivers in UART mode vs SPI mode. This means that I can adjust the current via firmware instead of manually by adjusting the potentiometer. Leave the current as-is. I think I measured them and they’re 1.2v from the factory. When you install the stepper drivers, mine were colour coordinated so it’s hard to get the orientation incorrect. Red should go with red and black should go with black. For UART mode, remove all the jumpers and leave them on the 3rd row.
  • Step 9. Stepper Motors – For the stepper motor connectors, X, and Y, are like for like. For Z, I just used one. Even though there are 2 connectors for Z, I didn’t like that it shares a stepper driver. So, for the second Z, I plugged it into E1.
  • Step 10. Thermistors – Connect the grey wires to TH1 and the red and black wires to TB. TH1 is for the hot end and TB is for the heat bed. 
  • Step 11. Fans – The green wires plug into the slot for labelled “CNC FAN”. I believe this controls the heatbreak and part cooling fan. The other fan spots are always on and can be used for the case fans. 
  • Step 12. BLTouch – If you have BLTouch, this is how you connect it. For some reason, the spot designed for the BLTouch doesn’t work so you have to plug it in like this, in order for it to work. The 3 brown wires connect to the spot labelled “SERVOS”. The 1 black wire connects to the Z end-stop location. Do not use the probe location for this wire. It won’t work.
  • Step 13. TFT35 V3 – To connect your new TFT screen, The single wire goes all the way on the left of the connector, that is your reset wire for the screen. The rest of the 4 wires plug into the other spots. Keep the same orientation and plug it in. For the EXP 1 and 2, match them up on the TFT and plug them in accordingly to the board. Since they look exactly the same, I labelled these cables based on where they’re plugged into the board. 
  • Step 14. End-Stops – if you wish to use the end stops, you can plug them in just like stock. They’re the same locations. For me, since I don’t use them, I just removed them all from my printer. Fewer wires to deal with. 

Understanding the Firmware Changes

For part 3 of this upgrade, I want to take you through every change needed to the firmware. This will help you understand exactly what every change is and can go in and debug if something isn’t working. So read this article, and read it again, then when you’re done read it again, you need to become a pro at this. I think this upgrade is basically the pinnacle of 3D printer upgrades. You made it this far, let’s make sure you truly understand your upgrades. 

The base version I am using is Marlin 2.0 BugFix. There may be another version that is more current. I suggest implementing these changes using the latest version of Marlin. Another note is that these are the changes I made for my specific hardware and tastes. I will explain each change as best I can. If for whatever reason, the change isn’t applicable to you, don’t implement it. 

Again, I am no expert at this stuff at all. I received a lot of help from folks in the FB group. I will do my best to explain each change, but some of these, I have no idea why it’s changed, it just is. So, you may have to google it if you want to know more if my explanation is not enough.


Alter the firmware Using Visual Studio Code

Now it’s important to know how to use Visual Studio Code. If you already know how to use it, you can skip this part. This is a high level of how to use VS Code, it’s my understanding of it, I’m sure there are better techniques and stuff I’m not doing. I will show you how I use it. 

Step 1: First things first, download it, if you haven’t already. You can get VS Code here: https://code.visualstudio.com/

Step 2: After you have VS Code install, you’ll need to enable/install PlatformIO IDE. This is what we’ll use to build and compile firmware for our Arduino board.

Step 3: Once PlatformIO IDE has been enabled, open up the Platform IO IDE Home screen and click ‘Open Project’.


Step 4: Browse for your Marlin folder. Remember to use the latest one or you can upload my firmware. 

Step 5: Change the default_envs to LPC1769. This needs to match the chip you are compiling this firmware for or it won’t work. The SKR 1.4 Turbo is a LPC1769 (120 MHz). The regular SKR 1.4 is a LPC1768 (100 Mhz).  

The Firmware Changes

For all of these changes, the line number will need to be commented out for it to be active. So, remove the two //. I took a screenshot of what I changed in the firmware for my hardware setup. You may or may not have the same settings based on your configuration. 


  • Line 133: This tells Marlin what motherboard you’re using. You have to change it using their list, (Marlin > core > boards.h) in this case we will be changing the board to #define MOTHERBOARD BOARD_BIGTREE_SKR_V1_4_TURBO
    // Choose the name from boards.h that matches your setup
    #ifndef MOTHERBOARD


  • Line 150: Define your filament diameter here.
    // Generally expected filament diameter (1.75, 2.85, 3.0, ...). Used for Volumetric, Filament Width Sensor, etc.


  • Line 408: If you’re using an E3D thermistor, define TEMP_SENSOR_0 as 5, if you are using the stock thermistor this needs to be set to 1, I am using an E3D thermistor. Make sure you specify the right one or you’ll get all kinds of thermal runaway issues. 

    #define TEMP_SENSOR_0 5


  • Line 447: Stock should be 275. If you upgraded your extruder, most can handle 300. please note that the firmware will only allow you to heat up to 15 degrees lower than what is set here, so for the case of a Hemera, we need to set 300 to be able to heat up to 285

    #define HEATER_0_MAXTEMP 300



  • Line 517: This enables your bed to be PID tuned if needed.
    #define PIDTEMPBED


  • Line 589 and 590: This is to enable thermal runaway protection, it is extremely important that you check that both of these are active.
    #define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders
    #define THERMAL_PROTECTION_BED     // Enable thermal protection for the heated bed


  • Line 680: This tells Marlin what stepper drivers you’re using, make sure this is correct with your hardware. They have a list of drivers you can choose from. 
     * These settings allow Marlin to tune stepper driver timing and enable advanced options for
     * stepper drivers that support them. You may also override timing options in Configuration_adv.h.
     * A4988 is assumed for unspecified drivers.
     * Options: A4988, A5984, DRV8825, LV8729, L6470, L6474, POWERSTEP01,
     *          TB6560, TB6600, TMC2100,
     *          TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
     *          TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
     *          TMC26X,  TMC26X_STANDALONE,  TMC2660, TMC2660_STANDALONE,
     *          TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
     * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'L6470', 'L6474', 'POWERSTEP01', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC26X', 'TMC26X_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
    #define X_DRIVER_TYPE  TMC2209
    #define Y_DRIVER_TYPE  TMC2209
    #define Z_DRIVER_TYPE  TMC2209
    //#define X2_DRIVER_TYPE A4988
    //#define Y2_DRIVER_TYPE A4988
    #define Z2_DRIVER_TYPE TMC2209
    //#define Z3_DRIVER_TYPE A4988
    #define E0_DRIVER_TYPE TMC2209
    //#define E1_DRIVER_TYPE A4988
    //#define E2_DRIVER_TYPE A4988
    //#define E3_DRIVER_TYPE A4988
    //#define E4_DRIVER_TYPE A4988
    //#define E5_DRIVER_TYPE A4988


  • Line 732: This is your Estep value. For BMG it’s 415, for Hemera is 409 You can start with 445 and do an Estep calibration later. 
     * Default Axis Steps Per Unit (steps/mm)
     * Override with M92
     *                                      X, Y, Z, E0 [, E1[, E2...]]
    #define DEFAULT_AXIS_STEPS_PER_UNIT   { 80, 80, 400, 415 }


  • Line 884: If you have BLTouch, enable it here.
    #define BLTOUCH


  • Line 941: Change your BLTouch offsets here accordingly. 

     * Specify a Probe position as { X, Y, Z }
    #define NOZZLE_TO_PROBE_OFFSET { 0, 28, 0 }


  • Line 954: Define the rate of the second "accurate" probe, in this case, I have used 4, this is calculated as the probe rate divided by whatever you choose, if you find you are getting inaccurate readings you can try a lower number
    // Feedrate (mm/m) for the "accurate" probe of each point


  • Line 985: This sets the height of the Nozzle once a probe is completed, for example during homing, it will home X, Y and then Z once that is done it will raise the nozzle 5mm above the bed.
    #define Z_AFTER_PROBING           5 // Z position after probing is done


  •  Line 994: Enable this to enable the probe test so you can check for accuracy.
    // Enable the M48 repeatability test to test probe accuracy


  • Line 1040: This is where you can change the direction of your stepper motors if one is going the wrong direction.
    // Invert the stepper direction. Change (or reverse the motor connector) if an axis goes the wrong way.
    #define INVERT_X_DIR true
    #define INVERT_Y_DIR true
    #define INVERT_Z_DIR false


  • Lines 1073 - 1082: This is where you define your printer’s parameters for print volume.
    // The size of the print bed
    #define X_BED_SIZE 310
    #define Y_BED_SIZE 310
    // Travel limits (mm) after homing, corresponding to endstop positions.
    #define X_MIN_POS 0
    #define Y_MIN_POS -5
    #define Z_MIN_POS 0
    #define X_MAX_POS X_BED_SIZE
    #define Y_MAX_POS Y_BED_SIZE
    #define Z_MAX_POS 400


  • Line 1185: If you are using a BLTOUCH you want to set the Auto Bed Levelling to Bilinear


  • Line 1193: Enable this to keep your Mesh Bed Leveling values after a G28 ( Homing) is performed.
  • Lines 1217: enable Mesh Validation (G26)
      #define G26_MESH_VALIDATION
        #define MESH_TEST_NOZZLE_SIZE    0.4  // (mm) Diameter of primary nozzle.
        #define MESH_TEST_LAYER_HEIGHT   0.2  // (mm) Default layer height for the G26 Mesh Validation Tool.
        #define MESH_TEST_HOTEND_TEMP  205    // (°C) Default nozzle temperature for the G26 Mesh Validation Tool.
        #define MESH_TEST_BED_TEMP      65    // (°C) Default bed temperature for the G26 Mesh Validation Tool.
        #define G26_XY_FEEDRATE         20    // (mm/s) Feedrate for XY Moves for the G26 Mesh Validation Tool.


  • Line 1231: This one tells the printer to probe 5 times per line. You can do more if you want more accuracy. 5 is enough IMO. 
    #define GRID_MAX_POINTS_X 5


  • Line 1241: Enable this so it interpolates the deviation of the bed outside the probed area.


  • Line 1291: I think this one enables you to probe from the LCD. 
    #define LCD_BED_LEVELING


  • Line 1296: Enable this for BLTouch.
    #define MESH_EDIT_MENU        // Add a menu to edit mesh points


  • Lines 1300 Enable this for manual bed adjustment:
  • Lines 1302-1306: Make sure these are all enabled
      #define LEVEL_CORNERS_INSET 50    // (mm) An inset for corner leveling
      #define LEVEL_CORNERS_Z_HOP  4.0  // (mm) Move nozzle up before moving between corners
      #define LEVEL_CORNERS_HEIGHT 0.0  // (mm) Z height of nozzle at leveling points
      #define LEVEL_CENTER_TOO        // Move to the center after the last corner
  • Line 1336: Enable safe homing
    #define Z_SAFE_HOMING


  • Line 1345: set the Z-axis homing speed.
    #define HOMING_FEEDRATE_Z  (20*60)


  • Line 1422: Enable this so you can M500 to be able to save to EEPROM.
    #define EEPROM_SETTINGS     // Persistent storage with M500 and M501


  • Line  1639: Enable this so you can print from the SD card.
    #define SDSUPPORT


  • Line  1890: Enable this to use the TFT35 V3.



  • Line  2230: Not Set the delay for the BLTOUCH servo pin. 200ms works well
    #define SERVO_DELAY { 200 }

    These are the changes I have for configuration.h





  • Line 402: Set the Fan pin to P2_04 this is for the fan to automatically turn on ONLY after the machine reaches 50 degrees
    #define E0_AUTO_FAN_PIN P2_04


  • Line 496: Enable this since we have 2 z stepper motors.


    in later versions of Marlin, this changed to  NUM_Z_STEPPER_DRIVERS which we would want to set to a value of 2

    #define NUM_Z_STEPPER_DRIVERS 2   // (1-4) Z options change based on how many


  • Line 572-574: For sensorless homing, I have it set to 0 so that it bumps just once when homing. Line 576: Enable this so that X and Y move at the same time when homing.
    #define X_HOME_BUMP_MM 0
    #define Y_HOME_BUMP_MM 0
    #define Z_HOME_BUMP_MM 0
    #define HOMING_BUMP_DIVISOR { 2, 2, 4 }  // Re-Bump Speed Divisor (Divides the Homing Feedrate)
    #define QUICK_HOME                     // If homing includes X and Y, do a diagonal move initially


  • Line 629: Enable this for BLTouch.
    #define BLTOUCH_SET_5V_MODE
  • Line 645: Enable this to set highspeed probing for the BLTOUCH
      #define BLTOUCH_HS_MODE


  • Line 824: Enable this for smoother stepper movements.


  • Line 894: Set the speed of Manul axis moves.

     #define MANUAL_FEEDRATE { 50*60, 50*60, 4*60, 2*60 } // Feedrates for manual moves along X, Y, Z, E from panel


  • Lines 962, 963, and 965: I have these enabled.

      #define PRINT_PROGRESS_SHOW_DECIMALS // Show progress with decimal digits
      #define SHOW_REMAINING_TIME          // Display estimated time to completion
        #define USE_M73_REMAINING_TIME     // Use remaining time from M73 command instead of estimation
        //#define ROTATE_PROGRESS_DISPLAY    // Display (P)rogress, (E)lapsed, and (R)emaining time


  • Line 1413  Enable to have baby stepping. This one is key to getting that perfect first layer. 
    #define BABYSTEPPING


  • Line 1425 Enable this so you can use baby step even when the printer is not currently printing
  • Line 1434 Enable this so that your baby steps will be saved to the EEPROM, moving your Z probe offset accordingly.
     #define BABYSTEP_ZPROBE_OFFSET          // Combine M851 Z and Babystepping
  • Line 1437 Enable the graphical overlay for baby-stepping.
    #define BABYSTEP_ZPROBE_GFX_OVERLAY   // Enable graphical overlay on Z-offset editor


  • Lines 1460, and 1463: Enable these for Linear Advance. Set the K value to 0 as this will vary between printers and will need to be calibrated for your specific machine, filament and extruder.
    #define LIN_ADVANCE
      //#define EXTRA_LIN_ADVANCE_K // Enable for second linear advance constants
      #define LIN_ADVANCE_K 0    // Unit: mm compression per 1mm/s extruder speed
      //#define LA_DEBUG            // If enabled, this will generate debug information output over USB.


  • Lines 1623, 1625 Change the BUFSIZE from 16 to 64, you now have a 32-bit board with more memory than stock, it can afford to load more movement into memory, this will help with concentric movements ( printing curves)
    // The number of linear motions that can be in the plan at any give time.
    // THE BLOCK_BUFFER_SIZE NEEDS TO BE A POWER OF 2 (e.g. 8, 16, 32) because shifts and ors are used to do the ring-buffering.
      #define BLOCK_BUFFER_SIZE 64 // SD,LCD,Buttons take more memory, block buffer needs to be smaller //GB 16
      #define BLOCK_BUFFER_SIZE 64 // maximize block buffer // GB 16


  • Line 1632: Increase the BUFSIZE to 64, this will help by loading more lines of code to memory for printing, this line, in particular, will assist with printing via USB e.g. Octoprint, as when the printer is printing curves it can sometimes complete all the stored lines of code before Ooctoprint is able to load more, causing a micropause and blobs on the print. 

    // The ASCII buffer for serial input
    #define MAX_CMD_SIZE 96
    #define BUFSIZE 64


  • Lines 1931 (X), 1947 (Y), 1963 (Z1), 1971 (Z2), 1987 (E0): If you have your steppers in UART mode aka, you took my advice, set your VREFs here. I have mine accordingly, X – 900, Y – 1200, Z1 and Z2 – 900, and E – 500. You don’t have to use these numbers but the bed is heavy so you’ll need more juice there. For the extruder, I have a moon’s stepper motor so it doesn’t need that much power. Remember, you can change these later on your new screen. 

    #define X_CURRENT       900        // (mA) RMS current. Multiply by 1.414 for peak current.
    #define Y_CURRENT       1200
    #define Z_CURRENT       900
    #define E0_CURRENT      500


  • Line 2113: Set this to 24v since we have 24v machines.


  • Line 2126: Enable Driver Monitoring and Error Checking for the TMC Drivers


  • Lines 2180, 2192, and 2194: Enable this for sensorless homing, I have my sensitivity at 100. The higher the number, the more sensitive. You don’t want this too high or it’ll home right in the middle. So this is one of those settings you’ll have to play around with to get just right.
    #define SENSORLESS_HOMING // StallGuard capable drivers only
    #define X_STALL_SENSITIVITY  100
    #define Y_STALL_SENSITIVITY  100


  • Line 2210: Enable this for stepper driver debugging
    #define TMC_DEBUG


  • Line 2715: I have this one enabled. To allow me to cancel objects if needed
    #define CANCEL_OBJECTS


Compiling the firmware and flashing the board

Step 1: Once the changes are made, click on the checkmark icon to build.


Step 2: It should look like this if everything is correct. 

Here’s what it looks like if there’s an error. 

VS Code will tell you what’s causing this error. Look through these messages and fix them. Unfortunately, there’s no way around this, this is what makes this upgrade, not for the faint of heart. In this case, I purposely made the board name incorrect to show what it looks like when it errors.  

Step 3: Now that you have a successfully compiled firmware, we can upload it to our sd card and insert it into our board. Reveal the location of the bin file. 

Step 4: Drag this file to your Micro SD Card. Note the date modified date and time. It should be pretty recent. If it isn’t, you didn’t compile it correctly. Also, if this folder is empty, you didn’t compile it correctly.  

Step 5: Once you have ‘firmware.bin’ on the SD Card, insert it into your board with the X1 off and then turn it on after the card is inserted. If you can see the SD Card, you’ll see that the file changed from ‘firmware.bin’ to ‘firmware.cur’. That means that your board has accepted the firmware. 


That’s it for the board firmware, now we need to make sure the TFT35 has the correct firmware. 

Step 1: Get the LCD firmware. You can use mine in the downloads section. It has my logo as the splash screen. How cool is that! If you’re not a fan of 3D Chanh. Sad. ☹ You can get the firmware here: https://github.com/bigtreetech/BIGTREETECH-TouchScreenFirmware

Step 2: This one uses the original SD Card. So, bust out your adaptor unless you have some laying around. Here are the instructions for loading the firmware to the LCD from their manual: https://github.com/bigtreetech/BIGTREETECH-TFT35-V3.0/blob/master/TFT35%20V3.0%20user%20manual-2019-11-28.pdf

Once the firmware has been loaded onto your board and onto your screen, you can start things up and do test prints till everything is fine-tuned how you like it. I didn’t have a guide like this when I did this upgrade so consider yourself lucky! I did everything pretty much blindly. I’m not some savant scientist, and if I can do it, you can. 😊- Happy printing!


2replies Oldest first
  • Oldest first
  • Newest first
  • Active threads
  • Popular
  • Amazing writeup, and perfect timing since I'm just about to start tuning my SKR Turbo. Thank you!

    • M P Not a problem at all, I'm glad you liked it. If you need any help feel free to reach out :) 

Like1 Follow
  • 9 days agoLast active
  • 2Replies
  • 721Views
  • 2 Following