diff --git a/stmhal/Makefile b/stmhal/Makefile
index 93ff92bc8f0e700f107127be96755c5af215c4da..847cb4e8b28b492ea2c99420ac2c9abb45456e29 100644
--- a/stmhal/Makefile
+++ b/stmhal/Makefile
@@ -30,6 +30,8 @@ PYDFU ?= ../tools/pydfu.py
 DFU_UTIL ?= dfu-util
 DEVICE=0483:df11
 STFLASH ?= st-flash
+OPENOCD ?= openocd
+OPENOCD_CONFIG ?= boards/openocd_stm32f4.cfg
 
 CROSS_COMPILE = arm-none-eabi-
 
@@ -293,6 +295,10 @@ deploy-stlink: $(BUILD)/firmware.dfu
 	$(ECHO) "Writing $(BUILD)/firmware1.bin to the board via ST-LINK"
 	$(Q)$(STFLASH) --reset write $(BUILD)/firmware1.bin 0x08020000
 
+deploy-openocd: $(BUILD)/firmware.dfu
+	$(ECHO) "Writing $(BUILD)/firmware{0,1}.bin to the board via ST-LINK using OpenOCD"
+	$(Q)$(OPENOCD) -f $(OPENOCD_CONFIG) -c "stm_flash $(BUILD)/firmware0.bin $(BUILD)/firmware1.bin"
+
 $(BUILD)/firmware.dfu: $(BUILD)/firmware.elf
 	$(ECHO) "Create $@"
 	$(Q)$(OBJCOPY) -O binary -j .isr_vector $^ $(BUILD)/firmware0.bin
diff --git a/stmhal/README.md b/stmhal/README.md
index 457aaf9964651aa92a1a1b299b509c0d3b3dd547..6ebee352586a15727c14de0146a9dd72bf7f94c6 100644
--- a/stmhal/README.md
+++ b/stmhal/README.md
@@ -82,6 +82,21 @@ and set the `STLINK_DEVICE` environment variable accordingly, using the format
     $ make BOARD=STM32F4DISC deploy-stlink
 
 
+### Flashing the Firmware with OpenOCD
+
+Another option to deploy the firmware on ST Discovery or Nucleo boards with a
+ST-LINK interface uses [OpenOCD](http://openocd.org/). Connect the board with
+a mini USB cable to its ST-LINK USB port and then use the make target
+`deploy-openocd`. For example, if you have the STM32F4DISCOVERY board:
+
+    $ make BOARD=STM32F4DISC deploy-openocd
+
+The `openocd` program, which writes the firmware to the target board's flash,
+is configured via the file `stmhal/boards/openocd_stm32f4.cfg`. This
+configuration should work for all boards based on a STM32F4xx MCU with a
+ST-LINKv2 interface. You can override the path to this configuration by setting
+`OPENOCD_CONFIG` in your Makefile or on the command line.
+
 Accessing the board
 -------------------
 
diff --git a/stmhal/boards/openocd_stm32f4.cfg b/stmhal/boards/openocd_stm32f4.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..e03ea87a154cd1bb00a906606ba679a991127713
--- /dev/null
+++ b/stmhal/boards/openocd_stm32f4.cfg
@@ -0,0 +1,42 @@
+# This script configures OpenOCD for use with an ST-Link V2 programmer/debugger
+# and an STM32F4 target microcontroller.
+#
+# To flash your firmware:
+#
+#    $ openocd -f openocd_stm32f4.cfg \
+#        -c "stm_flash build-BOARD/firmware0.bin build-BOARD/firmware1.bin"
+#
+# For a gdb server on port 3333:
+#
+#    $ openocd -f openocd_stm32f4.cfg
+
+
+source [find interface/stlink-v2.cfg]
+transport select hla_swd
+source [find target/stm32f4x.cfg]
+reset_config srst_only
+init
+
+proc stm_flash { BIN0 BIN1 } {
+    reset halt
+    sleep 100
+    wait_halt 2
+    flash write_image erase $BIN0 0x08000000
+    sleep 100
+    verify_image $BIN0 0x08000000
+    sleep 100
+    flash write_image erase $BIN1 0x08020000
+    sleep 100
+    verify_image $BIN1 0x08020000
+    sleep 100
+    reset run
+    shutdown
+}
+
+proc stm_erase {} {
+    reset halt
+    sleep 100
+    stm32f4x mass_erase 0
+    sleep 100
+    shutdown
+}