36. Pointer to Struct with Bitfields

#include <stdio.h>

// Define UART Control Register with bitfields
struct UART_ControlRegister {
    unsigned int baudrate : 4;    // 4-bit baud rate (0-15)
    unsigned int tx_enable : 1;   // Transmit enable
    unsigned int rx_enable : 1;   // Receive enable
    unsigned int tx_irq_en : 1;   // Transmit interrupt enable
    unsigned int rx_irq_en : 1;   // Receive interrupt enable
    unsigned int parity_en : 1;   // Parity bit enable
    unsigned int stop_bits : 1;   // Stop bits (0: 1-bit, 1: 2-bits)
    unsigned int reserved : 22;   // Reserved (unused)
};

// Function to configure the UART register via struct pointer
void configure_uart(struct UART_ControlRegister *reg) {
    reg->baudrate = 9;      // Set baud rate to 9
    reg->tx_enable = 1;     // Enable transmitter
    reg->rx_enable = 1;     // Enable receiver
    reg->tx_irq_en = 1;     // Enable TX interrupt
    reg->rx_irq_en = 0;     // Disable RX interrupt
    reg->parity_en = 1;     // Enable parity
    reg->stop_bits = 0;     // 1 stop bit
}

int main() {
    struct UART_ControlRegister reg = {0};  // Initialize all fields to 0

    configure_uart(&reg);  // Pass pointer to configure function

    // Print all fields after configuration
    printf("baudrate = %u\n", reg.baudrate);
    printf("tx_enable = %u\n", reg.tx_enable);
    printf("rx_enable = %u\n", reg.rx_enable);
    printf("tx_irq_en = %u\n", reg.tx_irq_en);
    printf("rx_irq_en = %u\n", reg.rx_irq_en);
    printf("parity_en = %u\n", reg.parity_en);
    printf("stop_bits = %u", reg.stop_bits);

    return 0;
}
  • The struct models a memory-mapped UART control register (32-bit).
  • Each field is accessed and modified via pointer using reg->field.
  • This simulates how actual hardware UART peripherals are configured in firmware.

✅ This example bridges low-level Cbitfields, and hardware realism.

Loading...

Input

Expected Output

baudrate = 9 tx_enable = 1 rx_enable = 1 tx_irq_en = 1 rx_irq_en = 0 parity_en = 1 stop_bits = 0