Referensi Teknis: Peta Fungsi GPIO (Function Select) pada Arsitektur BCM2835

Dalam pengembangan kernel bare metal pada Raspberry Pi (chipset Broadcom BCM2835), setiap pin GPIO memiliki kemampuan multiplexing. Artinya, satu pin fisik tidak hanya berfungsi sebagai saklar listrik sederhana (Nyala/Mati), tetapi dapat dialihfungsikan menjadi jalur komunikasi khusus seperti I2C, SPI, UART, atau PWM.

Pengaturan fungsi ini dikendalikan oleh register GPFSELn (GPIO Function Select). Karena setiap pin memiliki 8 kemungkinan mode operasi, arsitektur ini mengalokasikan 3 bit untuk setiap pin guna menampung kode konfigurasi tersebut ($2^3 = 8$ kombinasi).

Berikut adalah tabel lengkap kode biner yang digunakan untuk mengatur mode operasi pada register GPFSEL.

Tabel Kode Fungsi GPIO (FSEL)

Kode Biner (3-bit)Nilai DesimalMode OperasiDeskripsi Teknis
0000InputMode Default. Pin dalam keadaan High Impedance (Hi-Z). Digunakan untuk membaca sensor atau mendeteksi tegangan.
0011OutputMode Aktif. Pin dikendalikan sepenuhnya oleh register GPSET dan GPCLR. Digunakan untuk menyalakan LED, relay, atau mengirim sinyal logika.
1004Alternate Function 0Fungsi alternatif prioritas pertama (Contoh: UART TX/RX pada GPIO 14/15, I2C pada GPIO 2/3).
1015Alternate Function 1Fungsi alternatif kedua (Contoh: Jalur SPI pada beberapa pin).
1106Alternate Function 2Fungsi alternatif ketiga (Sering digunakan untuk fungsi legacy atau periferal sekunder).
1117Alternate Function 3Fungsi alternatif keempat.
0113Alternate Function 4Fungsi alternatif kelima.
0102Alternate Function 5Fungsi alternatif keenam (Contoh: PWM pada GPIO 18 biasanya menggunakan Alt 5).

Catatan Penting: Urutan nilai desimal untuk Alternate Functions tidak berurut secara linear (0, 1, 2, 3…). Perhatikan bahwa Alt 4 bernilai 011 (3) dan Alt 5 bernilai 010 (2). Kesalahan dalam menentukan kode biner ini dapat menyebabkan pin terhubung ke periferal yang salah.

Analisis Implementasi: Kasus GPIO 16

Untuk memahami penerapan tabel di atas, mari kita bedah kasus konfigurasi GPIO 16 menjadi mode Output.

  1. Lokasi Register:GPIO 16 diatur oleh register GPFSEL1 (yang menangani GPIO 10 s.d. 19).
  2. Lokasi Bit (Kavling):Di dalam GPFSEL1, GPIO 16 menempati bit ke-18, 19, dan 20.
    • Bit 20 (MSB)
    • Bit 19
    • Bit 18 (LSB)
  3. Target Mode:Berdasarkan tabel, mode Output memiliki kode biner 001.

Maka, kita harus memetakan kode 001 ke dalam posisi bit tersebut:

Bit Register201918
Nilai Target001

Inilah alasan matematis di balik instruksi bahasa C yang kita gunakan:

// Membersihkan konfigurasi lama (Reset ke 000)
*GPFSEL1 &= ~(7 << 18); 

// Mengisi dengan konfigurasi Output (Set ke 001)
*GPFSEL1 |= (1 << 18);

Operasi (1 << 18) secara spesifik mengirimkan angka 1 (dari kode 001) tepat ke posisi Bit 18, sehingga register mengenali permintaan mode Output untuk GPIO 16. Jika kita ingin menggunakan Alternate Function 0 (Kode 100), maka operasinya akan berubah menjadi (4 << 18) atau (1 << 20).