Daiki Kato
/
SoftwareStanby_test_use_OS
This is a sample to make Software Standby using OS.
main.cpp@3:64e8fa1b8787, 2019-10-08 (annotated)
- Committer:
- dkato
- Date:
- Tue Oct 08 06:36:44 2019 +0000
- Revision:
- 3:64e8fa1b8787
- Parent:
- 2:c0f92fd0e8e9
- Child:
- 4:272e885e36a9
Interim measures
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dkato | 0:27ae610e630e | 1 | #include "mbed.h" |
dkato | 0:27ae610e630e | 2 | |
dkato | 0:27ae610e630e | 3 | InterruptIn button(USER_BUTTON0); |
dkato | 0:27ae610e630e | 4 | DigitalOut led1(LED1); |
dkato | 0:27ae610e630e | 5 | Thread * pTestTask = NULL; |
dkato | 0:27ae610e630e | 6 | |
dkato | 3:64e8fa1b8787 | 7 | static void idle_hook(void) { |
dkato | 3:64e8fa1b8787 | 8 | // interim measures |
dkato | 3:64e8fa1b8787 | 9 | // "__WFI()" doesn't work after SoftwareStandby. |
dkato | 3:64e8fa1b8787 | 10 | // do nothing |
dkato | 3:64e8fa1b8787 | 11 | } |
dkato | 3:64e8fa1b8787 | 12 | |
dkato | 3:64e8fa1b8787 | 13 | void SoftwareStandby(void) { |
dkato | 3:64e8fa1b8787 | 14 | volatile uint32_t dummy_32; |
dkato | 3:64e8fa1b8787 | 15 | volatile uint8_t dummy_8; |
dkato | 3:64e8fa1b8787 | 16 | |
dkato | 3:64e8fa1b8787 | 17 | GIC_DisableIRQ(OSTMI0TINT_IRQn); |
dkato | 3:64e8fa1b8787 | 18 | |
dkato | 3:64e8fa1b8787 | 19 | // Set the standby_mode_en bit of the power control register in the PL310 to 1. |
dkato | 3:64e8fa1b8787 | 20 | L2C.REG15_POWER_CTRL = 0x00000001uL; |
dkato | 3:64e8fa1b8787 | 21 | dummy_32 = L2C.REG15_POWER_CTRL; |
dkato | 3:64e8fa1b8787 | 22 | |
dkato | 3:64e8fa1b8787 | 23 | // Clear the TME bit in the watchdog timer control/status register (WTCSR) of the watchdog timer to 0 to stop the watchdog timer. |
dkato | 3:64e8fa1b8787 | 24 | WDT.WTCSR = 0xA518; |
dkato | 3:64e8fa1b8787 | 25 | WDT.WTCNT = 0x5A00; |
dkato | 3:64e8fa1b8787 | 26 | WDT.WTCSR = 0xA51D; // CKS[2:0] = b'101 : 1/1024 x P0 (7.8ms) |
dkato | 3:64e8fa1b8787 | 27 | |
dkato | 3:64e8fa1b8787 | 28 | CPG.STBCR1 = 0x80; |
dkato | 3:64e8fa1b8787 | 29 | dummy_8 = CPG.STBCR1; |
dkato | 3:64e8fa1b8787 | 30 | |
dkato | 3:64e8fa1b8787 | 31 | __WFI(); |
dkato | 3:64e8fa1b8787 | 32 | |
dkato | 3:64e8fa1b8787 | 33 | GIC_EnableIRQ(OSTMI0TINT_IRQn); |
dkato | 3:64e8fa1b8787 | 34 | } |
dkato | 3:64e8fa1b8787 | 35 | |
dkato | 0:27ae610e630e | 36 | static void interrupt_button(void) { |
dkato | 0:27ae610e630e | 37 | #if(0) // It may or may not be present. |
dkato | 0:27ae610e630e | 38 | if (pTestTask != NULL) { |
dkato | 0:27ae610e630e | 39 | pTestTask->signal_set(1); |
dkato | 0:27ae610e630e | 40 | } |
dkato | 0:27ae610e630e | 41 | #endif |
dkato | 0:27ae610e630e | 42 | } |
dkato | 0:27ae610e630e | 43 | |
dkato | 0:27ae610e630e | 44 | void test_task(void) { |
dkato | 0:27ae610e630e | 45 | int test_cnt = 0; |
dkato | 0:27ae610e630e | 46 | |
dkato | 0:27ae610e630e | 47 | button.fall(&interrupt_button); |
dkato | 0:27ae610e630e | 48 | button.rise(&interrupt_button); |
dkato | 0:27ae610e630e | 49 | |
dkato | 0:27ae610e630e | 50 | while (true) { |
dkato | 3:64e8fa1b8787 | 51 | SoftwareStandby(); |
dkato | 0:27ae610e630e | 52 | #if(0) // It may or may not be present. |
dkato | 0:27ae610e630e | 53 | // It becomes sleep during idle task. |
dkato | 0:27ae610e630e | 54 | Thread::signal_wait(1); |
dkato | 0:27ae610e630e | 55 | #endif |
dkato | 0:27ae610e630e | 56 | led1 = !led1; |
dkato | 2:c0f92fd0e8e9 | 57 | printf("%d\r\n", test_cnt++); |
dkato | 2:c0f92fd0e8e9 | 58 | ThisThread::sleep_for(5); // Wait for output completion of printf(). |
dkato | 0:27ae610e630e | 59 | } |
dkato | 0:27ae610e630e | 60 | } |
dkato | 0:27ae610e630e | 61 | |
dkato | 0:27ae610e630e | 62 | int main() { |
dkato | 3:64e8fa1b8787 | 63 | Thread::attach_idle_hook(idle_hook); // interim measures |
dkato | 0:27ae610e630e | 64 | pTestTask = new Thread(); |
dkato | 0:27ae610e630e | 65 | pTestTask->start(test_task); |
dkato | 0:27ae610e630e | 66 | } |