From 7165e05cf64f5c24177239f9f9db577b45f1b52c Mon Sep 17 00:00:00 2001 From: Spencer Oliver Date: Mon, 8 Oct 2012 10:05:45 +0100 Subject: [PATCH] stlink: fix vector catch not being cleared Seems after a reset the stlink is not clearing the vector catch (VC_CORERESET) in the Debug Control Register. This has the side effect if the user presses an external reset the core will halt, this patch fixes that. Change-Id: Ic3b2c3991b79cacbbd901c02b79613c2e204e71f Signed-off-by: Spencer Oliver Reviewed-on: http://openocd.zylin.com/905 Tested-by: jenkins Reviewed-by: Freddie Chopin --- src/target/stm32_stlink.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/target/stm32_stlink.c b/src/target/stm32_stlink.c index aac1eecb7d..1c75508474 100644 --- a/src/target/stm32_stlink.c +++ b/src/target/stm32_stlink.c @@ -325,6 +325,7 @@ static int stm32_stlink_load_context(struct target *target) static int stlink_debug_entry(struct target *target) { + struct stlink_interface_s *stlink_if = target_to_stlink(target); struct armv7m_common *armv7m = target_to_armv7m(target); struct arm *arm = &armv7m->arm; struct reg *r; @@ -337,6 +338,9 @@ static int stlink_debug_entry(struct target *target) stm32_stlink_load_context(target); + /* make sure we clear the vector catch bit */ + stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, 0); + r = armv7m->core_cache->reg_list + ARMV7M_xPSR; xPSR = buf_get_u32(r->value, 0, 32); @@ -427,7 +431,12 @@ static int stm32_stlink_assert_reset(struct target *target) } stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DHCSR, DBGKEY|C_DEBUGEN); - stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, VC_CORERESET); + + /* only set vector catch if halt is requested */ + if (target->reset_halt) + stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, VC_CORERESET); + else + stlink_if->layout->api->write_debug_reg(stlink_if->fd, DCB_DEMCR, 0); if (jtag_reset_config & RESET_HAS_SRST) { if (!srst_asserted) { -- 2.30.2