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 Register | Cakupan GPIO | Deskripsi Fungsi (Technical Description) |
| 0x00 | GPFSEL0 | GPIO 0 – 9 | Function Select 0: Mengatur mode pin (Input, Output, atau Alt Function). |
| 0x04 | GPFSEL1 | GPIO 10 – 19 | Function Select 1: Mengatur mode pin (Termasuk pin UART 14 & 15). |
| 0x08 | GPFSEL2 | GPIO 20 – 29 | Function Select 2: Mengatur mode pin. |
| 0x0C | GPFSEL3 | GPIO 30 – 39 | Function Select 3: Mengatur mode pin. |
| 0x10 | GPFSEL4 | GPIO 40 – 49 | Function Select 4: Mengatur mode pin. |
| 0x14 | GPFSEL5 | GPIO 50 – 53 | Function Select 5: Mengatur mode pin (Sisa 4 GPIO). |
| 0x18 | (Reserved) | – | Jeda Memori (Kosong) |
| 0x1C | GPSET0 | GPIO 0 – 31 | Output Set 0: Menulis logika 1 untuk menyalakan pin (Set High). |
| 0x20 | GPSET1 | GPIO 32 – 53 | Output Set 1: Menulis logika 1 untuk menyalakan pin (Set High). |
| 0x24 | (Reserved) | – | Jeda Memori (Kosong) |
| 0x28 | GPCLR0 | GPIO 0 – 31 | Output Clear 0: Menulis logika 1 untuk mematikan pin (Set Low). |
| 0x2C | GPCLR1 | GPIO 32 – 53 | Output Clear 1: Menulis logika 1 untuk mematikan pin (Set Low). |
| 0x30 | (Reserved) | – | Jeda Memori (Kosong) |
| 0x34 | GPLEV0 | GPIO 0 – 31 | Pin Level 0: Membaca status tegangan aktual pada pin (Input Read). |
| 0x38 | GPLEV1 | GPIO 32 – 53 | Pin Level 1: Membaca status tegangan aktual pada pin (Input Read). |
| 0x3C | (Reserved) | – | Jeda Memori (Kosong) |
| 0x40 | GPEDS0 | GPIO 0 – 31 | Event Detect Status 0: Menandai jika sebuah event (misal: tombol ditekan) telah terjadi. |
| 0x44 | GPEDS1 | GPIO 32 – 53 | Event Detect Status 1: Menandai jika sebuah event telah terjadi. |
| … | … | … | (Register deteksi tepi/edge detection dilewati untuk penyederhanaan) |
| 0x94 | GPPUD | Semua GPIO | Pull-up/down Enable: Menentukan jenis resistor internal (Off, Pull-Down, atau Pull-Up). |
| 0x98 | GPPUDCLK0 | GPIO 0 – 31 | PUD Clock 0: Mengaktifkan setting resistor (GPPUD) ke pin spesifik (0-31). |
| 0x9C | GPPUDCLK1 | GPIO 32 – 53 | PUD 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
1ke posisi tertentu akan membuat pin tersebut menjadi HIGH (3.3V). Menulis0tidak memberikan efek apa pun. - GPCLR (Clear): Menulis bit
1ke 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):
- Tulis jenis resistor (Off/Down/Up) ke register GPPUD.
- Tunggu 150 siklus clock.
- Tulis bit
1pada posisi GPIO yang diinginkan di register GPPUDCLK0/1. - Tunggu 150 siklus clock.
- Bersihkan (tulis
0) pada GPPUD dan GPPUDCLK untuk menyelesaikan proses.
