diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml
index 97a6534f85..5429f3eb95 100644
--- a/.github/workflows/test-builds.yml
+++ b/.github/workflows/test-builds.yml
@@ -56,29 +56,31 @@ jobs:
 
         # STM32F1 (Maple) Environments
 
-        - STM32F103RC_btt
-        - STM32F103RC_btt_USB
-        - STM32F103RE_btt
-        - STM32F103RE_btt_USB
+        #- STM32F103RC_btt_maple
+        - STM32F103RC_btt_USB_maple
         - STM32F103RC_fysetc
         - STM32F103RC_meeb
         - jgaurora_a5s_a1
         - STM32F103VE_longer
-        - mks_robin
+        #- mks_robin_maple
         - mks_robin_lite
         - mks_robin_pro
-        - STM32F103RET6_creality
-        - mks_robin_nano35
+        #- mks_robin_nano35_maple
+        #- STM32F103RET6_creality_maple
 
         # STM32 (ST) Environments
 
-        - STM32F103RC_btt_stm32
+        - STM32F103RC_btt
+        #- STM32F103RC_btt_USB
+        - STM32F103RE_btt
+        - STM32F103RE_btt_USB
+        - STM32F103RET6_creality
         - STM32F407VE_black
         - STM32F401VE_STEVAL
         - BIGTREE_BTT002
         - BIGTREE_SKR_PRO
         - BIGTREE_GTR_V1_0
-        - mks_robin_stm32
+        - mks_robin
         - ARMED
         - FYSETC_S6
         - STM32F070CB_malyan
@@ -88,7 +90,7 @@ jobs:
         - rumba32
         - LERDGEX
         - LERDGEK
-        - mks_robin_nano35_stm32
+        - mks_robin_nano35
         - NUCLEO_F767ZI
         - REMRAM_V1
         - BTT_SKR_SE_BX
diff --git a/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp
new file mode 100644
index 0000000000..165b3c6bab
--- /dev/null
+++ b/Marlin/src/HAL/STM32/eeprom_bl24cxx.cpp
@@ -0,0 +1,82 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+#ifdef STM32F1
+
+/**
+ * PersistentStore for Arduino-style EEPROM interface
+ * with simple implementations supplied by Marlin.
+ */
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(IIC_BL24CXX_EEPROM)
+
+#include "../shared/eeprom_if.h"
+#include "../shared/eeprom_api.h"
+
+//
+// PersistentStore
+//
+
+#ifndef MARLIN_EEPROM_SIZE
+  #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM."
+#endif
+
+size_t PersistentStore::capacity()    { return MARLIN_EEPROM_SIZE; }
+
+bool PersistentStore::access_start()  { eeprom_init(); return true; }
+bool PersistentStore::access_finish() { return true; }
+
+bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) {
+  uint16_t written = 0;
+  while (size--) {
+    uint8_t v = *value;
+    uint8_t * const p = (uint8_t * const)pos;
+    if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed!
+      eeprom_write_byte(p, v);
+      if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes
+      if (eeprom_read_byte(p) != v) {
+        SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE);
+        return true;
+      }
+    }
+    crc16(crc, &v, 1);
+    pos++;
+    value++;
+  }
+  return false;
+}
+
+bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
+  do {
+    uint8_t * const p = (uint8_t * const)pos;
+    uint8_t c = eeprom_read_byte(p);
+    if (writing) *value = c;
+    crc16(crc, &c, 1);
+    pos++;
+    value++;
+  } while (--size);
+  return false;
+}
+
+#endif // IIC_BL24CXX_EEPROM
+#endif // STM32F1
diff --git a/Marlin/src/HAL/STM32/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32/eeprom_if_iic.cpp
new file mode 100644
index 0000000000..5c6cc802a6
--- /dev/null
+++ b/Marlin/src/HAL/STM32/eeprom_if_iic.cpp
@@ -0,0 +1,54 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * Platform-independent Arduino functions for I2C EEPROM.
+ * Enable USE_SHARED_EEPROM if not supplied by the framework.
+ */
+
+#ifdef STM32F1
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(IIC_BL24CXX_EEPROM)
+
+#include "../../libs/BL24CXX.h"
+#include "../shared/eeprom_if.h"
+
+void eeprom_init() { BL24CXX::init(); }
+
+// ------------------------
+// Public functions
+// ------------------------
+
+void eeprom_write_byte(uint8_t *pos, uint8_t value) {
+  const unsigned eeprom_address = (unsigned)pos;
+  return BL24CXX::writeOneByte(eeprom_address, value);
+}
+
+uint8_t eeprom_read_byte(uint8_t *pos) {
+  const unsigned eeprom_address = (unsigned)pos;
+  return BL24CXX::readOneByte(eeprom_address);
+}
+
+#endif // IIC_BL24CXX_EEPROM
+#endif // STM32F1
diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp
index 8de320d576..adcd5ed894 100644
--- a/Marlin/src/libs/BL24CXX.cpp
+++ b/Marlin/src/libs/BL24CXX.cpp
@@ -27,7 +27,12 @@
  */
 
 #include "BL24CXX.h"
-#include <libmaple/gpio.h>
+#ifdef __STM32F1__
+  #include <libmaple/gpio.h>
+#else
+  #include "../HAL/shared/Delay.h"
+  #define delay_us(n) DELAY_US(n)
+#endif
 
 #ifndef EEPROM_WRITE_DELAY
   #define EEPROM_WRITE_DELAY    10
@@ -37,8 +42,13 @@
 #endif
 
 // IO direction setting
-#define SDA_IN()  do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0)
-#define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0)
+#ifdef __STM32F1__
+  #define SDA_IN()  do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0)
+  #define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0)
+#elif STM32F1
+  #define SDA_IN()  SET_INPUT(IIC_EEPROM_SDA)
+  #define SDA_OUT() SET_OUTPUT(IIC_EEPROM_SDA)
+#endif
 
 // IO ops
 #define IIC_SCL_0()   WRITE(IIC_EEPROM_SCL, LOW)
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 3176b5e832..b4c79b3226 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -489,13 +489,13 @@
 #elif MB(CHITU3D)
   #include "stm32f1/pins_CHITU3D.h"             // STM32F1                                env:STM32F103RE
 #elif MB(MKS_ROBIN)
-  #include "stm32f1/pins_MKS_ROBIN.h"           // STM32F1                                env:mks_robin env:mks_robin_stm32
+  #include "stm32f1/pins_MKS_ROBIN.h"           // STM32F1                                env:mks_robin env:mks_robin_maple
 #elif MB(MKS_ROBIN_MINI)
   #include "stm32f1/pins_MKS_ROBIN_MINI.h"      // STM32F1                                env:mks_robin_mini
 #elif MB(MKS_ROBIN_NANO)
