Coolstep for TMC2130, 2209, 5130, 5160 (#16790)
This commit is contained in:
		
							parent
							
								
									f0cbc85a07
								
							
						
					
					
						commit
						894762259b
					
				@ -674,11 +674,6 @@
 | 
			
		||||
//#define X_DRIVER_TYPE  A4988
 | 
			
		||||
//#define Y_DRIVER_TYPE  A4988
 | 
			
		||||
//#define Z_DRIVER_TYPE  A4988
 | 
			
		||||
//#define X2_DRIVER_TYPE A4988
 | 
			
		||||
//#define Y2_DRIVER_TYPE A4988
 | 
			
		||||
//#define Z2_DRIVER_TYPE A4988
 | 
			
		||||
//#define Z3_DRIVER_TYPE A4988
 | 
			
		||||
//#define Z4_DRIVER_TYPE A4988
 | 
			
		||||
//#define E0_DRIVER_TYPE A4988
 | 
			
		||||
//#define E1_DRIVER_TYPE A4988
 | 
			
		||||
//#define E2_DRIVER_TYPE A4988
 | 
			
		||||
 | 
			
		||||
@ -2275,6 +2275,166 @@
 | 
			
		||||
  #define E6_HYBRID_THRESHOLD     30
 | 
			
		||||
  #define E7_HYBRID_THRESHOLD     30
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * CoolStep. Currently supported for TMC2130, TMC2209, TMC5130 and TMC5160 only.
 | 
			
		||||
   * This mode allows for cooler steppers and energy savings.
 | 
			
		||||
   * The driver will switch to coolStep when stepper speed is over COOLSTEP_THRESHOLD mm/s.
 | 
			
		||||
   *
 | 
			
		||||
   * If SG_RESULT goes below COOLSTEP_LOWER_LOAD_THRESHOLD * 32 stepper current will be increased.
 | 
			
		||||
   * Set to 0 to disable CoolStep.
 | 
			
		||||
   *
 | 
			
		||||
   * If SG_RESULT goes above (COOLSTEP_LOWER_LOAD_THRESHOLD + COOLSTEP_UPPER_LOAD_THRESHOLD + 1) * 32
 | 
			
		||||
   * stepper current will be decreased.
 | 
			
		||||
   *
 | 
			
		||||
   * SEUP sets the increase step width. Value range is 0..3 and computed as 2^SEUP.
 | 
			
		||||
   * SEDN sets the decrease delay. Value range is 0..3, 0 being the slowest.
 | 
			
		||||
   * SEIMIN sets the lower current limit. 0: 1/2 of IRUN, 1:1/4 of IRUN
 | 
			
		||||
   */
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(X)
 | 
			
		||||
    #define X_COOLSTEP_SPEED_THRESHOLD        5
 | 
			
		||||
    #define X_COOLSTEP_LOWER_LOAD_THRESHOLD   7
 | 
			
		||||
    #define X_COOLSTEP_UPPER_LOAD_THRESHOLD   0
 | 
			
		||||
    #define X_COOLSTEP_SEUP                   2
 | 
			
		||||
    #define X_COOLSTEP_SEDN                   0
 | 
			
		||||
    #define X_COOLSTEP_SEIMIN                 1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(X2)
 | 
			
		||||
    #define X2_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define X2_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define X2_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define X2_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define X2_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define X2_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(Y)
 | 
			
		||||
    #define Y_COOLSTEP_SPEED_THRESHOLD        5
 | 
			
		||||
    #define Y_COOLSTEP_LOWER_LOAD_THRESHOLD   7
 | 
			
		||||
    #define Y_COOLSTEP_UPPER_LOAD_THRESHOLD   0
 | 
			
		||||
    #define Y_COOLSTEP_SEUP                   2
 | 
			
		||||
    #define Y_COOLSTEP_SEDN                   0
 | 
			
		||||
    #define Y_COOLSTEP_SEIMIN                 1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(Y2)
 | 
			
		||||
    #define Y2_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define Y2_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define Y2_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define Y2_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define Y2_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define Y2_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(Z)
 | 
			
		||||
    #define Z_COOLSTEP_SPEED_THRESHOLD        5
 | 
			
		||||
    #define Z_COOLSTEP_LOWER_LOAD_THRESHOLD   7
 | 
			
		||||
    #define Z_COOLSTEP_UPPER_LOAD_THRESHOLD   0
 | 
			
		||||
    #define Z_COOLSTEP_SEUP                   2
 | 
			
		||||
    #define Z_COOLSTEP_SEDN                   0
 | 
			
		||||
    #define Z_COOLSTEP_SEIMIN                 1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(Z2)
 | 
			
		||||
    #define Z2_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define Z2_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define Z2_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define Z2_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define Z2_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define Z2_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(Z3)
 | 
			
		||||
    #define Z3_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define Z3_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define Z3_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define Z3_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define Z3_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define Z3_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(Z4)
 | 
			
		||||
    #define Z4_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define Z4_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define Z4_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define Z4_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define Z4_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define Z4_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E0)
 | 
			
		||||
    #define E0_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E0_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E0_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E0_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E0_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E0_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E1)
 | 
			
		||||
    #define E1_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E1_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E1_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E1_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E1_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E1_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E2)
 | 
			
		||||
    #define E2_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E2_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E2_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E2_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E2_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E2_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E3)
 | 
			
		||||
    #define E3_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E3_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E3_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E3_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E3_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E3_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E4)
 | 
			
		||||
    #define E4_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E4_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E4_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E4_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E4_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E4_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E5)
 | 
			
		||||
    #define E5_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E5_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E5_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E5_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E5_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E5_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E6)
 | 
			
		||||
    #define E6_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E6_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E6_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E6_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E6_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E6_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if AXIS_HAS_COOLSTEP(E7)
 | 
			
		||||
    #define E7_COOLSTEP_SPEED_THRESHOLD       5
 | 
			
		||||
    #define E7_COOLSTEP_LOWER_LOAD_THRESHOLD  7
 | 
			
		||||
    #define E7_COOLSTEP_UPPER_LOAD_THRESHOLD  0
 | 
			
		||||
    #define E7_COOLSTEP_SEUP                  2
 | 
			
		||||
    #define E7_COOLSTEP_SEDN                  0
 | 
			
		||||
    #define E7_COOLSTEP_SEIMIN                1
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Use StallGuard2 to home / probe X, Y, Z.
 | 
			
		||||
   *
 | 
			
		||||
 | 
			
		||||
@ -60,6 +60,6 @@
 | 
			
		||||
  #error "TMCStepper includes SoftwareSerial.h which is incompatible with ENDSTOP_INTERRUPTS_FEATURE. Disable ENDSTOP_INTERRUPTS_FEATURE to continue."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL && ENABLED(MONITOR_DRIVER_STATUS)
 | 
			
		||||
#if HAS_TMC_SW_SERIAL && ENABLED(MONITOR_DRIVER_STATUS)
 | 
			
		||||
  #error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -56,6 +56,6 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -29,7 +29,7 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -34,6 +34,6 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -47,6 +47,6 @@
 | 
			
		||||
  #warning "Did you activate the SmartEEPROM? See https://github.com/GMagician/SAMD51-SmartEEprom-Activator"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -28,7 +28,7 @@
 | 
			
		||||
#include "../../inc/MarlinConfig.h"
 | 
			
		||||
#include "../shared/Delay.h"
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #include "SoftwareSerial.h"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -87,7 +87,7 @@ void HAL_init() {
 | 
			
		||||
  while (!LL_PWR_IsActiveFlag_BRR());
 | 
			
		||||
  #endif // EEPROM_EMULATED_SRAM
 | 
			
		||||
 | 
			
		||||
  #if TMC_HAS_SW_SERIAL
 | 
			
		||||
  #if HAS_TMC_SW_SERIAL
 | 
			
		||||
    SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIO, 0);
 | 
			
		||||
  #endif
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -37,7 +37,7 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(HAVE_SW_SERIAL) && TMC_HAS_SW_SERIAL
 | 
			
		||||
