Bird
Raised Fist0
Embedded Cprogramming~5 mins

GPIO register configuration in Embedded C

Choose your learning style10 modes available
Introduction

GPIO register configuration lets you control pins on a microcontroller to read inputs or send outputs.

Turning an LED on or off by controlling a pin
Reading a button press from a pin
Setting a pin to output a signal like PWM
Configuring pins for communication like SPI or I2C
Syntax
Embedded C
GPIOx->MODER = value;  // Set pin mode
GPIOx->OTYPER = value; // Set output type
GPIOx->OSPEEDR = value; // Set speed
GPIOx->PUPDR = value;   // Set pull-up/pull-down
GPIOx->IDR;            // Read input data
GPIOx->ODR = value;    // Write output data

GPIOx means the GPIO port like GPIOA, GPIOB, etc.

Each register controls different pin settings using bits.

Examples
This sets pin 5 of GPIOA as output by setting bits 10 and 11 in MODER register.
Embedded C
GPIOA->MODER |= (1 << 10);  // Set pin 5 as output
This configures pin 2 of GPIOB with pull-up resistor enabled.
Embedded C
GPIOB->PUPDR &= ~(3 << 4);  // Clear pull-up/down for pin 2
GPIOB->PUPDR |= (1 << 4);       // Enable pull-up for pin 2
This reads the state of pin 3 on GPIOC.
Embedded C
uint32_t input = GPIOC->IDR & (1 << 3);  // Read pin 3 input
Sample Program

This program configures pin 5 of GPIOA as output and turns an LED on and then off with a delay.

Embedded C
#include <stdint.h>
#include "stm32f4xx.h"  // Example MCU header

int main() {
    // Enable clock for GPIOA (usually done in RCC register)
    RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;

    // Set PA5 as output (LED pin on many boards)
    GPIOA->MODER &= ~(3 << (5 * 2));  // Clear mode bits for pin 5
    GPIOA->MODER |= (1 << (5 * 2));   // Set pin 5 as general purpose output

    // Turn LED on
    GPIOA->ODR |= (1 << 5);

    // Simple delay loop
    for (volatile int i = 0; i < 1000000; i++);

    // Turn LED off
    GPIOA->ODR &= ~(1 << 5);

    while(1) {}
    return 0;
}
OutputSuccess
Important Notes

Always enable the clock for the GPIO port before configuring it.

Each pin uses two bits in MODER to set mode: 00=input, 01=output, 10=alternate function, 11=analog.

Use bitwise operations to change only the bits you want without affecting others.

Summary

GPIO register configuration controls how pins behave on a microcontroller.

Use MODER to set pin mode, PUPDR for pull-up/down, and ODR/IDR to write/read pin states.

Remember to enable the GPIO clock before configuring pins.

Practice

(1/5)
1. What is the primary purpose of configuring GPIO registers in embedded C?
easy
A. To handle interrupts from external devices
B. To increase the clock speed of the microcontroller
C. To allocate memory for variables
D. To set pins as input or output for hardware interaction

Solution

  1. Step 1: Understand GPIO register role

    GPIO registers control the mode and state of microcontroller pins.
  2. Step 2: Identify the main use

    Setting pins as input or output allows the microcontroller to read sensors or control devices.
  3. Final Answer:

    To set pins as input or output for hardware interaction -> Option D
  4. Quick Check:

    GPIO config = pin mode setup [OK]
Hint: GPIO controls pin direction and state [OK]
Common Mistakes:
  • Confusing GPIO with clock or memory settings
  • Thinking GPIO handles interrupts directly
  • Assuming GPIO sets processor speed
2. Which of the following is the correct way to set bit 3 of a GPIO register named GPIO_DIR to configure pin 3 as output?
easy
A. GPIO_DIR = (1 << 3);
B. GPIO_DIR = GPIO_DIR & (1 << 3);
C. GPIO_DIR = GPIO_DIR | (1 << 3);
D. GPIO_DIR = ~GPIO_DIR | (1 << 3);

Solution

  1. Step 1: Understand bitwise OR for setting bits

    Using OR with (1 << 3) sets bit 3 without changing other bits.
  2. Step 2: Analyze each option

    GPIO_DIR = GPIO_DIR | (1 << 3); correctly sets bit 3. GPIO_DIR = GPIO_DIR & (1 << 3); clears other bits. GPIO_DIR = (1 << 3); overwrites all bits. GPIO_DIR = ~GPIO_DIR | (1 << 3); inverts bits incorrectly.
  3. Final Answer:

    GPIO_DIR = GPIO_DIR | (1 << 3); -> Option C
  4. Quick Check:

    Set bit with OR = correct [OK]
