GPIO register configuration lets you control pins on a microcontroller to read inputs or send outputs.
GPIO register configuration in 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.
GPIOA->MODER |= (1 << 10); // Set pin 5 as output
GPIOB->PUPDR &= ~(3 << 4); // Clear pull-up/down for pin 2 GPIOB->PUPDR |= (1 << 4); // Enable pull-up for pin 2
uint32_t input = GPIOC->IDR & (1 << 3); // Read pin 3 input
This program configures pin 5 of GPIOA as output and turns an LED on and then off with a delay.
#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; }
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.
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
Solution
Step 1: Understand GPIO register role
GPIO registers control the mode and state of microcontroller pins.Step 2: Identify the main use
Setting pins as input or output allows the microcontroller to read sensors or control devices.Final Answer:
To set pins as input or output for hardware interaction -> Option DQuick Check:
GPIO config = pin mode setup [OK]
- Confusing GPIO with clock or memory settings
- Thinking GPIO handles interrupts directly
- Assuming GPIO sets processor speed
GPIO_DIR to configure pin 3 as output?Solution
Step 1: Understand bitwise OR for setting bits
Using OR with (1 << 3) sets bit 3 without changing other bits.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.Final Answer:
GPIO_DIR = GPIO_DIR | (1 << 3); -> Option CQuick Check:
Set bit with OR = correct [OK]
- Using AND (&) instead of OR (|) to set bits
- Overwriting register instead of modifying bits
- Using NOT (~) incorrectly
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?Solution
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).Step 2: Convert final binary to hex
Binary 0000 0101 equals hex 0x05.Final Answer:
0x05 -> Option BQuick Check:
Bit 2 and 0 set = 0x05 [OK]
- Ignoring bit clear operation
- Confusing bit positions
- Not converting binary to hex correctly
GPIO_DIR &= ~(1 << 5); // Set pin 5 as input
GPIO_DIR |= (1 << 5); // Set pin 5 as output
Solution
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.Step 2: Understand the conflict
Both lines contradict each other immediately, so pin 5 cannot be both input and output at the same time.Final Answer:
Pin 5 is configured as both input and output, causing conflict -> Option AQuick Check:
Conflicting pin modes = error [OK]
- Overwriting pin mode without delay or condition
- Misunderstanding bitwise operators
- Assuming GPIO_DIR is read-only
GPIO_DIR register. Which code snippet correctly sets this configuration without affecting other bits?Solution
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.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;Final Answer:
GPIO_DIR = (GPIO_DIR & 0xAA) | 0x15; -> Option AQuick Check:
Mask inputs, set outputs correctly [OK]
- Using wrong mask to clear bits
- Overwriting entire register losing other bits
- Confusing input bits with output bits
Ready to prove it?
Pass the test and this pattern moves unknown