#if !defined(HAVE_SW_SERIAL) && HAS_TMC_SW_SERIAL
 | 
			
		||||
  #warning "With TMC2208/9 consider using SoftwareSerialM with HAVE_SW_SERIAL and appropriate SS_TIMER."
 | 
			
		||||
  #error "Missing SoftwareSerial implementation."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -36,6 +36,6 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -33,6 +33,6 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -33,6 +33,6 @@
 | 
			
		||||
  #error "FAST_PWM_FAN is not yet implemented for this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SW_SERIAL
 | 
			
		||||
#if HAS_TMC_SW_SERIAL
 | 
			
		||||
  #error "TMC220x Software Serial is not supported on this platform."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -892,7 +892,7 @@ void setup() {
 | 
			
		||||
  SERIAL_ECHOLNPGM("start");
 | 
			
		||||
  SERIAL_ECHO_START();
 | 
			
		||||
 | 
			
		||||
  #if TMC_HAS_SPI
 | 
			
		||||
  #if HAS_TMC_SPI
 | 
			
		||||
    #if DISABLED(TMC_USE_SW_SPI)
 | 
			
		||||
      SPI.begin();
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
@ -52,7 +52,7 @@
 | 
			
		||||
#define _TMC5160_STANDALONE 0x5160B
 | 
			
		||||
 | 
			
		||||
#define _DRIVER_ID(V) _CAT(_, V)
 | 
			
		||||
#define _AXIS_DRIVER_TYPE(A,T) (_DRIVER_ID(A##_DRIVER_TYPE) == _CAT(_, T))
 | 
			
		||||
#define _AXIS_DRIVER_TYPE(A,T) (_DRIVER_ID(A##_DRIVER_TYPE) == _DRIVER_ID(T))
 | 
			
		||||
 | 
			
		||||
#define AXIS_DRIVER_TYPE_X(T) _AXIS_DRIVER_TYPE(X,T)
 | 
			
		||||
#define AXIS_DRIVER_TYPE_Y(T) _AXIS_DRIVER_TYPE(Y,T)
 | 
			
		||||
@ -148,19 +148,32 @@
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC5130) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC5160) )
 | 
			
		||||
 | 
			
		||||
#define AXIS_HAS_SG_RESULT(A)    (    AXIS_DRIVER_TYPE(A,TMC2130) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC2160) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC2208) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC2209) )
 | 
			
		||||
 | 
			
		||||
#define AXIS_HAS_COOLSTEP(A)     (    AXIS_DRIVER_TYPE(A,TMC2130) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC2209) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC5130) \
 | 
			
		||||
                                   || AXIS_DRIVER_TYPE(A,TMC5160) )
 | 
			
		||||
 | 
			
		||||
#define _OR_EAH(N,T)    || AXIS_HAS_##T(E##N)
 | 
			
		||||
#define E_AXIS_HAS(T)   (0 RREPEAT2(E_STEPPERS, _OR_EAH, T))
 | 
			
		||||
 | 
			
		||||
#define ANY_AXIS_HAS(T) (    AXIS_HAS_##T(X)  || AXIS_HAS_##T(X2) \
 | 
			
		||||
                          || AXIS_HAS_##T(Y)  || AXIS_HAS_##T(Y2) \
 | 
			
		||||
                          || AXIS_HAS_##T(Z)  || AXIS_HAS_##T(Z2) \
 | 
			
		||||
                          || AXIS_HAS_##T(Z3) \
 | 
			
		||||
                          || AXIS_HAS_##T(E0) || AXIS_HAS_##T(E1) \
 | 
			
		||||
                          || AXIS_HAS_##T(E2) || AXIS_HAS_##T(E3) \
 | 
			
		||||
                          || AXIS_HAS_##T(E4) || AXIS_HAS_##T(E5) \
 | 
			
		||||
                          || AXIS_HAS_##T(E6) || AXIS_HAS_##T(E7) )
 | 
			
		||||
                          || AXIS_HAS_##T(Z3) || AXIS_HAS_##T(Z4) \
 | 
			
		||||
                          || E_AXIS_HAS(T) )
 | 
			
		||||
 | 
			
		||||
