projects
/
fw
/
openocd
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
stlink: fix vector catch not being cleared
[fw/openocd]
/
src
/
target
/
stm32_stlink.c
diff --git
a/src/target/stm32_stlink.c
b/src/target/stm32_stlink.c
index aac1eecb7d70843fa64759b293fb51fa1b9490a7..1c755084749e150cc597264c926981e4b49c570c 100644
(file)
--- 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)
{
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;
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);
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);
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_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) {
if (jtag_reset_config & RESET_HAS_SRST) {
if (!srst_asserted) {