📖 Scenario: You are working on a simple embedded system that needs to save power by entering standby mode when idle. In standby mode, the system stops most activities but can wake up on an external event.
🎯 Goal: Build a small program that simulates entering standby mode and waking up on an external event using flags and simple functions.
📋 What You'll Learn
Create a variable to represent the system state
Create a variable to represent an external wake-up event
Write a function to enter standby mode
Write a function to simulate an external event waking the system
Print the system state before and after standby mode
💡 Why This Matters
🌍 Real World
Embedded systems often need to save power by entering standby mode and waking up on events like button presses or sensor signals.
💼 Career
Understanding standby mode behavior is important for embedded software engineers working on low-power devices such as wearables, IoT sensors, and mobile electronics.
Progress0 / 4 steps
1
Create system state variable
Create an integer variable called system_state and set it to 0 to represent the system being active.
Embedded C
Hint
Use int system_state = 0; to create the variable.
2
Create external event flag
Create an integer variable called wake_event and set it to 0 to represent no external event.
Embedded C
Hint
Use int wake_event = 0; to create the variable.
3
Write standby and wake functions
Write a function called enter_standby() that sets system_state to 1 (standby). Write another function called wake_up() that sets wake_event to 1 and system_state back to 0 (active).
Embedded C
Hint
Define two functions: enter_standby() and wake_up() that change the variables as described.
4
Simulate standby and wake-up with output
Write a main() function that prints system_state, calls enter_standby(), prints system_state again, calls wake_up(), and finally prints system_state and wake_event.
Embedded C
Hint
Use printf to show the values and call the functions in order.
Practice
(1/5)
1. What is the main purpose of putting a microcontroller into standby mode?
easy
A. To save power by entering a deep sleep state
B. To increase the clock speed temporarily
C. To reset all registers to default values
D. To enable all peripherals for faster processing
Solution
Step 1: Understand standby mode function
Standby mode is designed to reduce power consumption by putting the device into a very low power state.
Step 2: Compare options with standby purpose
Only To save power by entering a deep sleep state correctly describes saving power by deep sleep. Other options describe unrelated functions.
Final Answer:
To save power by entering a deep sleep state -> Option A
Quick Check:
Standby mode = power saving [OK]
Hint: Standby mode means deep sleep to save power [OK]
Common Mistakes:
Confusing standby with reset or speed boost
Thinking standby enables all peripherals
Assuming standby clears registers
2. Which of the following code snippets correctly sets the microcontroller to enter standby mode in embedded C?
easy
A. PWR->CR &= ~PWR_CR_PDDS; SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; __WFI();
B. PWR->CR |= PWR_CR_PDDS; SCB->SCR &= ~SCB_SCR_SLEEPDEEP_Msk; __WFI();
C. PWR->CR |= PWR_CR_CWUF; SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; __WFE();
D. PWR->CR |= PWR_CR_PDDS; SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; __WFI();
Solution
Step 1: Identify correct register settings for standby
Setting PWR_CR_PDDS bit and SLEEPDEEP bit enables standby mode deep sleep.
Step 2: Check the wait instruction
__WFI() (Wait For Interrupt) is used to enter sleep mode properly.
Final Answer:
PWR->CR |= PWR_CR_PDDS; SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk; __WFI(); -> Option D
Quick Check:
Set PDDS + SLEEPDEEP + __WFI() = standby [OK]
Hint: Set PDDS and SLEEPDEEP bits, then call __WFI() [OK]
Common Mistakes:
Clearing PDDS or SLEEPDEEP bits disables standby
Using __WFE() instead of __WFI() incorrectly
Not setting SLEEPDEEP bit before sleep
3. Given the code below, what will be the output after the microcontroller wakes up from standby mode?
volatile int flag = 0;
void enter_standby() {
PWR->CR |= PWR_CR_PDDS;
SCB->SCR |= SCB_SCR_SLEEPDEEP_Msk;
__WFI();
flag = 1;
}
int main() {
enter_standby();
if(flag) {
printf("Woke up from standby\n");
} else {
printf("Still running\n");
}
return 0;
}
medium
A. Woke up from standby
B. Compilation error due to volatile variable
C. Still running
D. No output (program stuck in standby)
Solution
Step 1: Understand standby mode effect on program flow
Standby mode resets the device on wake-up, so code after __WFI() is not executed.
Step 2: Analyze flag variable and output
Since flag is set after __WFI(), but device resets, flag remains 0 and main restarts, so output will be "Still running" because flag is 0 after reset.
Final Answer:
Still running -> Option C
Quick Check:
Standby resets device, code after __WFI() not run, flag remains 0 [OK]
Hint: Standby resets device; code after __WFI() won't run [OK]
Common Mistakes:
Assuming code after __WFI() runs after wake-up
Ignoring device reset on standby wake-up
Confusing volatile with persistence across reset
4. Identify the error in the following code snippet that prevents the microcontroller from entering standby mode:
B. SLEEPDEEP bit is cleared, so device does not enter deep sleep
C. __WFI() is the wrong instruction to enter standby
D. Missing enabling of power clock before setting registers
Solution
Step 1: Check SLEEPDEEP bit usage
SLEEPDEEP bit must be set to enter deep sleep (standby). Clearing it disables deep sleep.
Step 2: Verify other settings
PDDS bit is set correctly; __WFI() is correct; power clock enabling is not shown but not always mandatory here.
Final Answer:
SLEEPDEEP bit is cleared, so device does not enter deep sleep -> Option B
Quick Check:
SLEEPDEEP cleared = no deep sleep [OK]
Hint: SLEEPDEEP bit must be set for standby mode [OK]
Common Mistakes:
Clearing SLEEPDEEP bit disables standby
Confusing __WFI() with __WFE()
Forgetting to set PDDS bit
5. You want to configure a microcontroller to enter standby mode but wake up only when a specific external interrupt occurs. Which sequence correctly achieves this behavior?
hard
A. Enable external interrupt line; configure wake-up pin; set PDDS and SLEEPDEEP bits; call __WFI()
B. Set PDDS and SLEEPDEEP bits; call __WFI(); enable external interrupt after wake-up
C. Call __WFI(); then set PDDS and SLEEPDEEP bits; enable external interrupt
D. Enable external interrupt; call __WFE(); clear PDDS bit; set SLEEPDEEP bit
Solution
Step 1: Configure wake-up source before standby
External interrupt line and wake-up pin must be enabled before entering standby.
Step 2: Set standby mode bits and enter sleep
Set PDDS and SLEEPDEEP bits to enable standby, then call __WFI() to enter standby mode.
Final Answer:
Enable external interrupt line; configure wake-up pin; set PDDS and SLEEPDEEP bits; call __WFI() -> Option A
Quick Check:
Setup wake-up + set bits + __WFI() = standby with wake-up [OK]
Hint: Setup wake-up source before standby, then set bits and __WFI() [OK]
Common Mistakes:
Enabling interrupts after entering standby
Clearing PDDS bit disables standby
Using __WFE() without proper wake-up config
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.