-  #include "stm32f1/pins_MKS_ROBIN_NANO.h"      // STM32F1                                env:mks_robin_nano35 env:mks_robin_nano35_stm32
+  #include "stm32f1/pins_MKS_ROBIN_NANO.h"      // STM32F1                                env:mks_robin_nano35 env:mks_robin_nano35_maple
 #elif MB(MKS_ROBIN_NANO_V2)
-  #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h"   // STM32F1                                env:mks_robin_nano35 env:mks_robin_nano35_stm32
+  #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h"   // STM32F1                                env:mks_robin_nano35 env:mks_robin_nano35_maple
 #elif MB(MKS_ROBIN_LITE)
   #include "stm32f1/pins_MKS_ROBIN_LITE.h"      // STM32F1                                env:mks_robin_lite
 #elif MB(MKS_ROBIN_LITE3)
@@ -513,17 +513,17 @@
 #elif MB(MKS_ROBIN_E3P)
   #include "stm32f1/pins_MKS_ROBIN_E3P.h"       // STM32F1                                env:mks_robin_e3p
 #elif MB(BTT_SKR_MINI_V1_1)
-  #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h"   // STM32F1                                env:STM32F103RC_btt_stm32 env:STM32F103RC_btt_512K_stm32 env:STM32F103RC_btt_USB_stm32 env:STM32F103RC_btt_512K_USB_stm32 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB
+  #include "stm32f1/pins_BTT_SKR_MINI_V1_1.h"   // STM32F1                                env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_maple env:STM32F103RC_btt_512K_maple env:STM32F103RC_btt_USB_maple env:STM32F103RC_btt_512K_USB_maple
 #elif MB(BTT_SKR_MINI_E3_V1_0)
-  #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h"  // STM32F1                              env:STM32F103RC_btt_stm32 env:STM32F103RC_btt_512K_stm32 env:STM32F103RC_btt_USB_stm32 env:STM32F103RC_btt_512K_USB_stm32 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB
+  #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_0.h"  // STM32F1                              env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_maple env:STM32F103RC_btt_512K_maple env:STM32F103RC_btt_USB_maple env:STM32F103RC_btt_512K_USB_maple
 #elif MB(BTT_SKR_MINI_E3_V1_2)
-  #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h"  // STM32F1                              env:STM32F103RC_btt_stm32 env:STM32F103RC_btt_512K_stm32 env:STM32F103RC_btt_USB_stm32 env:STM32F103RC_btt_512K_USB_stm32 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB
+  #include "stm32f1/pins_BTT_SKR_MINI_E3_V1_2.h"  // STM32F1                              env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_maple env:STM32F103RC_btt_512K_maple env:STM32F103RC_btt_USB_maple env:STM32F103RC_btt_512K_USB_maple
 #elif MB(BTT_SKR_MINI_E3_V2_0)
-  #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h"  // STM32F1                              env:STM32F103RC_btt_stm32 env:STM32F103RC_btt_512K_stm32 env:STM32F103RC_btt_USB_stm32 env:STM32F103RC_btt_512K_USB_stm32 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB
+  #include "stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h"  // STM32F1                              env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_maple env:STM32F103RC_btt_512K_maple env:STM32F103RC_btt_USB_maple env:STM32F103RC_btt_512K_USB_maple
 #elif MB(BTT_SKR_MINI_MZ_V1_0)
-  #include "stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h"  // STM32F1                              env:STM32F103RC_btt_stm32 env:STM32F103RC_btt_512K_stm32 env:STM32F103RC_btt_USB_stm32 env:STM32F103RC_btt_512K_USB_stm32 env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB
+  #include "stm32f1/pins_BTT_SKR_MINI_MZ_V1_0.h"  // STM32F1                              env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_maple env:STM32F103RC_btt_512K_maple env:STM32F103RC_btt_USB_maple env:STM32F103RC_btt_512K_USB_maple
 #elif MB(BTT_SKR_E3_DIP)
-  #include "stm32f1/pins_BTT_SKR_E3_DIP.h"      // STM32F1                                env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB
+  #include "stm32f1/pins_BTT_SKR_E3_DIP.h"      // STM32F1                                env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K
 #elif MB(BTT_SKR_CR6)
   #include "stm32f1/pins_BTT_SKR_CR6.h"         // STM32F1                                env:STM32F103RE_btt env:STM32F103RE_btt_USB
 #elif MB(JGAURORA_A5S_A1)
@@ -543,17 +543,17 @@
 #elif MB(CHITU3D_V6)
   #include "stm32f1/pins_CHITU3D_V6.h"          // STM32F1                                env:chitu_f103
 #elif MB(CREALITY_V4)
-  #include "stm32f1/pins_CREALITY_V4.h"         // STM32F1                                env:STM32F103RET6_creality
+  #include "stm32f1/pins_CREALITY_V4.h"         // STM32F1                                env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
 #elif MB(CREALITY_V4210)
-  #include "stm32f1/pins_CREALITY_V4210.h"      // STM32F1                                env:STM32F103RET6_creality
+  #include "stm32f1/pins_CREALITY_V4210.h"      // STM32F1                                env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
 #elif MB(CREALITY_V427)
-  #include "stm32f1/pins_CREALITY_V427.h"       // STM32F1                                env:STM32F103RET6_creality
+  #include "stm32f1/pins_CREALITY_V427.h"       // STM32F1                                env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
 #elif MB(CREALITY_V431)
-  #include "stm32f1/pins_CREALITY_V431.h"       // STM32F1                                env:STM32F103RET6_creality
+  #include "stm32f1/pins_CREALITY_V431.h"       // STM32F1                                env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
 #elif MB(CREALITY_V452)
-  #include "stm32f1/pins_CREALITY_V452.h"       // STM32F1                                env:STM32F103RET6_creality
+  #include "stm32f1/pins_CREALITY_V452.h"       // STM32F1                                env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
 #elif MB(CREALITY_V453)
-  #include "stm32f1/pins_CREALITY_V453.h"       // STM32F1                                env:STM32F103RET6_creality
+  #include "stm32f1/pins_CREALITY_V453.h"       // STM32F1                                env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
 #elif MB(TRIGORILLA_PRO)
   #include "stm32f1/pins_TRIGORILLA_PRO.h"      // STM32F1                                env:trigorilla_pro
 #elif MB(FLY_MINI)
diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h
index 62ccf7edcc..2e7b785172 100644
--- a/Marlin/src/pins/stm32f1/env_validate.h
+++ b/Marlin/src/pins/stm32f1/env_validate.h
@@ -21,6 +21,6 @@
  */
 #pragma once
 
-#if NOT_TARGET(__STM32F1__)
+#if NOT_TARGET(__STM32F1__, STM32F1)
   #error "Oops! Select an STM32F1 board in 'Tools > Board.'"
 #endif
