From e66f9ff0aadd4cbf49eb735fc4cb166fcc0ea577 Mon Sep 17 00:00:00 2001 From: Christoph Plank Date: Sun, 22 Mar 2015 00:16:51 +0100 Subject: [PATCH] Call SystemInit before loading the .data section for TEENSY3.1 when using GCC_ARM This is needed because it seems the watchdog otherwise resets the board before SystemInit is reached even though I'm not sure why the watchdog timer expires so early. --- .../TOOLCHAIN_GCC_ARM/startup_MK20DX256.s | 9 +++++++-- .../TARGET_K20XX/TARGET_TEENSY3_1/system_MK20DX256.c | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/TOOLCHAIN_GCC_ARM/startup_MK20DX256.s b/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/TOOLCHAIN_GCC_ARM/startup_MK20DX256.s index c2eaa33f46..e54559a4dc 100644 --- a/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/TOOLCHAIN_GCC_ARM/startup_MK20DX256.s +++ b/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/TOOLCHAIN_GCC_ARM/startup_MK20DX256.s @@ -192,6 +192,13 @@ __isr_vector: .globl Reset_Handler .type Reset_Handler, %function Reset_Handler: +/* + * Call SystemInit before loading the .data section to prevent the watchdog + * from resetting the board. + */ + ldr r0, =SystemInit + blx r0 + /* Loop to copy data from read only memory to RAM. The ranges * of copy from/to are specified by following symbols evaluated in * linker script. @@ -212,8 +219,6 @@ Reset_Handler: .Lflash_to_ram_loop_end: - ldr r0, =SystemInit - blx r0 ldr r0, =_start bx r0 .pool diff --git a/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/system_MK20DX256.c b/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/system_MK20DX256.c index 4b45c719f0..4f34cc76c1 100644 --- a/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/system_MK20DX256.c +++ b/libraries/mbed/targets/cmsis/TARGET_Freescale/TARGET_K20XX/TARGET_TEENSY3_1/system_MK20DX256.c @@ -100,6 +100,8 @@ uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK; -- SystemInit() ---------------------------------------------------------------------------- */ void SystemInit (void) { + /* SystemInit MUST NOT use any variables from the .data section, as this section is not loaded yet! */ + #if (DISABLE_WDOG) /* Disable the WDOG module */ /* WDOG_UNLOCK: WDOGUNLOCK=0xC520 */