![](/media/cache/profiles/8631e5b91354a846f00dbbf16ad94259.jpg.50x50_q85.jpg)
Example of watchdog with poor coverage
Fork of Watchdog_sample_fail by
Diff: main.cpp
- Revision:
- 0:5ce3cfc57999
- Child:
- 1:159a09ac60ba
diff -r 000000000000 -r 5ce3cfc57999 main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Nov 21 13:24:29 2015 +0000 @@ -0,0 +1,52 @@ +#include "mbed.h" + +//WATHDOG ENABLED IN OUR KL25Z_SystemInit.c (overloading library function SystemInit.c) +// It happens in this uC after reset watchdog is enabled with timeout=1024ms (2^10*LPO=1KHz) +// so mbed developers to allow a learning use of this board disable it on SystemInit.c +// **BUT** SIM_COPC register can only be written once after reset and so it can not be enabled later +// I think best solution is to overload SystemInit() using: void $Sub$$SystemInit (void) { +// original SystemInit() does not appear in export, it must be dowloaded from: +// https://developer.mbed.org/users/mbed_official/code/mbed-src/file/a11c0372f0ba/targets/cmsis/TARGET_Freescale/TARGET_KLXX/TARGET_KL25Z/system_MKL25Z4.c +// you can arrive there from: +// https://developer.mbed.org/handbook/mbed-SDK and https://developer.mbed.org/users/mbed_official/code/mbed-src/ +// +// MORE on this on: https://developer.mbed.org/users/chris/notebook/Patching-functions-and-libraries/ +// and searching "ARM Compiler toolchain Using the Linker" "Using $Super$$ and $Sub$$ to patch symbol definitions" + +// Kick (feed, reload) our watchdog timer +void wdt_kick(){ + SIM->SRVCOP = (uint32_t)0x55u; + SIM->SRVCOP = (uint32_t)0xAAu; +} + +// That set RED LED ON, do that first to evaluate boot time of peripherals +#define LIGHT 0 +#define DARK 1 +DigitalOut led_red(LED_RED, LIGHT); +DigitalOut led_green(LED_GREEN, DARK); +DigitalOut led_blue(LED_BLUE, DARK); + +//Virtual serial port over USB using inboard second USB connector (USBKL25Z port) +#include "USBSerial.h" +//USBSerial pc; +//...( vendor_id, product_id, product_release, connect_blocking ) +USBSerial pc( 0x1f00, 0x2012, 0x0001, false ); +//REMEMBER TO USE: class USBSerial -> connect_blocking = false (default is true) +// to avoid block of program when no USB cable connected in USBKL25Z port +//NOTE: USBSerial still blocks program when closing serial terminal, that is fixed by our watchdog + + +int main(void) { + //to evaluate boot time I set led RED ON at the beginning of our main.cpp. TODO?: do it in SystemInit? + led_blue = DARK; + led_green = DARK; + led_red = DARK; + while(1) + { + led_blue = LIGHT; + pc.printf("I am a virtual serial port\r\n"); // THAT COULD BLOCK + wdt_kick(); + led_blue = DARK; + wait(0.5); + } +} \ No newline at end of file