📖 Scenario: You are working on a simple embedded system that controls a small LED light using a button. This is a common real-world task where General Purpose Input/Output (GPIO) pins are used to connect and control hardware components.
🎯 Goal: Build a small embedded C program that reads the state of a button connected to a GPIO input pin and turns an LED on or off connected to a GPIO output pin. This project will show why GPIO is the foundation of embedded systems by demonstrating how to interact with hardware.
📋 What You'll Learn
Create variables to represent GPIO pins for the button and LED
Set up a configuration variable to define the button's pressed state
Write code to read the button state and control the LED accordingly
Print the LED state to simulate output
💡 Why This Matters
🌍 Real World
Embedded systems use GPIO pins to interact with sensors, buttons, motors, and lights in devices like home appliances, cars, and robots.
💼 Career
Understanding GPIO basics is essential for embedded software developers, hardware engineers, and anyone working with microcontrollers or IoT devices.
Progress0 / 4 steps
1
DATA SETUP: Define GPIO pins for button and LED
Create two integer variables called button_pin and led_pin and set them to 2 and 3 respectively to represent GPIO pins.
Embedded C
Hint
Think of GPIO pins as numbered connectors on your microcontroller. Assign numbers 2 and 3 to button_pin and led_pin.
2
CONFIGURATION: Define button pressed state
Create an integer variable called button_pressed and set it to 1 to represent the button being pressed.
Embedded C
Hint
Use 1 to mean the button is pressed, like a switch being ON.
3
CORE LOGIC: Read button and control LED
Create an integer variable button_state and set it to button_pressed. Then create an integer variable led_state and set it to 1 if button_state equals button_pressed, otherwise set led_state to 0.
Embedded C
Hint
Use a conditional expression to set led_state based on button_state.
4
OUTPUT: Display LED state
Write a printf statement to print "LED is ON" if led_state is 1, otherwise print "LED is OFF".
Embedded C
Hint
Use printf and an if statement to show the LED status.
Practice
(1/5)
1. Why are GPIO pins considered the foundation of embedded systems?
easy
A. Because they allow microcontrollers to interact with external devices by sending and receiving signals
B. Because they store large amounts of data for processing
C. Because they provide power to the microcontroller
D. Because they control the clock speed of the processor
Solution
Step 1: Understand GPIO function
GPIO pins are used to send and receive simple digital signals to control or read from external devices.
Step 2: Identify why this is foundational
Since embedded systems interact with hardware, GPIO pins are essential for this communication.
Final Answer:
Because they allow microcontrollers to interact with external devices by sending and receiving signals -> Option A
Quick Check:
GPIO = Basic hardware communication [OK]
Hint: GPIO connects microcontrollers to hardware signals [OK]
Common Mistakes:
Thinking GPIO stores data
Confusing GPIO with power supply pins
Assuming GPIO controls processor speed
2. Which of the following is the correct way to configure a GPIO pin as output in embedded C?
easy
A. GPIO_DIR &= ~(1 << PIN_NUMBER);
B. GPIO_DIR |= (1 << PIN_NUMBER);
C. GPIO_DATA |= (1 << PIN_NUMBER);
D. GPIO_DATA &= ~(1 << PIN_NUMBER);
Solution
Step 1: Understand GPIO direction register
Setting a bit in the direction register (GPIO_DIR) to 1 configures the pin as output.
Step 2: Analyze options
GPIO_DIR |= (1 << PIN_NUMBER); sets the bit, configuring output. GPIO_DIR &= ~(1 << PIN_NUMBER); clears the bit (input). Options C and D modify data, not direction.
Final Answer:
GPIO_DIR |= (1 << PIN_NUMBER); -> Option B
Quick Check:
Set direction bit = output [OK]
Hint: Set GPIO_DIR bit to 1 for output [OK]
Common Mistakes:
Modifying GPIO_DATA instead of GPIO_DIR
Clearing bit instead of setting for output
Confusing input and output configuration
3. Given the code snippet:
GPIO_DIR |= (1 << 3); // Set pin 3 as output
GPIO_DATA &= ~(1 << 3); // Clear pin 3 (set low)
GPIO_DATA |= (1 << 3); // Set pin 3 (set high)
int state = (GPIO_DATA & (1 << 3)) ? 1 : 0;
What is the value of state after execution?
medium
A. 0
B. Undefined
C. 1
D. Depends on previous pin state
Solution
Step 1: Trace pin configuration and data changes
Pin 3 is set as output. Then pin 3 is cleared (low), then set (high).
Step 2: Evaluate final pin state
After setting pin 3 high, reading GPIO_DATA & (1 << 3) returns non-zero, so state = 1.
Final Answer:
1 -> Option C
Quick Check:
Pin set high means state = 1 [OK]
Hint: Last pin set operation determines state [OK]
Common Mistakes:
Ignoring the last set operation
Confusing bitwise AND result with zero
Assuming pin state depends on previous value
4. Identify the error in this GPIO pin initialization code:
GPIO_DIR &= ~(1 << 5); // Configure pin 5 as output
GPIO_DATA |= (1 << 5); // Set pin 5 high
medium
A. Pin 5 is configured as input, not output
B. Pin 5 is not set high correctly
C. GPIO_DATA should be cleared, not set
D. No error, code is correct
Solution
Step 1: Analyze GPIO_DIR operation
Clearing bit 5 in GPIO_DIR sets pin 5 as input, not output.
Step 2: Check pin configuration vs usage
Setting GPIO_DATA bit 5 high has no effect if pin is input.
Final Answer:
Pin 5 is configured as input, not output -> Option A
Quick Check:
Clear DIR bit = input, not output [OK]
Hint: Clear DIR bit = input, set DIR bit = output [OK]
Common Mistakes:
Confusing input and output bits
Assuming setting DATA works for input pins
Ignoring direction register effect
5. You want to toggle an LED connected to GPIO pin 2 every second. Which code snippet correctly implements this using GPIO registers in embedded C?