From d765c452e4e84f56439808d2e7f8edbeedb47256 Mon Sep 17 00:00:00 2001 From: Jason Smith Date: Wed, 28 Oct 2020 21:50:14 -0700 Subject: [PATCH] Disable PWM output while updating NeoPixels. --- Marlin/src/HAL/STM32/HAL.h | 4 ++++ Marlin/src/HAL/STM32/eeprom_flash.cpp | 9 --------- Marlin/src/feature/leds/neopixel.h | 3 +++ Marlin/src/inc/Conditionals_post.h | 3 +++ 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index a1f7515d6b..8d3b24cf73 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -29,6 +29,7 @@ #include "../shared/math_32bit.h" #include "../shared/HAL_SPI.h" #include "fastio.h" +#include "Servo.h" #include "watchdog.h" #include "MarlinSerial.h" @@ -110,6 +111,9 @@ typedef int16_t pin_t; #define HAL_SERVO_LIB libServo +#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() +#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() +#define HAS_PAUSE_SERVO_OUTPUT HAS_SERVOS // ------------------------ // Public Variables diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index c83376d265..857144fd5f 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -28,15 +28,6 @@ #include "../shared/eeprom_api.h" -#if HAS_SERVOS - #include "Servo.h" - #define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() - #define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() -#else - #define PAUSE_SERVO_OUTPUT() - #define RESUME_SERVO_OUTPUT() -#endif - /** * The STM32 HAL supports chips that deal with "pages" and some with "sectors" and some that * even have multiple "banks" of flash. diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 42046fa563..471257e96a 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -105,6 +105,8 @@ public: } static inline void show() { + // Some platforms cannot maintain PWM output when NeoPixel disables interrupts for long durations. + TERN_(HAS_PAUSE_SERVO_OUTPUT, PAUSE_SERVO_OUTPUT()); adaneo1.show(); #if PIN_EXISTS(NEOPIXEL2) #if CONJOINED_NEOPIXEL @@ -115,6 +117,7 @@ public: adaneo1.setPin(NEOPIXEL_PIN); #endif #endif + TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT()); } #if 0 diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index bbbcf6fb2f..a3a0054498 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1999,6 +1999,9 @@ #if NUM_SERVOS > 0 #define HAS_SERVOS 1 #endif +#if !HAS_SERVOS || !defined(HAS_PAUSE_SERVO_OUTPUT) + #define HAS_PAUSE_SERVO_OUTPUT 0 +#endif // Sensors #if PIN_EXISTS(FILWIDTH)