diff --git a/buildroot/share/PlatformIO/scripts/mks_encrypt.py b/buildroot/share/PlatformIO/scripts/mks_encrypt.py
index 0c622704e7..59322a6388 100644
--- a/buildroot/share/PlatformIO/scripts/mks_encrypt.py
+++ b/buildroot/share/PlatformIO/scripts/mks_encrypt.py
@@ -2,9 +2,9 @@
 # buildroot/share/PlatformIO/scripts/mks_encrypt.py
 #
 # Apply encryption and save as 'build.firmware' for these environments:
-#  - env:mks_robin_stm32
+#  - env:mks_robin
 #  - env:flsun_hispeedv1
-#  - env:mks_robin_nano35_stm32
+#  - env:mks_robin_nano35
 #
 Import("env")
 
diff --git a/buildroot/tests/STM32F103RC_btt_USB b/buildroot/tests/STM32F103RC_btt_USB
index fb0f2f5bd2..8381de0ea6 100755
--- a/buildroot/tests/STM32F103RC_btt_USB
+++ b/buildroot/tests/STM32F103RC_btt_USB
@@ -10,7 +10,7 @@ set -e
 # Build with the default configurations
 #
 restore_configs
-opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1 BAUDRATE_2 115200
+opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1
 exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" "$3"
 
 # clean up
diff --git a/buildroot/tests/STM32F103RC_btt_USB_stm32 b/buildroot/tests/STM32F103RC_btt_USB_maple
similarity index 71%
rename from buildroot/tests/STM32F103RC_btt_USB_stm32
rename to buildroot/tests/STM32F103RC_btt_USB_maple
index 8381de0ea6..eeb460911a 100755
--- a/buildroot/tests/STM32F103RC_btt_USB_stm32
+++ b/buildroot/tests/STM32F103RC_btt_USB_maple
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 #
-# Build tests for STM32F103RC BigTreeTech (SKR Mini v1.1)
+# Build tests for STM32F103RC BigTreeTech (SKR Mini v1.1) with LibMaple STM32F1 HAL
 #
 
 # exit on first failure
@@ -10,7 +10,7 @@ set -e
 # Build with the default configurations
 #
 restore_configs
-opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1
+opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1 BAUDRATE_2 115200
 exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" "$3"
 
 # clean up
diff --git a/buildroot/tests/STM32F103RC_btt_stm32 b/buildroot/tests/STM32F103RC_btt_maple
similarity index 84%
rename from buildroot/tests/STM32F103RC_btt_stm32
rename to buildroot/tests/STM32F103RC_btt_maple
index e76060aee8..e74e590213 100755
--- a/buildroot/tests/STM32F103RC_btt_stm32
+++ b/buildroot/tests/STM32F103RC_btt_maple
@@ -1,6 +1,6 @@
 #!/usr/bin/env bash
 #
-# Build tests for STM32F103RC BigTreeTech (SKR Mini E3)
+# Build tests for STM32F103RC BigTreeTech (SKR Mini E3) with LibMaple STM32F1 HAL
 #
 
 # exit on first failure
diff --git a/buildroot/tests/mks_robin b/buildroot/tests/mks_robin
index 652147f867..e250dceca2 100755
--- a/buildroot/tests/mks_robin
+++ b/buildroot/tests/mks_robin
@@ -1,22 +1,13 @@
 #!/usr/bin/env bash
 #
-# Build tests for MKS Robin
-# (STM32F1 genericSTM32F103ZE)
+# Build tests for MKS Robin (HAL/STM32)
 #
 
 # exit on first failure
 set -e
 
 use_example_configs Mks/Robin
-exec_test $1 $2 "MKS Robin config (FSMC Color UI)" "$3"
-
-#
-# MKS Robin LVGL FSMC
-#
-use_example_configs Mks/Robin
-opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
-opt_enable TFT_LVGL_UI TFT_RES_480x320
-exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3"
+exec_test $1 $2 "MKS Robin base configuration" "$3"
 
 # cleanup
 restore_configs
diff --git a/buildroot/tests/mks_robin_maple b/buildroot/tests/mks_robin_maple
new file mode 100755
index 0000000000..fcb5118307
--- /dev/null
+++ b/buildroot/tests/mks_robin_maple
@@ -0,0 +1,22 @@
+#!/usr/bin/env bash
+#
+# Build tests for MKS Robin with LibMaple STM32F1 HAL
+# (STM32F1 genericSTM32F103ZE)
+#
+
+# exit on first failure
+set -e
+
+use_example_configs Mks/Robin
+exec_test $1 $2 "MKS Robin config (FSMC Color UI)" "$3"
+
+#
+# MKS Robin LVGL FSMC
+#
+use_example_configs Mks/Robin
+opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
+opt_enable TFT_LVGL_UI TFT_RES_480x320
+exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3"
+
+# cleanup
+restore_configs
diff --git a/buildroot/tests/mks_robin_nano35 b/buildroot/tests/mks_robin_nano35
index c54cd36655..0891744692 100755
--- a/buildroot/tests/mks_robin_nano35
+++ b/buildroot/tests/mks_robin_nano35
@@ -24,15 +24,24 @@ opt_disable TFT_INTERFACE_FSMC
 opt_enable TFT_INTERFACE_SPI
 exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3"
 
+#
+# MKS Robin nano v1.2 LVGL FSMC
+#
+# use_example_configs Mks/Robin
+# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO
+# opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
+# opt_enable TFT_LVGL_UI TFT_RES_480x320
+# exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3"
+
 #
 # MKS Robin v2 nano LVGL SPI
 # (Robin v2 nano has no FSMC interface)
 #
-use_example_configs Mks/Robin
-opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
-opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 SERIAL_PORT_2
-opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 MKS_WIFI_MODULE
-exec_test $1 $2 "MKS Robin v2 nano LVGL SPI w/ WiFi" "$3"
+# use_example_configs Mks/Robin
+# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
+# opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
+# opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320
+# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" "$3"
 
 #
 # MKS Robin v2 nano New Color UI 480x320 SPI
@@ -42,27 +51,17 @@ use_example_configs Mks/Robin
 opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
 opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240
 opt_enable TFT_INTERFACE_SPI TFT_RES_480x320
-opt_enable BINARY_FILE_TRANSFER
-exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI + BINARY_FILE_TRANSFER" "$3"
+exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3"
 
 #
 # MKS Robin v2 nano LVGL SPI + TMC
 # (Robin v2 nano has no FSMC interface)
 #
-use_example_configs Mks/Robin
-opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209
-opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
-opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320
-exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3"
-
-#
-# MKS Robin v2 nano New Color UI 480x320 SPI Without Touch Screen
-#
-use_example_configs Mks/Robin
-opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
-opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 TOUCH_SCREEN
-opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 TFT_COLOR_UI
-exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI without TOUCH_SCREEN" "$3"
+# use_example_configs Mks/Robin
+# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209
+# opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
+# opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320
+# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3"
 
 # cleanup
 restore_configs
