diff --git a/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
index 0b95557f02d1f50277873bc3a53b42e72241f0db..c94bce3b650e665baeceb12e29005ed2510b475a 100644
--- a/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
+++ b/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
@@ -24,24 +24,24 @@
 
 #include "../../inc/MarlinConfig.h"
 
-#if ENABLED(EEPROM_SETTINGS)
+#if ENABLED(EEPROM_SETTINGS) && ANY(FLASH_EEPROM_EMULATION, SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
 
 #include "../shared/persistent_store_api.h"
 
-#if NONE(SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
+#if ENABLED(FLASH_EEPROM_EMULATION)
   #include <EEPROM.h>
   static bool eeprom_data_written = false;
 #endif
 
 bool PersistentStore::access_start() {
-  #if NONE(SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
+  #if ENABLED(FLASH_EEPROM_EMULATION)
     eeprom_buffer_fill();
   #endif
   return true;
 }
 
 bool PersistentStore::access_finish() {
-  #if NONE(SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
+  #if ENABLED(FLASH_EEPROM_EMULATION)
     if (eeprom_data_written) {
       eeprom_buffer_flush();
       eeprom_data_written = false;
@@ -66,7 +66,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
           return true;
         }
       }
-    #elif DISABLED(SRAM_EEPROM_EMULATION)
+    #elif ENABLED(FLASH_EEPROM_EMULATION)
       eeprom_buffered_write_byte(pos, v);
     #else
       *(__IO uint8_t *)(BKPSRAM_BASE + (uint8_t * const)pos) = v;
@@ -76,7 +76,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
     pos++;
     value++;
   };
-  #if NONE(SRAM_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
+  #if ENABLED(FLASH_EEPROM_EMULATION)
     eeprom_data_written = true;
   #endif
 
@@ -89,7 +89,7 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
     const uint8_t c = (
       #if EITHER(SPI_EEPROM, I2C_EEPROM)
         eeprom_read_byte((uint8_t*)pos)
-      #elif DISABLED(SRAM_EEPROM_EMULATION)
+      #elif ENABLED(FLASH_EEPROM_EMULATION)
         eeprom_buffered_read_byte(pos)
       #else
         (*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)))
@@ -105,14 +105,14 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
 }
 
 size_t PersistentStore::capacity() {
-  #if EITHER(SPI_EEPROM, I2C_EEPROM)
-    return E2END + 1;
-  #elif DISABLED(SRAM_EEPROM_EMULATION)
-    return E2END + 1;
-  #else
-    return 4096; // 4kB
-  #endif
+  return (
+    #if ENABLED(SRAM_EEPROM_EMULATION)
+      4096 // 4kB
+    #else
+      E2END + 1
+    #endif
+  );
 }
 
-#endif // EEPROM_SETTINGS
+#endif // EEPROM_SETTINGS && (FLASH_EEPROM_EMULATION || SRAM_EEPROM_EMULATION || SPI_EEPROM || I2C_EEPROM)
 #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC
diff --git a/Marlin/src/HAL/HAL_STM32/persistent_store_sdcard.cpp b/Marlin/src/HAL/HAL_STM32/persistent_store_sdcard.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..8cc56d995531aad6f4466c7292a18269279bc1f7
--- /dev/null
+++ b/Marlin/src/HAL/HAL_STM32/persistent_store_sdcard.cpp
@@ -0,0 +1,104 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2019 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 <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * HAL for stm32duino.com based on Libmaple and compatible (STM32F1)
+ * Implementation of EEPROM settings in SD Card
+ */
+
+#ifdef TARGET_STM32F4
+
+#include "../../inc/MarlinConfig.h"
+
+#if ENABLED(EEPROM_SETTINGS) && NONE(FLASH_EEPROM_EMULATION, SPI_EEPROM, I2C_EEPROM)
+
+#include "../shared/persistent_store_api.h"
+
+#ifndef E2END
+  #define E2END 0xFFF // 4KB
+#endif
+#define HAL_EEPROM_SIZE (E2END + 1) // 16KB
+
+#define _ALIGN(x) __attribute__ ((aligned(x))) // SDIO uint32_t* compat.
+static char _ALIGN(4) HAL_eeprom_data[HAL_EEPROM_SIZE];
+
+#if ENABLED(SDSUPPORT)
+
+  #include "../../sd/cardreader.h"
+
+  #define EEPROM_FILENAME "eeprom.dat"
+
+  bool PersistentStore::access_start() {
+    if (!card.isDetected()) return false;
+
+    SdFile file, root = card.getroot();
+    if (!file.open(&root, EEPROM_FILENAME, O_RDONLY))
+      return false;
+
+    int16_t bytes_read = file.read(HAL_eeprom_data, HAL_STM32F4_EEPROM_SIZE);
+    if (bytes_read < 0) return false;
+    for (; bytes_read < HAL_STM32F4_EEPROM_SIZE; bytes_read++)
+      HAL_eeprom_data[bytes_read] = 0xFF;
+    file.close();
+    return true;
+  }
+
+  bool PersistentStore::access_finish() {
+    if (!card.isDetected()) return false;
+
+    SdFile file, root = card.getroot();
+    int16_t bytes_written = 0;
+    if (file.open(&root, EEPROM_FILENAME, O_CREAT | O_WRITE | O_TRUNC)) {
+      bytes_written = file.write(HAL_eeprom_data, HAL_STM32F4_EEPROM_SIZE);
+      file.close();
+    }
+    return (bytes_written == HAL_STM32F4_EEPROM_SIZE);
+  }
+
+#else // !SDSUPPORT
+
+  #error "Please define SPI_EEPROM (in Configuration.h) or disable EEPROM_SETTINGS."
+
+#endif // !SDSUPPORT
+
+bool PersistentStore::write_data(int &pos, const uint8_t *value, const size_t size, uint16_t *crc) {
+  for (size_t i = 0; i < size; i++)
+    HAL_eeprom_data[pos + i] = value[i];
+  crc16(crc, value, size);
+  pos += size;
+  return false;
+}
+
+bool PersistentStore::read_data(int &pos, uint8_t* value, const size_t size, uint16_t *crc, const bool writing/*=true*/) {
+  for (size_t i = 0; i < size; i++) {
+    uint8_t c = HAL_eeprom_data[pos + i];
+    if (writing) value[i] = c;
+    crc16(crc, &c, 1);
+  }
+  pos += size;
+  return false;
+}
+
+size_t PersistentStore::capacity() { return HAL_STM32F4_EEPROM_SIZE; }
+
+#endif // EEPROM_SETTINGS
+#endif // __STM32F4__
diff --git a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h
index 3b944a5dd050f38dff931b3c91568ed267b94406..840bbb8eeddd0de6a63468b763b5e0199245f5f2 100644
--- a/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h
+++ b/Marlin/src/pins/stm32/pins_BIGTREE_SKR_PRO_V1.1.h
@@ -29,7 +29,9 @@
 
 #define BOARD_NAME "BIGTREE SKR Pro 1.1"
 
-#define SRAM_EEPROM_EMULATION
+// Use one of these or SDCard-based Emulation will be used
+//#define SRAM_EEPROM_EMULATION   // Use BackSRAM-based EEPROM emulation
+//#define FLASH_EEPROM_EMULATION  // Use Flash-based EEPROM emulation
 
 //
 // Servos