Nuvoton
/
NuMaker-mbed-tickless-example
NuMaker tickless example
wakeup_wdt.cpp@10:d2e2c79389e1, 2017-10-02 (annotated)
- Committer:
- ccli8
- Date:
- Mon Oct 02 11:24:10 2017 +0800
- Revision:
- 10:d2e2c79389e1
- Parent:
- 1:eb1da9d36e12
- Child:
- 16:ed2c228cbc9c
Support NANO130
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ccli8 |
1:eb1da9d36e12 | 1 | #include "mbed.h" |
ccli8 |
1:eb1da9d36e12 | 2 | #include "wakeup.h" |
ccli8 |
10:d2e2c79389e1 | 3 | |
ccli8 |
10:d2e2c79389e1 | 4 | #if defined(TARGET_NUMAKER_PFM_NANO130) |
ccli8 |
10:d2e2c79389e1 | 5 | /* This target doesn't support relocating vector table and requires overriding |
ccli8 |
10:d2e2c79389e1 | 6 | * vector handler at link-time. */ |
ccli8 |
10:d2e2c79389e1 | 7 | extern "C" void WDT_IRQHandler(void) |
ccli8 |
10:d2e2c79389e1 | 8 | #else |
ccli8 |
1:eb1da9d36e12 | 9 | void WDT_IRQHandler(void) |
ccli8 |
10:d2e2c79389e1 | 10 | #endif |
ccli8 |
1:eb1da9d36e12 | 11 | { |
ccli8 |
1:eb1da9d36e12 | 12 | /* Check WDT interrupt flag */ |
ccli8 |
1:eb1da9d36e12 | 13 | if (WDT_GET_TIMEOUT_INT_FLAG()) { |
ccli8 |
1:eb1da9d36e12 | 14 | WDT_CLEAR_TIMEOUT_INT_FLAG(); |
ccli8 |
1:eb1da9d36e12 | 15 | WDT_RESET_COUNTER(); |
ccli8 |
1:eb1da9d36e12 | 16 | } |
ccli8 |
1:eb1da9d36e12 | 17 | |
ccli8 |
1:eb1da9d36e12 | 18 | // Check WDT wake-up flag |
ccli8 |
1:eb1da9d36e12 | 19 | if (WDT_GET_TIMEOUT_WAKEUP_FLAG()) { |
ccli8 |
1:eb1da9d36e12 | 20 | WDT_CLEAR_TIMEOUT_WAKEUP_FLAG(); |
ccli8 |
1:eb1da9d36e12 | 21 | |
ccli8 |
1:eb1da9d36e12 | 22 | wakeup_eventflags.set(EventFlag_Wakeup_WDT_Timeout); |
ccli8 |
1:eb1da9d36e12 | 23 | } |
ccli8 |
1:eb1da9d36e12 | 24 | } |
ccli8 |
1:eb1da9d36e12 | 25 | |
ccli8 |
1:eb1da9d36e12 | 26 | void config_wdt_wakeup() |
ccli8 |
1:eb1da9d36e12 | 27 | { |
ccli8 |
1:eb1da9d36e12 | 28 | /* Enable IP module clock */ |
ccli8 |
1:eb1da9d36e12 | 29 | CLK_EnableModuleClock(WDT_MODULE); |
ccli8 |
1:eb1da9d36e12 | 30 | |
ccli8 |
1:eb1da9d36e12 | 31 | /* Select IP clock source */ |
ccli8 |
10:d2e2c79389e1 | 32 | #if defined(TARGET_NUMAKER_PFM_NANO130) |
ccli8 |
10:d2e2c79389e1 | 33 | CLK_SetModuleClock(WDT_MODULE, 0, 0); |
ccli8 |
10:d2e2c79389e1 | 34 | #else |
ccli8 |
1:eb1da9d36e12 | 35 | CLK_SetModuleClock(WDT_MODULE, CLK_CLKSEL1_WDTSEL_LIRC, 0); |
ccli8 |
10:d2e2c79389e1 | 36 | #endif |
ccli8 |
1:eb1da9d36e12 | 37 | |
ccli8 |
1:eb1da9d36e12 | 38 | SYS_UnlockReg(); |
ccli8 |
1:eb1da9d36e12 | 39 | /* Alarm every 2^14 LIRC clocks, disable system reset, enable system wake-up */ |
ccli8 |
1:eb1da9d36e12 | 40 | WDT_Open(WDT_TIMEOUT_2POW14, 0, FALSE, TRUE); |
ccli8 |
1:eb1da9d36e12 | 41 | SYS_LockReg(); |
ccli8 |
10:d2e2c79389e1 | 42 | |
ccli8 |
1:eb1da9d36e12 | 43 | /* NOTE: The name of symbol WDT_IRQHandler is mangled in C++ and cannot override that in startup file in C. |
ccli8 |
1:eb1da9d36e12 | 44 | * So the NVIC_SetVector call cannot be left out. */ |
ccli8 |
1:eb1da9d36e12 | 45 | NVIC_SetVector(WDT_IRQn, (uint32_t) WDT_IRQHandler); |
ccli8 |
1:eb1da9d36e12 | 46 | NVIC_EnableIRQ(WDT_IRQn); |
ccli8 |
1:eb1da9d36e12 | 47 | SYS_UnlockReg(); |
ccli8 |
1:eb1da9d36e12 | 48 | /* Enable WDT timeout interrupt */ |
ccli8 |
1:eb1da9d36e12 | 49 | WDT_EnableInt(); |
ccli8 |
1:eb1da9d36e12 | 50 | SYS_LockReg(); |
ccli8 |
1:eb1da9d36e12 | 51 | } |