Hint: Use OR (|) to set bits without clearing others [OK]
Common Mistakes:
  • Using AND (&) instead of OR (|) to set bits
  • Overwriting register instead of modifying bits
  • Using NOT (~) incorrectly
3. Given the code snippet:
uint8_t GPIO_DATA = 0x00;
GPIO_DATA |= (1 << 2);
GPIO_DATA &= ~(1 << 0);
GPIO_DATA |= (1 << 0);

What is the final value of GPIO_DATA in hexadecimal?
medium
A. 0x04
B. 0x05
C. 0x01
D. 0x00

Solution

  1. Step 1: Apply each operation step-by-step

    Start: GPIO_DATA = 0x00 (binary 0000 0000).
    After GPIO_DATA |= (1 << 2): sets bit 2 -> 0000 0100 (0x04).
    After GPIO_DATA &= ~(1 << 0): clears bit 0 -> still 0000 0100 (0x04).
    After GPIO_DATA |= (1 << 0): sets bit 0 -> 0000 0101 (0x05).
  2. Step 2: Convert final binary to hex

    Binary 0000 0101 equals hex 0x05.
  3. Final Answer:

    0x05 -> Option B
  4. Quick Check:

    Bit 2 and 0 set = 0x05 [OK]
Hint: Track bits set/cleared stepwise [OK]
Common Mistakes:
  • Ignoring bit clear operation
  • Confusing bit positions
  • Not converting binary to hex correctly
4. Identify the error in this GPIO pin configuration code snippet:
GPIO_DIR &= ~(1 << 5); // Set pin 5 as input
GPIO_DIR |= (1 << 5); // Set pin 5 as output
medium
A. Pin 5 is configured as both input and output, causing conflict
B. Bitwise AND operator is used incorrectly
C. Shift operator should be << 4 instead of << 5
D. GPIO_DIR register cannot be modified directly

Solution

  1. Step 1: Analyze the two lines

    First line clears bit 5 to set pin 5 as input.
    Second line sets bit 5 to set pin 5 as output.
  2. Step 2: Understand the conflict

    Both lines contradict each other immediately, so pin 5 cannot be both input and output at the same time.
  3. Final Answer:

    Pin 5 is configured as both input and output, causing conflict -> Option A
  4. Quick Check:

    Conflicting pin modes = error [OK]
Hint: Avoid setting same pin input and output simultaneously [OK]
Common Mistakes:
  • Overwriting pin mode without delay or condition
  • Misunderstanding bitwise operators
  • Assuming GPIO_DIR is read-only
5. You want to configure pins 0, 2, and 4 as outputs and pins 1, 3, and 5 as inputs using a single 8-bit GPIO_DIR register. Which code snippet correctly sets this configuration without affecting other bits?
hard
A. GPIO_DIR = (GPIO_DIR & 0xAA) | 0x15;
B. GPIO_DIR = (GPIO_DIR & 0x55) | 0x2A;
C. GPIO_DIR = (GPIO_DIR & 0x3F) | 0xC0;
D. GPIO_DIR = (GPIO_DIR & 0xF0) | 0x0F;

Solution

  1. Step 1: Identify bits for outputs and inputs

    Outputs: pins 0,2,4 -> bits 0,2,4 set to 1 -> binary 0001 0101 (0x15).
    Inputs: pins 1,3,5 -> bits 1,3,5 preserved.
  2. Step 2: Use mask to clear bits 0,2,4 before setting

    Mask 0xAA (1010 1010) clears bits 0,2,4 when ANDed.
    Then OR with 0x15 sets output bits.
    So: GPIO_DIR = (GPIO_DIR & 0xAA) | 0x15;
  3. Final Answer:

    GPIO_DIR = (GPIO_DIR & 0xAA) | 0x15; -> Option A
  4. Quick Check:

    Mask inputs, set outputs correctly [OK]
Hint: Clear output bits with mask, then OR to set [OK]
Common Mistakes:
  • Using wrong mask to clear bits
  • Overwriting entire register losing other bits
  • Confusing input bits with output bits
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