Referensi Lengkap Peta Register GPIO BCM2835 untuk Bare Metal Programming

Dalam pengembangan sistem operasi mandiri (Bare Metal Programming) pada Raspberry Pi, pemahaman terhadap Memory Mapped I/O adalah fondasi utama. Tidak ada driver sistem operasi yang membantu kita; kita berbicara langsung dengan perangkat keras melalui alamat memori.

Berikut adalah dokumentasi lengkap pemetaan register GPIO pada prosesor BCM2835 (Raspberry Pi 1 / Zero). Tabel ini mencakup fungsi dasar (Input/Output), mekanisme pembacaan status (Level), hingga pengaturan kestabilan sinyal (Pull-up/Down) yang krusial untuk komunikasi serial (UART).

Peta Register GPIO (GPIO Register Map)

Semua offset di bawah ini relatif terhadap GPIO Base Address (biasanya 0x20200000 pada BCM2835).

Offset (Hex)Nama RegisterCakupan GPIODeskripsi Fungsi (Technical Description)
0x00GPFSEL0GPIO 0 – 9Function Select 0: Mengatur mode pin (Input, Output, atau Alt Function).
0x04GPFSEL1GPIO 10 – 19Function Select 1: Mengatur mode pin (Termasuk pin UART 14 & 15).
0x08GPFSEL2GPIO 20 – 29Function Select 2: Mengatur mode pin.
0x0CGPFSEL3GPIO 30 – 39Function Select 3: Mengatur mode pin.
0x10GPFSEL4GPIO 40 – 49Function Select 4: Mengatur mode pin.
0x14GPFSEL5GPIO 50 – 53Function Select 5: Mengatur mode pin (Sisa 4 GPIO).
0x18(Reserved)Jeda Memori (Kosong)
0x1CGPSET0GPIO 0 – 31Output Set 0: Menulis logika 1 untuk menyalakan pin (Set High).
0x20GPSET1GPIO 32 – 53Output Set 1: Menulis logika 1 untuk menyalakan pin (Set High).
0x24(Reserved)Jeda Memori (Kosong)
0x28GPCLR0GPIO 0 – 31Output Clear 0: Menulis logika 1 untuk mematikan pin (Set Low).
0x2CGPCLR1GPIO 32 – 53Output Clear 1: Menulis logika 1 untuk mematikan pin (Set Low).
0x30(Reserved)Jeda Memori (Kosong)
0x34GPLEV0GPIO 0 – 31Pin Level 0: Membaca status tegangan aktual pada pin (Input Read).
0x38GPLEV1GPIO 32 – 53Pin Level 1: Membaca status tegangan aktual pada pin (Input Read).
0x3C(Reserved)Jeda Memori (Kosong)
0x40GPEDS0GPIO 0 – 31Event Detect Status 0: Menandai jika sebuah event (misal: tombol ditekan) telah terjadi.
0x44GPEDS1GPIO 32 – 53Event Detect Status 1: Menandai jika sebuah event telah terjadi.
(Register deteksi tepi/edge detection dilewati untuk penyederhanaan)
0x94GPPUDSemua GPIOPull-up/down Enable: Menentukan jenis resistor internal (Off, Pull-Down, atau Pull-Up).
0x98GPPUDCLK0GPIO 0 – 31PUD Clock 0: Mengaktifkan setting resistor (GPPUD) ke pin spesifik (0-31).
0x9CGPPUDCLK1GPIO 32 – 53PUD Clock 1: Mengaktifkan setting resistor (GPPUD) ke pin spesifik (32-53).

Penjelasan Detail Kelompok Register

Untuk memahami cara kerja tabel di atas, berikut adalah rincian fungsi dari masing-masing kelompok register:

1. Function Select (GPFSEL0 – GPFSEL5)

Sebelum pin bisa digunakan, kita harus menentukan “peran”-nya. Apakah dia bertindak sebagai Output (untuk menyalakan LED) atau Input (untuk membaca tombol).

  • Setiap GPIO menggunakan 3-bit konfigurasi.
  • Nilai 000 = Input (Default).
  • Nilai 001 = Output.
  • Nilai 100 = Alternate Function 0 (Contoh: Mengaktifkan UART pada GPIO 14/15).

2. Output Control (GPSET & GPCLR)

Raspberry Pi menggunakan mekanisme atomic bit-set/clear. Ini lebih aman daripada metode standar Read-Modify-Write.

  • GPSET (Set): Menulis bit 1 ke posisi tertentu akan membuat pin tersebut menjadi HIGH (3.3V). Menulis 0 tidak memberikan efek apa pun.
  • GPCLR (Clear): Menulis bit 1 ke posisi tertentu akan membuat pin tersebut menjadi LOW (0V).

3. Input Level (GPLEV)

Register ini adalah “mata” dari mikrokontroler.

  • Register ini bersifat Read-Only (Hanya Baca). Jangan pernah menulis ke alamat ini.
  • Jika bit bernilai 1, berarti ada tegangan masuk (High/3.3V).
  • Jika bit bernilai 0, berarti tidak ada tegangan (Low/Ground).

4. Internal Resistor Control (GPPUD & GPPUDCLK)

Ini adalah bagian terpenting untuk menjaga stabilitas sinyal, terutama saat menggunakan protokol komunikasi seperti UART atau I2C agar sinyal tidak floating (mengambang).

Berbeda dengan register lain, pengaturannya membutuhkan urutan waktu (sekuensi):

  1. Tulis jenis resistor (Off/Down/Up) ke register GPPUD.
  2. Tunggu 150 siklus clock.
  3. Tulis bit 1 pada posisi GPIO yang diinginkan di register GPPUDCLK0/1.
  4. Tunggu 150 siklus clock.
  5. Bersihkan (tulis 0) pada GPPUD dan GPPUDCLK untuk menyelesaikan proses.