diff --git a/buildroot/tests/mks_robin_nano35_maple b/buildroot/tests/mks_robin_nano35_maple
new file mode 100755
index 0000000000..f1549a8103
--- /dev/null
+++ b/buildroot/tests/mks_robin_nano35_maple
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+#
+# Build tests for MKS Robin nano with LibMaple STM32F1 HAL
+# (STM32F1 genericSTM32F103VE)
+#
+
+# exit on first failure
+set -e
+
+#
+# MKS Robin nano v1.2 Emulated DOGM FSMC
+#
+use_example_configs Mks/Robin
+opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO
+exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" "$3"
+
+#
+# MKS Robin v2 nano Emulated DOGM SPI
+# (Robin v2 nano has no FSMC interface)
+#
+use_example_configs Mks/Robin
+opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
+opt_disable TFT_INTERFACE_FSMC
+opt_enable TFT_INTERFACE_SPI
+exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3"
+
+#
+# MKS Robin v2 nano LVGL SPI
+# (Robin v2 nano has no FSMC interface)
+#
+use_example_configs Mks/Robin
+opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
+opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 SERIAL_PORT_2
+opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 MKS_WIFI_MODULE
+exec_test $1 $2 "MKS Robin v2 nano LVGL SPI w/ WiFi" "$3"
+
+#
+# MKS Robin v2 nano New Color UI 480x320 SPI
+# (Robin v2 nano has no FSMC interface)
+#
+use_example_configs Mks/Robin
+opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
+opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240
+opt_enable TFT_INTERFACE_SPI TFT_RES_480x320
+opt_enable BINARY_FILE_TRANSFER
+exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI + BINARY_FILE_TRANSFER" "$3"
+
+#
+# MKS Robin v2 nano LVGL SPI + TMC
+# (Robin v2 nano has no FSMC interface)
+#
+use_example_configs Mks/Robin
+opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209
+opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
+opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320
+exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3"
+
+#
+# MKS Robin v2 nano New Color UI 480x320 SPI Without Touch Screen
+#
+use_example_configs Mks/Robin
+opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
+opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 TOUCH_SCREEN
+opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 TFT_COLOR_UI
+exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI without TOUCH_SCREEN" "$3"
+
+# cleanup
+restore_configs
diff --git a/buildroot/tests/mks_robin_nano35_stm32 b/buildroot/tests/mks_robin_nano35_stm32
deleted file mode 100755
index 0891744692..0000000000
--- a/buildroot/tests/mks_robin_nano35_stm32
+++ /dev/null
@@ -1,67 +0,0 @@
-#!/usr/bin/env bash
-#
-# Build tests for MKS Robin nano
-# (STM32F1 genericSTM32F103VE)
-#
-
-# exit on first failure
-set -e
-
-#
-# MKS Robin nano v1.2 Emulated DOGM FSMC
-#
-use_example_configs Mks/Robin
-opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO
-exec_test $1 $2 "MKS Robin nano v1.2 Emulated DOGM FSMC" "$3"
-
-#
-# MKS Robin v2 nano Emulated DOGM SPI
-# (Robin v2 nano has no FSMC interface)
-#
-use_example_configs Mks/Robin
-opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
-opt_disable TFT_INTERFACE_FSMC
-opt_enable TFT_INTERFACE_SPI
-exec_test $1 $2 "MKS Robin v2 nano Emulated DOGM SPI" "$3"
-
-#
-# MKS Robin nano v1.2 LVGL FSMC
-#
-# use_example_configs Mks/Robin
-# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO
-# opt_disable TFT_CLASSIC_UI TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
-# opt_enable TFT_LVGL_UI TFT_RES_480x320
-# exec_test $1 $2 "MKS Robin nano v1.2 LVGL FSMC" "$3"
-
-#
-# MKS Robin v2 nano LVGL SPI
-# (Robin v2 nano has no FSMC interface)
-#
-# use_example_configs Mks/Robin
-# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
-# opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
-# opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320
-# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI" "$3"
-
-#
-# MKS Robin v2 nano New Color UI 480x320 SPI
-# (Robin v2 nano has no FSMC interface)
-#
-use_example_configs Mks/Robin
-opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2
-opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240
-opt_enable TFT_INTERFACE_SPI TFT_RES_480x320
-exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3"
-
-#
-# MKS Robin v2 nano LVGL SPI + TMC
-# (Robin v2 nano has no FSMC interface)
-#
-# use_example_configs Mks/Robin
-# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209
-# opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240
-# opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320
-# exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3"
-
-# cleanup
-restore_configs
diff --git a/buildroot/tests/mks_robin_stm32 b/buildroot/tests/mks_robin_stm32
deleted file mode 100755
index e250dceca2..0000000000
--- a/buildroot/tests/mks_robin_stm32
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/usr/bin/env bash
-#
-# Build tests for MKS Robin (HAL/STM32)
-#
-
-# exit on first failure
-set -e
-
-use_example_configs Mks/Robin
-exec_test $1 $2 "MKS Robin base configuration" "$3"
-
-# cleanup
-restore_configs
diff --git a/ini/stm32f1-maple.ini b/ini/stm32f1-maple.ini
new file mode 100644
index 0000000000..cc9942fd75
--- /dev/null
+++ b/ini/stm32f1-maple.ini
@@ -0,0 +1,363 @@
+#
+# Marlin Firmware
+# PlatformIO Configuration File
+#
+
+#################################
+#
+# STM32F1 Architecture with LibMaple STM32F1 HAL
+#
+# Naming Example: STM32F103RCT6
+#
+#   F : Foundation (sometimes High Performance F2/F4)
+#   1 : Cortex M1 core
+#  03 : Line/Features
+#   R : 64 or 66 pins  (V:100, Z:144, I:176)
+#   C : 256KB Flash-memory  (D:384KB, E:512KB, G:1024KB)
+#   T : LQFP package
+#   6 : -40...85°C   (7: ...105°C)
+#
+#################################
+
+#
+# HAL/STM32F1 Common Environment values
+#
+[common_stm32f1]
+platform          = ststm32@~12.1
+board_build.core  = maple
+build_flags       = !python Marlin/src/HAL/STM32F1/build_flags.py
+  ${common.build_flags}
+  -DARDUINO_ARCH_STM32
+build_unflags     = -std=gnu11 -std=gnu++11
+src_filter        = ${common.default_src_filter} +<src/HAL/STM32F1>
+lib_ignore        = SPI, FreeRTOS701, FreeRTOS821
+lib_deps          = ${common.lib_deps}
+  SoftwareSerialM
+platform_packages = tool-stm32duino
+extra_scripts     = ${common.extra_scripts}
+  pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py
+
+#
+# STM32F103RC
+#
+[common_STM32F103RC_maple]
+platform          = ${common_stm32f1.platform}
+extends           = common_stm32f1
+board             = genericSTM32F103RC
+monitor_speed     = 115200
+
+#
+# MEEB_3DP (STM32F103RCT6 with 512K)
+#
+[env:STM32F103RC_meeb]
+platform          = ${common_stm32f1.platform}
+extends           = common_STM32F103RC_maple
+board             = marlin_MEEB_3DP
+build_flags       = ${common_stm32f1.build_flags}
+                    -DDEBUG_LEVEL=0
+                    -DSS_TIMER=4
+                    -DSTM32_FLASH_SIZE=512
+                    -DHSE_VALUE=12000000U
+                    -DUSE_USB_COMPOSITE
+                    -DVECT_TAB_OFFSET=0x2000
+                    -DGENERIC_BOOTLOADER
+extra_scripts     = ${common_stm32f1.extra_scripts}
+  pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py
+  buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py
+lib_deps          = ${common.lib_deps}
+  SoftwareSerialM
+  USBComposite for STM32F1@0.91
+custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use
+debug_tool        = stlink
+upload_protocol   = dfu
+
+#
+# FYSETC STM32F103RC
+#
+[env:STM32F103RC_fysetc]
+platform          = ${common_stm32f1.platform}
+extends           = common_STM32F103RC_maple
+extra_scripts     = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py
+build_flags       = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0
+lib_ldf_mode      = chain
+debug_tool        = stlink
+upload_protocol   = serial
+
+#
+# BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3)
+#
+#   STM32F103RC_btt_maple ............. RCT6 with 256K
+#   STM32F103RC_btt_USB_maple ......... RCT6 with 256K (USB mass storage)
+#   STM32F103RC_btt_512K_maple ........ RCT6 with 512K
+#   STM32F103RC_btt_512K_USB_maple .... RCT6 with 512K (USB mass storage)
+#
+# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP
+# and experience a printer freeze, re-flash Marlin using the regular (non-512K)
+# build option. 256K chips may be re-branded 512K chips, but this means the
+# upper 256K is sketchy, and failure is very likely.
+#
+
+[env:STM32F103RC_btt_maple]
+platform             = ${common_stm32f1.platform}
+extends              = common_STM32F103RC_maple
+board_build.address  = 0x08007000
+board_build.ldscript = STM32F103RC_SKR_MINI_256K.ld
+extra_scripts        = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/custom_board.py
+build_flags          = ${common_stm32f1.build_flags}
+  -DDEBUG_LEVEL=0 -DSS_TIMER=4
+monitor_speed        = 115200
+
+[env:STM32F103RC_btt_USB_maple]
+platform          = ${common_stm32f1.platform}
+extends           = env:STM32F103RC_btt_maple
+build_flags       = ${env:STM32F103RC_btt_maple.build_flags} -DUSE_USB_COMPOSITE
+lib_deps          = ${env:STM32F103RC_btt_maple.lib_deps}
+  USBComposite for STM32F1@0.91
+
+[env:STM32F103RC_btt_512K_maple]
+platform                  = ${common_stm32f1.platform}
+extends                   = env:STM32F103RC_btt_maple
+board_build.ldscript      = STM32F103RC_SKR_MINI_512K.ld
+board_upload.maximum_size = 524288
+build_flags               = ${env:STM32F103RC_btt_maple.build_flags} -DSTM32_FLASH_SIZE=512
+
+[env:STM32F103RC_btt_512K_USB_maple]
+platform          = ${common_stm32f1.platform}
+extends           = env:STM32F103RC_btt_512K_maple
+build_flags       = ${env:STM32F103RC_btt_512K_maple.build_flags} -DUSE_USB_COMPOSITE
+lib_deps          = ${env:STM32F103RC_btt_512K_maple.lib_deps}
+  USBComposite for STM32F1@0.91
+
+#
+# STM32F103RE with Unified STM32F1 HAL
+#
+[common_STM32F103RE]
+platform          = ${common_stm32f1.platform}
+extends           = common_stm32f1
+board             = genericSTM32F103RE
+monitor_speed     = 115200
+
+#
+# Creality (STM32F103RET6)
+#
+[env:STM32F103RET6_creality_maple]
+platform             = ${common_stm32f1.platform}
+extends              = common_STM32F103RE
+build_flags          = ${common_stm32f1.build_flags} -DTEMP_TIMER_CHAN=4
+board_build.address  = 0x08007000
+board_build.ldscript = creality.ld
+extra_scripts        = ${common_stm32f1.extra_scripts}
+  pre:buildroot/share/PlatformIO/scripts/random-bin.py
+  buildroot/share/PlatformIO/scripts/custom_board.py
+debug_tool           = jlink
+upload_protocol      = jlink
+
+#
+#   STM32F103RE_btt ............. RET6
+#   STM32F103RE_btt_USB ......... RET6 (USB mass storage)
+#
+[env:STM32F103RE_btt]
+platform          = ${common_stm32f1.platform}
+extends           = common_STM32F103RE
+board_build.address  = 0x08007000
+board_build.ldscript = STM32F103RE_SKR_E3_DIP.ld
+extra_scripts     = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/custom_board.py
+build_flags       = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4
+debug_tool        = stlink
+upload_protocol   = stlink
+
+[env:STM32F103RE_btt_USB]
+platform          = ${common_stm32f1.platform}
+extends           = env:STM32F103RE_btt
+build_flags       = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE
+lib_deps          = ${common_stm32f1.lib_deps}
+  USBComposite for STM32F1@0.91
+
+#
+# Geeetech GTM32 (STM32F103VET6)
+#
+[env:STM32F103VE_GTM32]
+platform        = ${common_stm32f1.platform}
+extends         = common_stm32f1
+board           = genericSTM32F103VE
+build_flags     = ${common_stm32f1.build_flags}
+  -ffunction-sections -fdata-sections -nostdlib -MMD
+  -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v
+  -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000
+  -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6
+upload_protocol = serial
+
+#
+# Longer 3D board in Alfawise U20 (STM32F103VET6)
+#
+[env:STM32F103VE_longer]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103VE
+board_build.address  = 0x08010000
+board_build.ldscript = STM32F103VE_longer.ld
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/custom_board.py
+  buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py
+build_flags   = ${common_stm32f1.build_flags}
+  -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12
+build_unflags = ${common_stm32f1.build_unflags}
+  -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6
+
+#
+# MKS Robin Mini (STM32F103VET6)
+#
+[env:mks_robin_mini]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103VE
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_mini.py
+build_flags   = ${common_stm32f1.build_flags}
+  -DMCU_STM32F103VE
+
+#
+# MKS Robin Nano (STM32F103VET6)
+#
+[env:mks_robin_nano35_maple]
+platform        = ${common_stm32f1.platform}
+extends         = common_stm32f1
+board           = genericSTM32F103VE
+extra_scripts   = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
+build_flags     = ${common_stm32f1.build_flags}
+  -DMCU_STM32F103VE -DSS_TIMER=4
+debug_tool      = jlink
+upload_protocol = jlink
+
+#
+# MKS Robin (STM32F103ZET6)
+#
+[env:mks_robin_maple]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103ZE
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin.py
+build_flags   = ${common_stm32f1.build_flags}
+  -DSS_TIMER=4 -DSTM32_XL_DENSITY
+
+#
+# MKS Robin Pro (STM32F103ZET6)
+#
+[env:mks_robin_pro]
+platform      = ${common_stm32f1.platform}
+extends       = env:mks_robin_maple
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_pro.py
+
+#
+# TRIGORILLA PRO (STM32F103ZET6)
+#
+[env:trigorilla_pro]
+platform      = ${common_stm32f1.platform}
+extends       = env:mks_robin_maple
+extra_scripts = ${common_stm32f1.extra_scripts}
+
+#
+# MKS Robin E3D (STM32F103RCT6) and
+# MKS Robin E3 with TMC2209
+#
+[env:mks_robin_e3]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103RC
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_e3.py
+build_flags   = ${common_stm32f1.build_flags}
+  -DDEBUG_LEVEL=0 -DSS_TIMER=4
+
+#
+# MKS Robin E3p (STM32F103VET6)
+#  - LVGL UI
+#
+[env:mks_robin_e3p]
+platform        = ${common_stm32f1.platform}
+extends         = common_stm32f1
+board           = genericSTM32F103VE
+extra_scripts   = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_e3p.py
+build_flags     = ${common_stm32f1.build_flags}
+  -DMCU_STM32F103VE -DSS_TIMER=4
+debug_tool      = jlink
+upload_protocol = jlink
+
+#
+# MKS Robin Lite/Lite2 (STM32F103RCT6)
+#
+[env:mks_robin_lite]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103RC
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_lite.py
+
+#
+# MKS ROBIN LITE3 (STM32F103RCT6)
+#
+[env:mks_robin_lite3]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103RC
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/mks_robin_lite3.py
+
+#
+# JGAurora A5S A1 (STM32F103ZET6)
+#
+[env:jgaurora_a5s_a1]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = genericSTM32F103ZE
+board_build.address  = 0x0800A000
+board_build.ldscript = jgaurora_a5s_a1.ld
+extra_scripts = ${common_stm32f1.extra_scripts}
+  buildroot/share/PlatformIO/scripts/custom_board.py
+  buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py
+build_flags   = ${common_stm32f1.build_flags}
+  -DSTM32F1xx -DSTM32_XL_DENSITY
+
+#
+# Malyan M200 (STM32F103CB)
+#
+[env:STM32F103CB_malyan]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = marlin_malyanM200
+build_flags   = ${common_stm32f1.build_flags}
+  -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections
+  -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__
+lib_ignore    = ${common_stm32f1.lib_ignore}
+  SoftwareSerialM
+
+#
+# Chitu boards like Tronxy X5s (STM32F103ZET6)
+#
+[env:chitu_f103]
+platform      = ${common_stm32f1.platform}
+extends       = common_stm32f1
+board         = marlin_CHITU_F103
+extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py
+  pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py
+  buildroot/share/PlatformIO/scripts/chitu_crypt.py
+build_flags   = ${common_stm32f1.build_flags}
+  -DSTM32F1xx -DSTM32_XL_DENSITY
+build_unflags = ${common_stm32f1.build_unflags}
+  -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6
+
+#
+# Some Chitu V5 boards have a problem with GPIO init.
+# Use this target if G28 or G29 are always failing.
+#
+[env:chitu_v5_gpio_init]
+platform      = ${common_stm32f1.platform}
+extends       = env:chitu_f103
+build_flags   = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX
diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini
index d21db3d83c..c6aa464979 100644
--- a/ini/stm32f1.ini
+++ b/ini/stm32f1.ini
@@ -5,7 +5,7 @@
 
 #################################
 #
