This is a sample to make Software Standby using OS.

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?

UserRevisionLine numberNew 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 }