#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(®); // 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;
}
✅ This example bridges low-level C, bitfields, and hardware realism.
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