Bird
Raised Fist0
Embedded Cprogramming~15 mins

Wake-up sources configuration in Embedded C - Mini Project: Build & Apply

Choose your learning style10 modes available
Wake-up Sources Configuration
📖 Scenario: You are working on a small embedded system that can wake up from sleep mode using different sources like a timer, a button press, or a sensor signal.To save power, the system should only wake up from the sources you enable.
🎯 Goal: You will write a simple program to configure which wake-up sources are enabled using a bitmask variable.This will help the system know which events should wake it up.
📋 What You'll Learn
Create a variable to hold the wake-up sources configuration.
Define constants for each wake-up source using bit flags.
Set a configuration variable to enable specific wake-up sources using bitwise OR.
Print the final configuration value.
💡 Why This Matters
🌍 Real World
Embedded devices often need to save power by sleeping and waking only on certain events. Configuring wake-up sources correctly is essential for battery life and responsiveness.
💼 Career
Understanding bitwise operations and hardware configuration is key for embedded systems engineers and firmware developers working on low-power devices.
Progress0 / 4 steps
1
Define wake-up source constants
Define three constants called WAKEUP_TIMER, WAKEUP_BUTTON, and WAKEUP_SENSOR with values 0x01, 0x02, and 0x04 respectively.
Embedded C
Hint

Use #define to create constants with the exact names and values.

2
Create wake-up configuration variable
Create an unsigned char variable called wakeup_config and initialize it to zero.
Embedded C
Hint

Use unsigned char wakeup_config = 0; to create the variable.

3
Enable timer and button wake-up sources
Set wakeup_config to enable both WAKEUP_TIMER and WAKEUP_BUTTON using the bitwise OR operator.
Embedded C
Hint

Use | to combine the flags.

4
Print the wake-up configuration
Write a printf statement to print the value of wakeup_config as a hexadecimal number with 0x prefix.
Embedded C
Hint

Use printf("Wake-up configuration: 0x%02X\n", wakeup_config); to print the value.

Practice

(1/5)
1. Which of the following is a common wake-up source in embedded C devices?
easy
A. GPIO pin interrupt
B. Floating point calculation
C. String concatenation
D. File system read

Solution

  1. Step 1: Understand wake-up sources

    Wake-up sources are hardware events that can wake a device from sleep mode, such as GPIO interrupts or timers.
  2. Step 2: Identify valid wake-up sources

    GPIO pin interrupts are commonly used as wake-up sources because they detect external signals.
  3. Final Answer:

    GPIO pin interrupt -> Option A
  4. Quick Check:

    Wake-up source = GPIO pin interrupt [OK]
Hint: Wake-up sources are hardware events like GPIO or timers [OK]
Common Mistakes:
  • Confusing software operations with hardware wake-up sources
  • Thinking file operations can wake embedded devices
  • Assuming calculations can trigger wake-up
2. Which syntax correctly enables a GPIO pin as a wake-up source in embedded C?
easy
A. enable_wakeup(GPIO_PIN_5);
B. GPIO_WAKEUP_ENABLE(5);
C. wakeup_enable(GPIO5);
D. set_wakeup_pin(5);

Solution

  1. Step 1: Recognize common embedded C macros

    Macros often use uppercase and underscores, like GPIO_WAKEUP_ENABLE(pin).
  2. Step 2: Match syntax style

    GPIO_WAKEUP_ENABLE(5); matches typical embedded C macro style for enabling wake-up on GPIO pin 5.
  3. Final Answer:

    GPIO_WAKEUP_ENABLE(5); -> Option B
  4. Quick Check:

    Macro style = GPIO_WAKEUP_ENABLE(5) [OK]
Hint: Look for uppercase macro style for hardware config [OK]
Common Mistakes:
  • Using lowercase function names not defined in embedded C
  • Confusing parameter formats
  • Missing parentheses or semicolons
3. What will be the output of the following code snippet?
void configure_wakeup() {
    WAKEUP_ENABLE_TIMER(1000); // 1000 ms
    WAKEUP_ENABLE_GPIO(3);
}