-# STM32F1 Architecture
+# STM32F1 Architecture with unified STM32 HAL
 #
 # Naming Example: STM32F103RCT6
 #
@@ -32,71 +32,6 @@ build_flags   = ${common.build_flags}
 build_unflags = -std=gnu++11
 src_filter    = ${common.default_src_filter} +<src/HAL/STM32> +<src/HAL/shared/backtrace>
 
-#
-# HAL/STM32F1 Common Environment values
-#
-[common_stm32f1]
-platform          = ststm32@~12.1
-board_build.core  = maple
-build_flags       = !python Marlin/src/HAL/STM32F1/build_flags.py
-  ${common.build_flags}
-  -DARDUINO_ARCH_STM32
-build_unflags     = -std=gnu11 -std=gnu++11
-src_filter        = ${common.default_src_filter} +<src/HAL/STM32F1>
-lib_ignore        = SPI, FreeRTOS701, FreeRTOS821
-lib_deps          = ${common.lib_deps}
-  SoftwareSerialM
-platform_packages = tool-stm32duino
-extra_scripts     = ${common.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py
-
-#
-# STM32F103RC
-#
-[env:STM32F103RC]
-platform          = ${common_stm32f1.platform}
-extends           = common_stm32f1
-board             = genericSTM32F103RC
-monitor_speed     = 115200
-
-#
-# MEEB_3DP (STM32F103RCT6 with 512K)
-#
-[env:STM32F103RC_meeb]
-platform          = ${common_stm32f1.platform}
-extends           = common_stm32f1
-board             = marlin_MEEB_3DP
-build_flags       = ${common_stm32f1.build_flags}
-                    -DDEBUG_LEVEL=0
-                    -DSS_TIMER=4
-                    -DSTM32_FLASH_SIZE=512
-                    -DHSE_VALUE=12000000U
-                    -DUSE_USB_COMPOSITE
-                    -DVECT_TAB_OFFSET=0x2000
-                    -DGENERIC_BOOTLOADER
-extra_scripts     = ${common_stm32f1.extra_scripts}
-  pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py
-  buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py
-lib_deps          = ${common.lib_deps}
-  SoftwareSerialM
-  USBComposite for STM32F1@0.91
-custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use
-debug_tool        = stlink
-upload_protocol   = dfu
-
-#
-# STM32F103RC_fysetc
-#
-[env:STM32F103RC_fysetc]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RC
-extra_scripts     = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py
-build_flags       = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0
-lib_ldf_mode      = chain
-debug_tool        = stlink
-upload_protocol   = serial
-
 #
 # BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3)
 #
@@ -110,44 +45,7 @@ upload_protocol   = serial
 # build option. 256K chips may be re-branded 512K chips, but this means the
 # upper 256K is sketchy, and failure is very likely.
 #
-
-[env:STM32F103RC_btt]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RC
-board_build.address  = 0x08007000
-board_build.ldscript = STM32F103RC_SKR_MINI_256K.ld
-extra_scripts     = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/custom_board.py
-build_flags       = ${common_stm32f1.build_flags}
-  -DDEBUG_LEVEL=0 -DSS_TIMER=4
-monitor_speed     = 115200
-
-[env:STM32F103RC_btt_USB]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RC_btt
-build_flags       = ${env:STM32F103RC_btt.build_flags} -DUSE_USB_COMPOSITE
-lib_deps          = ${env:STM32F103RC_btt.lib_deps}
-  USBComposite for STM32F1@0.91
-
-[env:STM32F103RC_btt_512K]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RC_btt
-board_build.ldscript = STM32F103RC_SKR_MINI_512K.ld
-board_upload.maximum_size=524288
-build_flags       = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512
-
-[env:STM32F103RC_btt_512K_USB]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RC_btt_512K
-build_flags       = ${env:STM32F103RC_btt_512K.build_flags} -DUSE_USB_COMPOSITE
-lib_deps          = ${env:STM32F103RC_btt_512K.lib_deps}
-  USBComposite for STM32F1@0.91
-
-#
-# STM32 HAL version of STM32F103RC_btt envs
-#
-
-[env:STM32F103RC_stm32]
+[common_STM32F103RC]
 platform             = ${common_stm32.platform}
 extends              = common_stm32
 board                = genericSTM32F103RC
@@ -159,21 +57,21 @@ extra_scripts        = ${common.extra_scripts}
   pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
   buildroot/share/PlatformIO/scripts/stm32_bootloader.py
 
-[env:STM32F103RC_btt_stm32]
+[env:STM32F103RC_btt]
 platform             = ${common_stm32.platform}
-extends              = env:STM32F103RC_stm32
+extends              = common_STM32F103RC
 build_flags          = ${common_stm32.build_flags} -DDEBUG_LEVEL=0 -DTIMER_SERVO=TIM5
 board_build.offset   = 0x7000
 board_build.encrypt  = No
 board_build.firmware = firmware.bin
 board_upload.offset_address = 0x08007000
 
-[env:STM32F103RC_btt_USB_stm32]
-extends           = env:STM32F103RC_btt_stm32
+[env:STM32F103RC_btt_USB]
+extends           = env:STM32F103RC_btt
 platform          = ${common_stm32.platform}
 platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc-2.zip
 build_unflags     = ${common_stm32.build_unflags} -DUSBD_USE_CDC
-build_flags       = ${env:STM32F103RC_btt_stm32.build_flags} ${env:stm32_flash_drive.build_flags}
+build_flags       = ${env:STM32F103RC_btt.build_flags} ${env:stm32_flash_drive.build_flags}
   -DUSBCON
   -DUSE_USBHOST_HS
   -DUSBD_IRQ_PRIO=5
@@ -181,122 +79,23 @@ build_flags       = ${env:STM32F103RC_btt_stm32.build_flags} ${env:stm32_flash_d
   -DUSE_USB_HS_IN_FS
   -DUSBD_USE_CDC_MSC
 
-[env:STM32F103RC_btt_512K_stm32]
+[env:STM32F103RC_btt_512K]
 platform          = ${common_stm32.platform}
-extends           = env:STM32F103RC_btt_stm32
+extends           = env:STM32F103RC_btt
 board_upload.maximum_size = 524288
-build_flags       = ${env:STM32F103RC_btt_stm32.build_flags} -DLD_MAX_DATA_SIZE=524288 -DSTM32_FLASH_SIZE=512
+build_flags       = ${env:STM32F103RC_btt.build_flags} -DLD_MAX_DATA_SIZE=524288 -DSTM32_FLASH_SIZE=512
 
-[env:STM32F103RC_btt_512K_USB_stm32]
+[env:STM32F103RC_btt_512K_USB]
 platform          = ${common_stm32.platform}
-extends           = env:STM32F103RC_btt_USB_stm32
+extends           = env:STM32F103RC_btt_USB
 board_upload.maximum_size = 524288
-build_flags       = ${env:STM32F103RC_btt_USB_stm32.build_flags} -DLD_MAX_DATA_SIZE=524288 -DSTM32_FLASH_SIZE=512
+build_flags       = ${env:STM32F103RC_btt_USB.build_flags} -DLD_MAX_DATA_SIZE=524288 -DSTM32_FLASH_SIZE=512
 
 #
-# STM32F103RE
-#
-[env:STM32F103RE]
-platform          = ${common_stm32f1.platform}
-extends           = common_stm32f1
-board             = genericSTM32F103RE
-monitor_speed     = 115200
-
-#
-#   STM32F103RE_btt ............. RET6
-#   STM32F103RE_btt_USB ......... RET6 (USB mass storage)
-#
-[env:STM32F103RE_btt]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RE
-board_build.address  = 0x08007000
-board_build.ldscript = STM32F103RE_SKR_E3_DIP.ld
-extra_scripts     = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/custom_board.py
-build_flags       = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4
-debug_tool        = stlink
-upload_protocol   = stlink
-
-[env:STM32F103RE_btt_USB]
-platform          = ${common_stm32f1.platform}
-extends           = env:STM32F103RE_btt
-build_flags       = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE
-lib_deps          = ${common_stm32f1.lib_deps}
-  USBComposite for STM32F1@0.91
-
-#
-# Geeetech GTM32 (STM32F103VET6)
-#
-[env:STM32F103VE_GTM32]
-platform        = ${common_stm32f1.platform}
-extends         = common_stm32f1
-board           = genericSTM32F103VE
-build_flags     = ${common_stm32f1.build_flags}
-  -ffunction-sections -fdata-sections -nostdlib -MMD
-  -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v
-  -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000
-  -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6
-upload_protocol = serial
-
-#
-# Longer 3D board in Alfawise U20 (STM32F103VET6)
-#
-[env:STM32F103VE_longer]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103VE
-board_build.address  = 0x08010000
-board_build.ldscript = STM32F103VE_longer.ld
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/custom_board.py
-  buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py
-build_flags   = ${common_stm32f1.build_flags}
-  -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12
-build_unflags = ${common_stm32f1.build_unflags}
-  -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6
-
-#
-# MKS Robin Mini (STM32F103VET6)
-#
-[env:mks_robin_mini]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103VE
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_mini.py
-build_flags   = ${common_stm32f1.build_flags}
-  -DMCU_STM32F103VE
-
-#
-# MKS Robin Nano (STM32F103VET6)
-#
-[env:mks_robin_nano35]
-platform        = ${common_stm32f1.platform}
-extends         = common_stm32f1
-board           = genericSTM32F103VE
-extra_scripts   = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_nano35.py
-build_flags     = ${common_stm32f1.build_flags}
-  -DMCU_STM32F103VE -DSS_TIMER=4
-debug_tool      = jlink
-upload_protocol = jlink
-
-#
-# MKS Robin (STM32F103ZET6)
-#
-[env:mks_robin]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103ZE
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin.py
-build_flags   = ${common_stm32f1.build_flags}
-  -DSS_TIMER=4 -DSTM32_XL_DENSITY
-
 # MKS Robin (STM32F103ZET6)
 # Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel
 #
-[env:mks_robin_stm32]
+[env:mks_robin]
 platform             = ${common_stm32.platform}
 extends              = common_stm32
 board                = genericSTM32F103ZE
@@ -316,154 +115,30 @@ extra_scripts        = ${common.extra_scripts}
   buildroot/share/PlatformIO/scripts/mks_encrypt.py
 lib_deps             =
 
-#
-# MKS Robin Pro (STM32F103ZET6)
-#
-[env:mks_robin_pro]
-platform      = ${common_stm32f1.platform}
-extends       = env:mks_robin
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_pro.py
-
-#
-# TRIGORILLA PRO (STM32F103ZET6)
-#
-[env:trigorilla_pro]
-platform      = ${common_stm32f1.platform}
-extends       = env:mks_robin
-extra_scripts = ${common_stm32f1.extra_scripts}
-
-#
-# MKS Robin E3D (STM32F103RCT6) and
-# MKS Robin E3 with TMC2209
-#
-[env:mks_robin_e3]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103RC
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_e3.py
-build_flags   = ${common_stm32f1.build_flags}
-  -DDEBUG_LEVEL=0 -DSS_TIMER=4
-
-#
-# MKS Robin E3p (STM32F103VET6)
-#  - LVGL UI
-#
-[env:mks_robin_e3p]
-platform        = ${common_stm32f1.platform}
-extends         = common_stm32f1
-board           = genericSTM32F103VE
-extra_scripts   = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_e3p.py
-build_flags     = ${common_stm32f1.build_flags}
-  -DMCU_STM32F103VE -DSS_TIMER=4
-debug_tool      = jlink
-upload_protocol = jlink
-
-#
-# MKS Robin Lite/Lite2 (STM32F103RCT6)
-#
-[env:mks_robin_lite]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103RC
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_lite.py
-
-#
-# MKS ROBIN LITE3 (STM32F103RCT6)
-#
-[env:mks_robin_lite3]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103RC
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/mks_robin_lite3.py
-
-#
-# FLY MINI (STM32F103RCT6)
-#
-[env:FLY_MINI]
-platform          = ${common_stm32f1.platform}
-extends           = common_stm32f1
-board             = genericSTM32F103RC
-board_build.address  = 0x08005000
-board_build.ldscript = fly_mini.ld
-extra_scripts     = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/custom_board.py
-build_flags       = ${common_stm32f1.build_flags}
-  -DDEBUG_LEVEL=0 -DSS_TIMER=4
-
-#
-# JGAurora A5S A1 (STM32F103ZET6)
-#
-[env:jgaurora_a5s_a1]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = genericSTM32F103ZE
-board_build.address  = 0x0800A000
-board_build.ldscript = jgaurora_a5s_a1.ld
-extra_scripts = ${common_stm32f1.extra_scripts}
-  buildroot/share/PlatformIO/scripts/custom_board.py
-  buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py
-build_flags   = ${common_stm32f1.build_flags}
-  -DSTM32F1xx -DSTM32_XL_DENSITY
-
-#
-# Malyan M200 (STM32F103CB)
-#
-[env:STM32F103CB_malyan]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = marlin_malyanM200
-build_flags   = ${common_stm32f1.build_flags}
-  -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections
-  -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__
-lib_ignore    = ${common_stm32f1.lib_ignore}
-  SoftwareSerialM
-
-#
-# Chitu boards like Tronxy X5s (STM32F103ZET6)
-#
-[env:chitu_f103]
-platform      = ${common_stm32f1.platform}
-extends       = common_stm32f1
-board         = marlin_CHITU_F103
-extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py
-  pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py
-  buildroot/share/PlatformIO/scripts/chitu_crypt.py
-build_flags   = ${common_stm32f1.build_flags}
-  -DSTM32F1xx -DSTM32_XL_DENSITY
-build_unflags = ${common_stm32f1.build_unflags}
-  -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6
-
-#
-# Some Chitu V5 boards have a problem with GPIO init.
-# Use this target if G28 or G29 are always failing.
-#
-[env:chitu_v5_gpio_init]
-platform      = ${common_stm32f1.platform}
-extends       = env:chitu_f103
-build_flags   = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX
-
 #
 # Creality (STM32F103RET6)
 #
 [env:STM32F103RET6_creality]
-platform        = ${env:STM32F103RE.platform}
-extends         = env:STM32F103RE
-build_flags     = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4
-board_build.address  = 0x08007000
-board_build.ldscript = creality.ld
-extra_scripts   = ${env:STM32F103RE.extra_scripts}
+platform             = ${common_stm32.platform}
+extends              = common_stm32
+build_flags          = ${common_stm32.build_flags} -DMCU_STM32F103RE -DHAL_SD_MODULE_ENABLED -DSS_TIMER=4 -DENABLE_HWSERIAL3 -DTRANSFER_CLOCK_DIV=8
+board                = genericSTM32F103RE
+monitor_speed        = 115200
+board_build.core     = stm32
+board_build.variant  = MARLIN_F103Rx
+board_build.offset   = 0x7000
+board_build.ldscript = ldscript.ld
+board_upload.offset_address = 0x08007000
+build_unflags        = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC
+extra_scripts        = ${common.extra_scripts}
+  pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py
   pre:buildroot/share/PlatformIO/scripts/random-bin.py
-  buildroot/share/PlatformIO/scripts/custom_board.py
-debug_tool      = jlink
-upload_protocol = jlink
+  buildroot/share/PlatformIO/scripts/stm32_bootloader.py
+debug_tool           = jlink
+upload_protocol      = jlink
 
 #
-# FLSUN QQS Pro (STM32F103VET6) using hal STM32
+# FLSUN QQS Pro (STM32F103VET6)
 # board Hispeedv1
 #
 [env:flsun_hispeedv1]
@@ -485,9 +160,9 @@ extra_scripts        = ${common.extra_scripts}
   buildroot/share/PlatformIO/scripts/mks_encrypt.py
 
 #
-# MKS Robin Nano V1.2 and V2 using hal STM32
+# MKS Robin Nano V1.2 and V2
 #
-[env:mks_robin_nano35_stm32]
+[env:mks_robin_nano35]
 platform             = ${common_stm32.platform}
 extends              = common_stm32
 build_flags          = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3
diff --git a/platformio.ini b/platformio.ini
index b552eda81d..f55f5f5a93 100644
--- a/platformio.ini
+++ b/platformio.ini
@@ -24,6 +24,7 @@ extra_configs =
     ini/native.ini
     ini/samd51.ini
     ini/stm32f0.ini
+    ini/stm32f1-maple.ini
     ini/stm32f1.ini
     ini/stm32f4.ini
     ini/stm32f7.ini