diff --git a/boards.txt b/boards.txt
index b5af18a0c9f..3bf574ca45a 100644
--- a/boards.txt
+++ b/boards.txt
@@ -17,6 +17,7 @@ menu.LoRaWanDebugLevel=LoRaWan Debug Level
 menu.LoopCore=Arduino Runs On
 menu.EventsCore=Events Run On
 menu.MemoryType=Memory Type
+menu.EraseFlash=Erase All Flash Before Sketch Upload
 
 ##############################################################
 ### DO NOT PUT BOARDS ABOVE THE OFFICIAL ESPRESSIF BOARDS! ###
@@ -224,6 +225,11 @@ esp32s3.menu.DebugLevel.debug.build.code_debug=4
 esp32s3.menu.DebugLevel.verbose=Verbose
 esp32s3.menu.DebugLevel.verbose.build.code_debug=5
 
+esp32s3.menu.EraseFlash.none=Disabled
+esp32s3.menu.EraseFlash.none.upload.erase_cmd=
+esp32s3.menu.EraseFlash.all=Enabled
+esp32s3.menu.EraseFlash.all.upload.erase_cmd=-e
+
 ##############################################################
 
 esp32c3.name=ESP32C3 Dev Module
@@ -374,6 +380,11 @@ esp32c3.menu.DebugLevel.debug.build.code_debug=4
 esp32c3.menu.DebugLevel.verbose=Verbose
 esp32c3.menu.DebugLevel.verbose.build.code_debug=5
 
+esp32c3.menu.EraseFlash.none=Disabled
+esp32c3.menu.EraseFlash.none.upload.erase_cmd=
+esp32c3.menu.EraseFlash.all=Enabled
+esp32c3.menu.EraseFlash.all.upload.erase_cmd=-e
+
 ##############################################################
 
 esp32s2.name=ESP32S2 Dev Module
@@ -550,6 +561,11 @@ esp32s2.menu.DebugLevel.debug.build.code_debug=4
 esp32s2.menu.DebugLevel.verbose=Verbose
 esp32s2.menu.DebugLevel.verbose.build.code_debug=5
 
+esp32s2.menu.EraseFlash.none=Disabled
+esp32s2.menu.EraseFlash.none.upload.erase_cmd=
+esp32s2.menu.EraseFlash.all=Enabled
+esp32s2.menu.EraseFlash.all.upload.erase_cmd=-e
+
 ##############################################################
 
 esp32.name=ESP32 Dev Module
@@ -715,6 +731,11 @@ esp32.menu.DebugLevel.debug.build.code_debug=4
 esp32.menu.DebugLevel.verbose=Verbose
 esp32.menu.DebugLevel.verbose.build.code_debug=5
 
+esp32.menu.EraseFlash.none=Disabled
+esp32.menu.EraseFlash.none.upload.erase_cmd=
+esp32.menu.EraseFlash.all=Enabled
+esp32.menu.EraseFlash.all.upload.erase_cmd=-e
+
 ##############################################################
 
 esp32da.name=ESP32-WROOM-DA Module
diff --git a/docs/source/guides/tools_menu.rst b/docs/source/guides/tools_menu.rst
index 432511c191e..96b3bcc3674 100644
--- a/docs/source/guides/tools_menu.rst
+++ b/docs/source/guides/tools_menu.rst
@@ -196,6 +196,14 @@ Events Run On
 
 This function is also used to select the core that runs the Arduino events. This is only valid if the target SoC has 2 cores.
 
+Erase All Flash Before Sketch Upload
+************************************
+
+This option selects the flash memory region to be erased before uploading the new sketch.
+
+* **Disabled** - Upload the sketch without erasing all flash contents. (Default)
+* **Enabled** - Erase all flash contents before uploading the sketch.
+
 Port
 ****
 
diff --git a/platform.txt b/platform.txt
index 3537f5af7fe..93e0497bbaf 100644
--- a/platform.txt
+++ b/platform.txt
@@ -211,7 +211,7 @@ pluggable_monitor.required.serial=builtin:serial-monitor
 tools.esptool_py.upload.protocol=serial
 tools.esptool_py.upload.params.verbose=
 tools.esptool_py.upload.params.quiet=
-tools.esptool_py.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size {build.flash_size} {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" {upload.extra_flags}
+tools.esptool_py.upload.pattern_args=--chip {build.mcu} --port "{serial.port}" --baud {upload.speed} {upload.flags} --before default_reset --after hard_reset write_flash {upload.erase_cmd} -z --flash_mode {build.flash_mode} --flash_freq {build.flash_freq} --flash_size {build.flash_size} {build.bootloader_addr} "{build.path}/{build.project_name}.bootloader.bin" 0x8000 "{build.path}/{build.project_name}.partitions.bin" 0xe000 "{runtime.platform.path}/tools/partitions/boot_app0.bin" 0x10000 "{build.path}/{build.project_name}.bin" {upload.extra_flags}
 tools.esptool_py.upload.pattern="{path}/{cmd}" {upload.pattern_args}
 tools.esptool_py.upload.pattern.linux=python3 "{path}/{cmd}" {upload.pattern_args}