#define HAS_STEALTHCHOP    ANY_AXIS_HAS(STEALTHCHOP)
 | 
			
		||||
#define HAS_STALLGUARD     ANY_AXIS_HAS(STALLGUARD)
 | 
			
		||||
#define TMC_HAS_SPI        ANY_AXIS_HAS(SPI)
 | 
			
		||||
#define TMC_HAS_SW_SERIAL  ANY_AXIS_HAS(SW_SERIAL)
 | 
			
		||||
#define HAS_SG_RESULT      ANY_AXIS_HAS(SG_RESULT)
 | 
			
		||||
#define HAS_COOLSTEP       ANY_AXIS_HAS(COOLSTEP)
 | 
			
		||||
#define HAS_TMC_UART       ANY_AXIS_HAS(UART)
 | 
			
		||||
#define HAS_TMC_SPI        ANY_AXIS_HAS(SPI)
 | 
			
		||||
#define HAS_TMC_SW_SERIAL  ANY_AXIS_HAS(SW_SERIAL)
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
// Stretching 'drivers.h' to include LPC/SAMD51 SD options
 | 
			
		||||
 | 
			
		||||
@ -629,6 +629,15 @@
 | 
			
		||||
        default: break;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #if HAS_DRIVER(TMC2209)
 | 
			
		||||
      static void _tmc_parse_drv_status(TMC2209Stepper &st, const TMC_drv_status_enum i) {
 | 
			
		||||
        switch (i) {
 | 
			
		||||
          case TMC_SG_RESULT: SERIAL_PRINT(st.SG_RESULT(), DEC); break;
 | 
			
		||||
          default:            _tmc_parse_drv_status(static_cast<TMC2208Stepper &>(st), i); break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    #endif
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if HAS_DRIVER(TMC2660)
 | 
			
		||||
@ -891,24 +900,24 @@
 | 
			
		||||
    TMC_REPORT("stealthChop",        TMC_STEALTHCHOP);
 | 
			
		||||
    TMC_REPORT("msteps\t",           TMC_MICROSTEPS);
 | 
			
		||||
    TMC_REPORT("tstep\t",            TMC_TSTEP);
 | 
			
		||||
    TMC_REPORT("pwm\nthreshold",     TMC_TPWMTHRS);
 | 
			
		||||
    TMC_REPORT("PWM thresh.",        TMC_TPWMTHRS);
 | 
			
		||||
    TMC_REPORT("[mm/s]\t",           TMC_TPWMTHRS_MMS);
 | 
			
		||||
    TMC_REPORT("OT prewarn",         TMC_OTPW);
 | 
			
		||||
    #if ENABLED(MONITOR_DRIVER_STATUS)
 | 
			
		||||
      TMC_REPORT("OT prewarn has\n"
 | 
			
		||||
                 "been triggered",   TMC_OTPW_TRIGGERED);
 | 
			
		||||
      TMC_REPORT("triggered\n OTP\t", TMC_OTPW_TRIGGERED);
 | 
			
		||||
    #endif
 | 
			
		||||
    TMC_REPORT("off time",           TMC_TOFF);
 | 
			
		||||
    TMC_REPORT("blank time",         TMC_TBL);
 | 
			
		||||
    TMC_REPORT("hysteresis\n-end\t", TMC_HEND);
 | 
			
		||||
    TMC_REPORT("-start\t",           TMC_HSTRT);
 | 
			
		||||
    TMC_REPORT("hysteresis\n -end\t", TMC_HEND);
 | 
			
		||||
    TMC_REPORT(" -start\t",          TMC_HSTRT);
 | 
			
		||||
    TMC_REPORT("Stallguard thrs",    TMC_SGT);
 | 
			
		||||
 | 
			
		||||
    DRV_REPORT("DRVSTATUS",          TMC_DRV_CODES);
 | 
			
		||||
    #if HAS_TMCX1X0
 | 
			
		||||
      DRV_REPORT("stallguard\t",     TMC_STALLGUARD);
 | 
			
		||||
    #if HAS_TMCX1X0 || HAS_TMC220x
 | 
			
		||||
      DRV_REPORT("sg_result",        TMC_SG_RESULT);
 | 
			
		||||
      DRV_REPORT("fsactive\t",       TMC_FSACTIVE);
 | 
			
		||||
    #endif
 | 
			
		||||
    #if HAS_TMCX1X0
 | 
			
		||||
      DRV_REPORT("stallguard",       TMC_STALLGUARD);
 | 
			
		||||
      DRV_REPORT("fsactive",         TMC_FSACTIVE);
 | 
			
		||||
    #endif
 | 
			
		||||
    DRV_REPORT("stst\t",             TMC_STST);
 | 
			
		||||
    DRV_REPORT("olb\t",              TMC_OLB);
 | 
			
		||||
@ -1103,7 +1112,7 @@
 | 
			
		||||
 | 
			
		||||
#endif // USE_SENSORLESS
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SPI
 | 
			
		||||
#if HAS_TMC_SPI
 | 
			
		||||
  #define SET_CS_PIN(st) OUT_WRITE(st##_CS_PIN, HIGH)
 | 
			
		||||
  void tmc_init_cs_pins() {
 | 
			
		||||
    #if AXIS_HAS_SPI(X)
 | 
			
		||||
@ -1155,7 +1164,7 @@
 | 
			
		||||
      SET_CS_PIN(E7);
 | 
			
		||||
    #endif
 | 
			
		||||
  }
 | 
			
		||||
#endif // TMC_HAS_SPI
 | 
			
		||||
#endif // HAS_TMC_SPI
 | 
			
		||||
 | 
			
		||||
template<typename TMC>
 | 
			
		||||
static bool test_connection(TMC &st) {
 | 
			
		||||
 | 
			
		||||
@ -110,6 +110,7 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
 | 
			
		||||
      inline void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); }
 | 
			
		||||
      inline bool get_stealthChop_status() { return this->en_pwm_mode(); }
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      uint32_t get_pwm_thrs() {
 | 
			
		||||
        return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
 | 
			
		||||
@ -121,6 +122,7 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
 | 
			
		||||
        #endif
 | 
			
		||||
      }
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if USE_SENSORLESS
 | 
			
		||||
      inline int16_t homing_threshold() { return TMC::sgt(); }
 | 
			
		||||
      void homing_threshold(int16_t sgt_val) {
 | 
			
		||||
@ -135,6 +137,13 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
 | 
			
		||||
      #endif
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    uint32_t get_cool_thrs() {
 | 
			
		||||
      return _tmc_thrs(this->microsteps(), this->TCOOLTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
 | 
			
		||||
    }
 | 
			
		||||
    void set_cool_thrs(const uint32_t thrs) {
 | 
			
		||||
      TMC::TCOOLTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #if HAS_LCD_MENU
 | 
			
		||||
      inline void refresh_stepper_current() { rms_current(this->val_mA); }
 | 
			
		||||
 | 
			
		||||
@ -149,6 +158,7 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
 | 
			
		||||
    static constexpr int8_t sgt_min = -64,
 | 
			
		||||
                            sgt_max =  63;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
class TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC2208Stepper, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
 | 
			
		||||
  public:
 | 
			
		||||
@ -172,6 +182,7 @@ class TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
 | 
			
		||||
      inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); }
 | 
			
		||||
      inline bool get_stealthChop_status() { return !this->en_spreadCycle(); }
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      uint32_t get_pwm_thrs() {
 | 
			
		||||
        return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
 | 
			
		||||
@ -217,6 +228,7 @@ class TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
 | 
			
		||||
      inline void refresh_stepping_mode() { en_spreadCycle(!this->stored.stealthChop_enabled); }
 | 
			
		||||
      inline bool get_stealthChop_status() { return !this->en_spreadCycle(); }
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      uint32_t get_pwm_thrs() {
 | 
			
		||||
        return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
 | 
			
		||||
@ -228,6 +240,14 @@ class TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
 | 
			
		||||
        #endif
 | 
			
		||||
      }
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    uint32_t get_cool_thrs() {
 | 
			
		||||
      return _tmc_thrs(this->microsteps(), this->TCOOLTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
 | 
			
		||||
    }
 | 
			
		||||
    void set_cool_thrs(const uint32_t thrs) {
 | 
			
		||||
      TMC2209Stepper::TCOOLTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    #if USE_SENSORLESS
 | 
			
		||||
      inline int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); }
 | 
			
		||||
      void homing_threshold(int16_t sgt_val) {
 | 
			
		||||
@ -241,7 +261,6 @@ class TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
 | 
			
		||||
 | 
			
		||||
    #if HAS_LCD_MENU
 | 
			
		||||
      inline void refresh_stepper_current() { rms_current(this->val_mA); }
 | 
			
		||||
 | 
			
		||||
      #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
        inline void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
 | 
			
		||||
      #endif
 | 
			
		||||
@ -391,7 +410,7 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z
 | 
			
		||||
 | 
			
		||||
#endif // USE_SENSORLESS
 | 
			
		||||
 | 
			
		||||
#if TMC_HAS_SPI
 | 
			
		||||
#if HAS_TMC_SPI
 | 
			
		||||
  void tmc_init_cs_pins();
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -2040,6 +2040,62 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
 | 
			
		||||
  #error "LED_USER_PRESET_STARTUP is required for FYSETC_MINI_12864 2.x displays."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Make sure CoolStep settings exist
 | 
			
		||||
 */
 | 
			
		||||
#if HAS_COOLSTEP
 | 
			
		||||
  #define NEEDS_COOLSTEP(A) AXIS_HAS_COOLSTEP(A) && !(defined(A##_COOLSTEP_SPEED_THRESHOLD) && defined(A##_COOLSTEP_LOWER_LOAD_THRESHOLD) && defined(A##_COOLSTEP_UPPER_LOAD_THRESHOLD) && defined(A##_COOLSTEP_SEUP) && defined(A##_COOLSTEP_SEDN) && defined(A##_COOLSTEP_SEIMIN))
 | 
			
		||||
  #if NEEDS_COOLSTEP(X)
 | 
			
		||||
    #error "X COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(X2)
 | 
			
		||||
    #error "X2 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(Y)
 | 
			
		||||
    #error "Y COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(Y2)
 | 
			
		||||
    #error "Y2 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(Z)
 | 
			
		||||
    #error "Z COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(Z2)
 | 
			
		||||
    #error "Z2 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(Z3)
 | 
			
		||||
    #error "Z3 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(Z4)
 | 
			
		||||
    #error "Z4 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E0)
 | 
			
		||||
    #error "E0 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E1)
 | 
			
		||||
    #error "E1 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E2)
 | 
			
		||||
    #error "E2 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E3)
 | 
			
		||||
    #error "E3 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E4)
 | 
			
		||||
    #error "E4 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E5)
 | 
			
		||||
    #error "E5 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E6)
 | 
			
		||||
    #error "E6 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #if NEEDS_COOLSTEP(E7)
 | 
			
		||||
    #error "E7 COOLSTEP settings must be defined in Configuration_adv.h."
 | 
			
		||||
  #endif
 | 
			
		||||
  #undef NEEDS_COOLSTEP
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Check existing CS pins against enabled TMC SPI drivers.
 | 
			
		||||
 */
 | 
			
		||||
@ -2650,6 +2706,6 @@ static_assert(   _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
 | 
			
		||||
 * Check to make sure MONITOR_DRIVER_STATUS isn't enabled
 | 
			
		||||
 * on boards where TMC drivers share the SPI bus with SD.
 | 
			
		||||
 */
 | 
			
		||||
#if TMC_HAS_SPI && ALL(MONITOR_DRIVER_STATUS, SDSUPPORT, USES_SHARED_SPI)
 | 
			
		||||
#if HAS_TMC_SPI && ALL(MONITOR_DRIVER_STATUS, SDSUPPORT, USES_SHARED_SPI)
 | 
			
		||||
  #error "MONITOR_DRIVER_STATUS and SDSUPPORT cannot be used together on boards with shared SPI."
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
@ -1496,7 +1496,7 @@ void Stepper::stepper_pulse_phase_isr() {
 | 
			
		||||
    #define _APPLY_STEP(AXIS) AXIS ##_APPLY_STEP
 | 
			
		||||
    #define _INVERT_STEP_PIN(AXIS) INVERT_## AXIS ##_STEP_PIN
 | 
			
		||||
 | 
			
		||||
    // Determine if pulses are needed
 | 
			
		||||
    // Determine if a pulse is needed using Bresenham
 | 
			
		||||
    #define PULSE_PREP(AXIS) do{ \
 | 
			
		||||
      delta_error[_AXIS(AXIS)] += advance_dividend[_AXIS(AXIS)]; \
 | 
			
		||||
      step_needed[_AXIS(AXIS)] = (delta_error[_AXIS(AXIS)] >= 0); \
 | 
			
		||||
 | 
			
		||||
@ -36,7 +36,19 @@
 | 
			
		||||
#include <SPI.h>
 | 
			
		||||
 | 
			
		||||
enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
#define _TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX])
 | 
			
		||||
#define _TMC_INIT_1(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS)
 | 
			
		||||
#define _TMC_INIT_2(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, stealthchop_by_axis[STEALTH_INDEX], ST##_HYBRID_THRESHOLD)
 | 
			
		||||
#define _TMC_INIT_3(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, stealthchop_by_axis[STEALTH_INDEX], ST##_HYBRID_THRESHOLD, ST##_COOLSTEP_SPEED_THRESHOLD, ST##_COOLSTEP_LOWER_LOAD_THRESHOLD, ST##_COOLSTEP_UPPER_LOAD_THRESHOLD, ST##_COOLSTEP_SEUP, ST##_COOLSTEP_SEDN, ST##_COOLSTEP_SEIMIN)
 | 
			
		||||
#define _TMC_INIT_TMC2660(ST, STEALTH_INDEX) _TMC_INIT_1(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT_TMC2160(ST, STEALTH_INDEX) _TMC_INIT_2(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT_TMC2208(ST, STEALTH_INDEX) _TMC_INIT_2(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT_TMC5130(ST, STEALTH_INDEX) _TMC_INIT_3(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT_TMC5160(ST, STEALTH_INDEX) _TMC_INIT_3(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT_TMC2130(ST, STEALTH_INDEX) _TMC_INIT_3(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT_TMC2209(ST, STEALTH_INDEX) _TMC_INIT_3(ST, STEALTH_INDEX)
 | 
			
		||||
#define __TMC_INIT(DRV, ST, STEALTH_INDEX) _TMC_INIT_##DRV(ST, STEALTH_INDEX)
 | 
			
		||||
#define _TMC_INIT(DRV, ST, STEALTH_INDEX) __TMC_INIT(DRV, ST, STEALTH_INDEX)
 | 
			
		||||
#define TMC_INIT(ST, STEALTH_INDEX) _TMC_INIT(ST##_DRIVER_TYPE, ST, STEALTH_INDEX)
 | 
			
		||||
 | 
			
		||||
//   IC = TMC model number
 | 
			
		||||
//   ST = Stepper object letter
 | 
			
		||||
@ -122,7 +134,19 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2130)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps,
 | 
			
		||||
    const bool stealth,
 | 
			
		||||
    const uint32_t hyb_thrs,
 | 
			
		||||
    const uint32_t cool_thrs,
 | 
			
		||||
    const uint8_t cool_semin,
 | 
			
		||||
    const uint8_t cool_semax,
 | 
			
		||||
    const uint8_t cool_seup,
 | 
			
		||||
    const uint8_t cool_sedn,
 | 
			
		||||
    const bool cool_seimin
 | 
			
		||||
  ) {
 | 
			
		||||
    st.begin();
 | 
			
		||||
 | 
			
		||||
    CHOPCONF_t chopconf{0};
 | 
			
		||||
@ -152,18 +176,33 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
    st.PWMCONF(pwmconf.sr);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      st.set_pwm_thrs(thrs);
 | 
			
		||||
      st.set_pwm_thrs(hyb_thrs);
 | 
			
		||||
    #else
 | 
			
		||||
      UNUSED(thrs);
 | 
			
		||||
      UNUSED(hyb_thrs);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    st.set_cool_thrs(cool_thrs);  // (mm/s)
 | 
			
		||||
    COOLCONF_t coolconf{0};
 | 
			
		||||
    coolconf.semin = cool_semin;
 | 
			
		||||
    coolconf.semax = cool_semax;
 | 
			
		||||
    coolconf.seup = cool_seup;
 | 
			
		||||
    coolconf.sedn = cool_sedn;
 | 
			
		||||
    coolconf.seimin = cool_seimin;
 | 
			
		||||
    st.COOLCONF(coolconf.sr);
 | 
			
		||||
 | 
			
		||||
    st.GSTAT(); // Clear GSTAT
 | 
			
		||||
  }
 | 
			
		||||
#endif // TMC2130
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2160)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps,
 | 
			
		||||
    const bool stealth,
 | 
			
		||||
    const uint32_t hyb_thrs
 | 
			
		||||
  ) {
 | 
			
		||||
    st.begin();
 | 
			
		||||
 | 
			
		||||
    CHOPCONF_t chopconf{0};
 | 
			
		||||
@ -196,9 +235,9 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
    st.PWMCONF(pwmconf.sr);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      st.set_pwm_thrs(thrs);
 | 
			
		||||
      st.set_pwm_thrs(hyb_thrs);
 | 
			
		||||
    #else
 | 
			
		||||
      UNUSED(thrs);
 | 
			
		||||
      UNUSED(hyb_thrs);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    st.GSTAT(); // Clear GSTAT
 | 
			
		||||
@ -440,7 +479,13 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps,
 | 
			
		||||
    const bool stealth,
 | 
			
		||||
    const uint32_t hyb_thrs
 | 
			
		||||
  ) {
 | 
			
		||||
    TMC2208_n::GCONF_t gconf{0};
 | 
			
		||||
    gconf.pdn_disable = true; // Use UART
 | 
			
		||||
    gconf.mstep_reg_select = true; // Select microsteps with UART
 | 
			
		||||
@ -476,9 +521,9 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
    st.PWMCONF(pwmconf.sr);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      st.set_pwm_thrs(thrs);
 | 
			
		||||
      st.set_pwm_thrs(hyb_thrs);
 | 
			
		||||
    #else
 | 
			
		||||
      UNUSED(thrs);
 | 
			
		||||
      UNUSED(hyb_thrs);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    st.GSTAT(0b111); // Clear
 | 
			
		||||
@ -488,7 +533,19 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2209)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps,
 | 
			
		||||
    const bool stealth,
 | 
			
		||||
    const uint32_t hyb_thrs,
 | 
			
		||||
    const uint32_t cool_thrs,
 | 
			
		||||
    const uint8_t cool_semin,
 | 
			
		||||
    const uint8_t cool_semax,
 | 
			
		||||
    const uint8_t cool_seup,
 | 
			
		||||
    const uint8_t cool_sedn,
 | 
			
		||||
    const bool cool_seimin
 | 
			
		||||
  ) {
 | 
			
		||||
    TMC2208_n::GCONF_t gconf{0};
 | 
			
		||||
    gconf.pdn_disable = true; // Use UART
 | 
			
		||||
    gconf.mstep_reg_select = true; // Select microsteps with UART
 | 
			
		||||
@ -524,11 +581,20 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
    st.PWMCONF(pwmconf.sr);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      st.set_pwm_thrs(thrs);
 | 
			
		||||
      st.set_pwm_thrs(hyb_thrs);
 | 
			
		||||
    #else
 | 
			
		||||
      UNUSED(thrs);
 | 
			
		||||
      UNUSED(hyb_thrs);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    st.set_cool_thrs(cool_thrs);  // (mm/s)
 | 
			
		||||
    COOLCONF_t coolconf{0};
 | 
			
		||||
    coolconf.semin = cool_semin;
 | 
			
		||||
    coolconf.semax = cool_semax;
 | 
			
		||||
    coolconf.seup = cool_seup;
 | 
			
		||||
    coolconf.sedn = cool_sedn;
 | 
			
		||||
    coolconf.seimin = cool_seimin;
 | 
			
		||||
    st.COOLCONF(coolconf.sr);
 | 
			
		||||
 | 
			
		||||
    st.GSTAT(0b111); // Clear
 | 
			
		||||
    delay(200);
 | 
			
		||||
  }
 | 
			
		||||
@ -536,7 +602,11 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2660)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps
 | 
			
		||||
  ) {
 | 
			
		||||
    st.begin();
 | 
			
		||||
 | 
			
		||||
    TMC2660_n::CHOPCONF_t chopconf{0};
 | 
			
		||||
@ -563,7 +633,19 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC5130)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC5130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC5130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps,
 | 
			
		||||
    const bool stealth,
 | 
			
		||||
    const uint32_t hyb_thrs,
 | 
			
		||||
    const uint32_t cool_thrs,
 | 
			
		||||
    const uint8_t cool_semin,
 | 
			
		||||
    const uint8_t cool_semax,
 | 
			
		||||
    const uint8_t cool_seup,
 | 
			
		||||
    const uint8_t cool_sedn,
 | 
			
		||||
    const bool cool_seimin
 | 
			
		||||
  ) {
 | 
			
		||||
    st.begin();
 | 
			
		||||
 | 
			
		||||
    CHOPCONF_t chopconf{0};
 | 
			
		||||
@ -593,18 +675,39 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
    st.PWMCONF(pwmconf.sr);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      st.set_pwm_thrs(thrs);
 | 
			
		||||
      st.set_pwm_thrs(hyb_thrs);
 | 
			
		||||
    #else
 | 
			
		||||
      UNUSED(thrs);
 | 
			
		||||
      UNUSED(hyb_thrs);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    st.set_cool_thrs(cool_thrs);  // (mm/s)
 | 
			
		||||
    COOLCONF_t coolconf{0};
 | 
			
		||||
    coolconf.semin = cool_semin;
 | 
			
		||||
    coolconf.semax = cool_semax;
 | 
			
		||||
    coolconf.seup = cool_seup;
 | 
			
		||||
    coolconf.sedn = cool_sedn;
 | 
			
		||||
    coolconf.seimin = cool_seimin;
 | 
			
		||||
    st.COOLCONF(coolconf.sr);
 | 
			
		||||
 | 
			
		||||
    st.GSTAT(); // Clear GSTAT
 | 
			
		||||
  }
 | 
			
		||||