int main() {
    configure_wakeup();
    if (is_wakeup_source(GPIO_3)) {
        printf("Wakeup by GPIO 3\n");
    } else if (is_wakeup_source(TIMER)) {
        printf("Wakeup by Timer\n");
    } else {
        printf("No wakeup source\n");
    }
    return 0;
}
medium
A. Wakeup by GPIO 3
B. Wakeup by Timer
C. No wakeup source
D. Compilation error

Solution

  1. Step 1: Analyze function and macros usage

    The code uses WAKEUP_ENABLE_TIMER and WAKEUP_ENABLE_GPIO macros but does not define or include them, causing compilation errors.
  2. Step 2: Check function calls and conditions

    Functions like is_wakeup_source and constants GPIO_3, TIMER are undefined, leading to compilation failure.
  3. Final Answer:

    Compilation error -> Option D
  4. Quick Check:

    Undefined macros/functions cause compilation error [OK]
Hint: Undefined macros or functions cause compile errors [OK]
Common Mistakes:
  • Assuming macros are predefined without headers
  • Ignoring missing function definitions
  • Confusing runtime output with compile errors
4. Identify the error in this wake-up source configuration code:
void setup_wakeup() {
    WAKEUP_ENABLE_GPIO(2);
    WAKEUP_ENABLE_GPIO(2);
    WAKEUP_ENABLE_TIMER(500);
}
medium
A. Duplicate GPIO wake-up enable causes conflict
B. Timer value 500 is invalid
C. Missing return statement
D. No error, code is correct

Solution

  1. Step 1: Review GPIO wake-up configuration

    The code enables GPIO pin 2 twice, which can cause conflicts or redundant configuration.
  2. Step 2: Check timer configuration and function structure

    Timer value 500 ms is valid; no return needed for void function.
  3. Final Answer:

    Duplicate GPIO wake-up enable causes conflict -> Option A
  4. Quick Check:

    Duplicate GPIO enable = conflict [OK]
Hint: Avoid enabling same GPIO wake-up twice [OK]
Common Mistakes:
  • Thinking timer value is invalid
  • Expecting return in void function
  • Ignoring duplicate hardware config issues
5. You want to configure a device to wake up either by GPIO pin 4 or after 2 seconds using a timer. Which code snippet correctly sets both wake-up sources?
hard
A. WAKEUP_CONFIG(GPIO4 | TIMER_2S);
B. WAKEUP_ENABLE_TIMER(2); WAKEUP_ENABLE_GPIO(4);
C. WAKEUP_ENABLE_GPIO(4); WAKEUP_ENABLE_TIMER(2000);
D. WAKEUP_ENABLE_GPIO(4, 2000);

Solution

  1. Step 1: Understand separate wake-up source configuration

    GPIO and timer wake-up sources are usually enabled with separate calls specifying pin and time in milliseconds.
  2. Step 2: Evaluate options for correctness

    WAKEUP_ENABLE_GPIO(4); WAKEUP_ENABLE_TIMER(2000); correctly enables GPIO pin 4 and timer with 2000 ms (2 seconds). WAKEUP_ENABLE_TIMER(2); WAKEUP_ENABLE_GPIO(4); uses 2 (seconds) instead of milliseconds. WAKEUP_ENABLE_GPIO(4, 2000); incorrectly combines parameters. WAKEUP_CONFIG(GPIO4 | TIMER_2S); uses an undefined macro.
  3. Final Answer:

    WAKEUP_ENABLE_GPIO(4); WAKEUP_ENABLE_TIMER(2000); -> Option C
  4. Quick Check:

    Separate calls with correct units = WAKEUP_ENABLE_GPIO(4); WAKEUP_ENABLE_TIMER(2000); [OK]
Hint: Enable GPIO and timer separately with correct units [OK]
Common Mistakes:
  • Using seconds instead of milliseconds for timer
  • Combining GPIO and timer in one call
  • Using undefined macros
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard