Skip to content
2 changes: 1 addition & 1 deletion Marlin/src/HAL/STM32/fastio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@

#include "../../inc/MarlinConfig.h"

GPIO_TypeDef* FastIOPortMap[LastPort + 1];
GPIO_TypeDef* FastIOPortMap[LastPort + 1] = { 0 };

void FastIO_init() {
LOOP_L_N(i, NUM_DIGITAL_PINS)
Expand Down
14 changes: 10 additions & 4 deletions Marlin/src/HAL/STM32/fastio.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ extern GPIO_TypeDef * FastIOPortMap[];
// Public functions
// ------------------------

void FastIO_init(); // Must be called before using fast io macros
void FastIO_init(); // Must be called before using fast io READ/WRITE, or define FASTIO_PREINIT

// ------------------------
// Defines
Expand Down Expand Up @@ -66,9 +66,15 @@ void FastIO_init(); // Must be called before using fast io macros
#define _SET_OUTPUT(IO) pinMode(IO, OUTPUT) //!< Output Push Pull Mode & GPIO_NOPULL
#define _SET_OUTPUT_OD(IO) pinMode(IO, OUTPUT_OPEN_DRAIN)

#define WRITE(IO,V) _WRITE(IO,V)
#define READ(IO) _READ(IO)
#define TOGGLE(IO) _TOGGLE(IO)
#ifdef FASTIO_PREINIT
#define READ(IO) ((FastIOPortMap[0]) ? _READ(IO) : digitalRead(IO))
#define WRITE(IO,V) do { if (FastIOPortMap[0]) _WRITE(IO,V); else digitalWrite(IO,V); } while(0)
#define TOGGLE(IO) do { if (FastIOPortMap[0]) _TOGGLE(IO); else digitalWrite(IO,(!digitalRead(IO))); } while(0)
#else
#define READ(IO) _READ(IO)
#define WRITE(IO,V) _WRITE(IO,V)
#define TOGGLE(IO) _TOGGLE(IO)
#endif

#define OUT_WRITE(IO,V) do{ _SET_OUTPUT(IO); WRITE(IO,V); }while(0)
#define OUT_WRITE_OD(IO,V) do{ _SET_OUTPUT_OD(IO); WRITE(IO,V); }while(0)
Expand Down
8 changes: 7 additions & 1 deletion Marlin/src/MarlinCore.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1188,7 +1188,13 @@ void setup() {

#if HAS_SUICIDE
SETUP_LOG("SUICIDE_PIN");
OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING);
SET_OUTPUT(SUICIDE_PIN);
#ifdef ARDUINO_ARCH_STM32
// We are before FastIO_init()!
digitalWrite(SUICIDE_PIN, !SUICIDE_PIN_INVERTING);
#else
WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING);
#endif
#endif

#ifdef JTAGSWD_RESET
Expand Down
16 changes: 5 additions & 11 deletions Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,19 +99,13 @@
// Avoid nozzle heat and fan start before serial init
#define BOARD_OPENDRAIN_MOSFETS

#define BOARD_INIT_OD_PINS() { \
OUT_WRITE_OD(HEATER_0_PIN, 0); \
OUT_WRITE_OD(HEATER_BED_PIN, 0); \
OUT_WRITE_OD(FAN_PIN, 0); \
// STM32 framework cannot use WRITE macros before HAL_init()
Comment thread
thinkyhead marked this conversation as resolved.
Outdated
#define BOARD_PREINIT() { \
_SET_OUTPUT_OD(HEATER_0_PIN); digitalWrite(HEATER_0_PIN, 0); \
_SET_OUTPUT_OD(HEATER_BED_PIN); digitalWrite(HEATER_BED_PIN, 0); \
_SET_OUTPUT_OD(FAN_PIN); digitalWrite(FAN_PIN, 0); \
}

#ifdef MAPLE_STM32F1
// Only Maple Framework allow that early
#define BOARD_PREINIT BOARD_INIT_OD_PINS
#else
#define BOARD_INIT BOARD_INIT_OD_PINS
#endif

//
// PWM for a servo probe
// Other servo devices are not supported on this board!
Expand Down