#endif // TMC5130
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC5160)
 | 
			
		||||
  template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
 | 
			
		||||
  void tmc_init(TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st, const uint16_t mA, const uint16_t microsteps, const uint32_t thrs, const bool stealth) {
 | 
			
		||||
  void tmc_init(
 | 
			
		||||
    TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &st,
 | 
			
		||||
    const uint16_t mA,
 | 
			
		||||
    const uint16_t microsteps,
 | 
			
		||||
    const bool stealth,
 | 
			
		||||
    const uint32_t hyb_thrs,
 | 
			
		||||
    const uint32_t cool_thrs,
 | 
			
		||||
    const uint8_t cool_semin,
 | 
			
		||||
    const uint8_t cool_semax,
 | 
			
		||||
    const uint8_t cool_seup,
 | 
			
		||||
    const uint8_t cool_sedn,
 | 
			
		||||
    const bool cool_seimin
 | 
			
		||||
  ) {
 | 
			
		||||
    st.begin();
 | 
			
		||||
 | 
			
		||||
    CHOPCONF_t chopconf{0};
 | 
			
		||||
@ -637,10 +740,20 @@ enum StealthIndex : uint8_t { STEALTH_AXIS_XY, STEALTH_AXIS_Z, STEALTH_AXIS_E };
 | 
			
		||||
    st.PWMCONF(pwmconf.sr);
 | 
			
		||||
 | 
			
		||||
    #if ENABLED(HYBRID_THRESHOLD)
 | 
			
		||||
      st.set_pwm_thrs(thrs);
 | 
			
		||||
      st.set_pwm_thrs(hyb_thrs);
 | 
			
		||||
    #else
 | 
			
		||||
      UNUSED(thrs);
 | 
			
		||||
      UNUSED(hyb_thrs);
 | 
			
		||||
    #endif
 | 
			
		||||
 | 
			
		||||
    st.set_cool_thrs(cool_thrs);  // (mm/s)
 | 
			
		||||
    COOLCONF_t coolconf{0};
 | 
			
		||||
    coolconf.semin = cool_semin;
 | 
			
		||||
    coolconf.semax = cool_semax;
 | 
			
		||||
    coolconf.seup = cool_seup;
 | 
			
		||||
    coolconf.sedn = cool_sedn;
 | 
			
		||||
    coolconf.seimin = cool_seimin;
 | 
			
		||||
    st.COOLCONF(coolconf.sr);
 | 
			
		||||
 | 
			
		||||
    st.GSTAT(); // Clear GSTAT
 | 
			
		||||
  }
 | 
			
		||||
#endif // TMC5160
 | 
			
		||||
@ -718,52 +831,52 @@ void reset_trinamic_drivers() {
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  #if AXIS_IS_TMC(X)
 | 
			
		||||
    _TMC_INIT(X, STEALTH_AXIS_XY);
 | 
			
		||||
    TMC_INIT(X, STEALTH_AXIS_XY);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(X2)
 | 
			
		||||
    _TMC_INIT(X2, STEALTH_AXIS_XY);
 | 
			
		||||
    TMC_INIT(X2, STEALTH_AXIS_XY);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(Y)
 | 
			
		||||
    _TMC_INIT(Y, STEALTH_AXIS_XY);
 | 
			
		||||
    TMC_INIT(Y, STEALTH_AXIS_XY);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(Y2)
 | 
			
		||||
    _TMC_INIT(Y2, STEALTH_AXIS_XY);
 | 
			
		||||
    TMC_INIT(Y2, STEALTH_AXIS_XY);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(Z)
 | 
			
		||||
    _TMC_INIT(Z, STEALTH_AXIS_Z);
 | 
			
		||||
    TMC_INIT(Z, STEALTH_AXIS_Z);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(Z2)
 | 
			
		||||
    _TMC_INIT(Z2, STEALTH_AXIS_Z);
 | 
			
		||||
    TMC_INIT(Z2, STEALTH_AXIS_Z);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(Z3)
 | 
			
		||||
    _TMC_INIT(Z3, STEALTH_AXIS_Z);
 | 
			
		||||
    TMC_INIT(Z3, STEALTH_AXIS_Z);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(Z4)
 | 
			
		||||
    _TMC_INIT(Z4, STEALTH_AXIS_Z);
 | 
			
		||||
    TMC_INIT(Z4, STEALTH_AXIS_Z);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E0)
 | 
			
		||||
    _TMC_INIT(E0, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E0, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E1)
 | 
			
		||||
    _TMC_INIT(E1, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E1, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E2)
 | 
			
		||||
    _TMC_INIT(E2, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E2, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E3)
 | 
			
		||||
    _TMC_INIT(E3, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E3, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E4)
 | 
			
		||||
    _TMC_INIT(E4, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E4, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E5)
 | 
			
		||||
    _TMC_INIT(E5, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E5, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E6)
 | 
			
		||||
    _TMC_INIT(E6, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E6, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
  #if AXIS_IS_TMC(E7)
 | 
			
		||||
    _TMC_INIT(E7, STEALTH_AXIS_E);
 | 
			
		||||
    TMC_INIT(E7, STEALTH_AXIS_E);
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #if USE_SENSORLESS
 | 
			
		||||
 | 
			
		||||
@ -82,7 +82,7 @@
 | 
			
		||||
//
 | 
			
		||||
// TMC2208 UART pins
 | 
			
		||||
//
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
#if HAS_TMC_UART
 | 
			
		||||
  #define X_SERIAL_TX_PIN  P1_00
 | 
			
		||||
  #define X_SERIAL_RX_PIN  P1_00
 | 
			
		||||
  #define Y_SERIAL_TX_PIN  P1_09
 | 
			
		||||
 | 
			
		||||
@ -74,9 +74,9 @@
 | 
			
		||||
#define E1_DIR_PIN         P2_13
 | 
			
		||||
#define E1_ENABLE_PIN      P4_29
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
#if HAS_TMC_UART
 | 
			
		||||
  //
 | 
			
		||||
  // TMC2208 stepper drivers
 | 
			
		||||
  // TMC220x stepper drivers
 | 
			
		||||
  // Software serial
 | 
			
		||||
  //
 | 
			
		||||
  #define X_SERIAL_TX_PIN  P0_04
 | 
			
		||||
 | 
			
		||||
@ -264,11 +264,11 @@
 | 
			
		||||
#define SD_DETECT_PIN       9   // H6
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//TMC 2208
 | 
			
		||||
// TMC 220x
 | 
			
		||||
//
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
#if HAS_TMC_UART
 | 
			
		||||
  /**
 | 
			
		||||
   * TMC2208 stepper drivers
 | 
			
		||||
   * TMC220x stepper drivers
 | 
			
		||||
   *
 | 
			
		||||
   * Hardware serial communication ports.
 | 
			
		||||
   * If undefined software serial is used according to the pins below
 | 
			
		||||
 | 
			
		||||
@ -1189,12 +1189,18 @@
 | 
			
		||||
#define _PEXI(p,q) __PEXI(p,q)
 | 
			
		||||
#define __EPIN(p,q) E##p##_##q##_PIN
 | 
			
		||||
#define _EPIN(p,q) __EPIN(p,q)
 | 
			
		||||
#define __EDRV(p) E##p##_DRIVER_TYPE
 | 
			
		||||
#define _EDRV(p) __EDRV(p)
 | 
			
		||||
#define DIAG_REMAPPED(p,q) (PIN_EXISTS(q) && _EPIN(p##_E_INDEX, DIAG) == q##_PIN)
 | 
			
		||||
 | 
			
		||||
// The X2 axis, if any, should be the next open extruder port
 | 
			
		||||
#define X2_E_INDEX E_STEPPERS
 | 
			
		||||
 | 
			
		||||
#if EITHER(DUAL_X_CARRIAGE, X_DUAL_STEPPER_DRIVERS)
 | 
			
		||||
  #ifndef X2_DRIVER_TYPE
 | 
			
		||||
    #define X2_DRIVER_TYPE _EDRV(X2_E_INDEX)
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifndef X2_STEP_PIN
 | 
			
		||||
    #define X2_STEP_PIN   _EPIN(X2_E_INDEX, STEP)
 | 
			
		||||
    #define X2_DIR_PIN    _EPIN(X2_E_INDEX, DIR)
 | 
			
		||||
@ -1268,6 +1274,10 @@
 | 
			
		||||
 | 
			
		||||
// The Y2 axis, if any, should be the next open extruder port
 | 
			
		||||
#if ENABLED(Y_DUAL_STEPPER_DRIVERS)
 | 
			
		||||
  #ifndef Y2_DRIVER_TYPE
 | 
			
		||||
    #define Y2_DRIVER_TYPE _EDRV(Y2_E_INDEX)
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifndef Y2_STEP_PIN
 | 
			
		||||
    #define Y2_STEP_PIN   _EPIN(Y2_E_INDEX, STEP)
 | 
			
		||||
    #define Y2_DIR_PIN    _EPIN(Y2_E_INDEX, DIR)
 | 
			
		||||
@ -1336,6 +1346,10 @@
 | 
			
		||||
 | 
			
		||||
// The Z2 axis, if any, should be the next open extruder port
 | 
			
		||||
#if NUM_Z_STEPPER_DRIVERS >= 2
 | 
			
		||||
  #ifndef Z2_DRIVER_TYPE
 | 
			
		||||
    #define Z2_DRIVER_TYPE _EDRV(Z2_E_INDEX)
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifndef Z2_STEP_PIN
 | 
			
		||||
    #define Z2_STEP_PIN   _EPIN(Z2_E_INDEX, STEP)
 | 
			
		||||
    #define Z2_DIR_PIN    _EPIN(Z2_E_INDEX, DIR)
 | 
			
		||||
@ -1403,6 +1417,10 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if NUM_Z_STEPPER_DRIVERS >= 3
 | 
			
		||||
  #ifndef Z3_DRIVER_TYPE
 | 
			
		||||
    #define Z3_DRIVER_TYPE _EDRV(Z3_E_INDEX)
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifndef Z3_STEP_PIN
 | 
			
		||||
    #define Z3_STEP_PIN   _EPIN(Z3_E_INDEX, STEP)
 | 
			
		||||
    #define Z3_DIR_PIN    _EPIN(Z3_E_INDEX, DIR)
 | 
			
		||||
@ -1470,6 +1488,10 @@
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if NUM_Z_STEPPER_DRIVERS >= 4
 | 
			
		||||
  #ifndef Z4_DRIVER_TYPE
 | 
			
		||||
    #define Z4_DRIVER_TYPE _EDRV(Z4_E_INDEX)
 | 
			
		||||
  #endif
 | 
			
		||||
 | 
			
		||||
  #ifndef Z4_STEP_PIN
 | 
			
		||||
    #define Z4_STEP_PIN   _EPIN(Z4_E_INDEX, STEP)
 | 
			
		||||
    #define Z4_DIR_PIN    _EPIN(Z4_E_INDEX, DIR)
 | 
			
		||||
 | 
			
		||||
@ -193,9 +193,9 @@
 | 
			
		||||
  #endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HAS_DRIVER(TMC2208)
 | 
			
		||||
#if HAS_TMC_UART
 | 
			
		||||
  /**
 | 
			
		||||
   * TMC2208 stepper drivers
 | 
			
		||||
   * TMC220x stepper drivers
 | 
			
		||||
   *
 | 
			
		||||
   * Hardware serial communication ports.
 | 
			
		||||
   * If undefined software serial is used according to the pins below
 | 
			
		||||
 | 
			
		||||
@ -26,10 +26,10 @@
 | 
			
		||||
#define BOARD_INFO_NAME "BIGTREE SKR Mini E3"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * TMC2209 stepper drivers
 | 
			
		||||
 * TMC220x stepper drivers
 | 
			
		||||
 * Hardware serial communication ports.
 | 
			
		||||
 */
 | 
			
		||||
#if HAS_DRIVER(TMC2209)
 | 
			
		||||
#if HAS_TMC_UART
 | 
			
		||||
  #define X_HARDWARE_SERIAL  Serial4
 | 
			
		||||
  #define Y_HARDWARE_SERIAL  Serial4
 | 
			
		||||
  #define Z_HARDWARE_SERIAL  Serial4
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user