====== SLEEP Mode ====== In SLEEP mode only the cpu clock is disabled, everything else stays as previously configured. \\ \\ === Enter SLEEP mode === * WFI (wait for interrupt) instuction enters SLEEP mode. \\ === Exit SLEEP mode === * Clear the EXTI (and, if not EXTI, the corresponding NVIC) pending bit. \\ ===== Programming Example ===== The code snippet bellow shows how to enter (and exit) SLEEP mode. #include "reg_stm32f4xx.h" RCC->AHB1ENR |= (0x1 << 0u); /* Enable GPIOA clock */ RCC->APB2ENR |= (0x1 << 14u); /* Enable SYSCFG clock */ /* Configure wake up pin (PA.0). */ GPIOA->MODER &= ~(0x3 << 0u); /* Clear existing mode bits 10 and 11. */ GPIOA->PUPDR &= ~(0x3 << 0u); /* Clear existing pull-up/-down bits 0 and 1. */ GPIOA->PUPDR |= (0x1 << 0u); /* Set pin 0 to pull-up mode. */ /* Configure interrupt. */ SYSCFG->EXTICR1 |= (0u << 0u); /* Set EXTI0 to GPIOA. */ EXTI->RTSR |= (0x1 << 0u); /* Trigger on rising edge. */ EXTI->IMR |= (0x1 << 0u); /* Unmask interrupt line. */ NVIC->ISER0 |= (0x1 << 6u); /* Enable EXTI0 interrupt. */ /* Disable SLEEPDEEP (STOP or STANDBY mode). */ SCB->SCR &= ~(0x1 << 2u); /* -------------------- Enter SLEEP mode -------------------- */ __asm volatile ("wfi"); /* -------------------- Exit SLEEP mode --------------------- */ /* Since all registers and the SRAM are untouched by the SLEEP mode, * the program continues after the WFI instruction. * No further steps required. */ \\