Tutorial STM32 : #4 Belajar GPIO (Bab Output) – Bagian 1
Tutorial Mikrokontroler STM32 (Bagian ke 4)
Sebelumnya kita telah membuat program pertama hello world dengan membuat mikrokontroler STM32F103 mengeluarkan sinyal logika 1 dan 0 pada port PC13, sehingga LED builtin pada minimum system STM32F103C8T6 menyala berkedip – kedip.
Ibarat sebuah kota, Program hello world yang kita buat sebelumnya dalah pintu gerbang paling luar sebelum mulai masuk ke dalam kota ilmu STM32 yang rumit dan dipenuhi dengan labirin – labirin register – register dan arsitektur Cortex M3. Maka persiapkan kopi dan banyak camilan untuk mulai perjalanan panjang kita ini. halah..
Oke, sebelum saya membedah program hello world seperti yang dibahas pada tutorial sebelumnya, ada baiknya, kita memahami terlebih dahulu mengenai GPIO pada STM32F103, dan register -register yang terlibat khususnya fungsi output, (untuk fungsi input akan dibahas pada tulisan selanjutnya).
Sebagai sebuah standar konvensi penamaan fungsi GPIO, Port A disebut GPIOA, Bit 0 dari Port A disebut PA0 sedangkan Port B bit 2 disebut PB2. Terkadang anda akan menemui istilah GPIOx, itu bukan berarti Port X namun x dalam GPIOx hanya sekedar akronim dari nama port, misalkan GPIOA untuk Port A, GPIOB untuk B dan seterusnya.
Pembahasan kali ini cukup rumit, sehingga saya sarankan anda membaca reference manual sebagai bahan rujukan.
1. Clock Distribution
Dalam dunia embedded processor, konsumsi daya adalah masalah yang sangat penting, sehingga sebagaian besar prosesor canggih menyediakan mekanisme untuk mematikan resource apapun yang tidak diperlukan untuk aplikasi tertentu. STM32 memiliki sebuah jaringan distribusi clock yang rumit yang memastikan bahwa hanya peripheral yang diperlukan saja yang mendapatkan daya. Sistem ini disebut Reset and Clock Control (RCC) (silahkan baca selengkapnya pada subbab RCC Register di reference manual)
2. APB2 peripheral clock enable register
Pada pembahasan GPIO, ketika kita ingin menggunakan Port pada GPIO, maka perlu dilakukan pengaturan pada register RCC_APB2ENR (APB2 peripheral clock enable register ) seperti berikut
Misalkan, saya ingin menggunakan GPIOC maka kita perlu mengeset bit IOPCEN (pada bit 4) dengan logika 1.
3. Register GPIOx_CRL dan GPIOx_CRH
Berikutnya, kita perlu mengatur port GPIOC melalui Register GPIOx_CRL dan GPIOx_CRH yang masing – masing merupakan register 32 bit. GPIOx_CRL untuk pengaturan 8 bit port LSB. Sedangkan GPIOx_CRH untuk pengaturan 8 bit port MSB.
Dimana MODEy[1:0] disebut Port x Mode bits. (y adalah nilai bit port dari 0-15) yang merupakan pengaturan mode di tiap bit, apakah akan diigunakan sebagai input atau output. Berikut mode – mode yang digunakan:
01 : output mode, max speed 10 MHz
10 : output mode, max speed 2 MHz
11 : output mode, max speed 50 MHz
Sedangkan CNFy[1:0] disebut Port x configuration bits. Apabila pada pengaturan MODEy[1:0] sebelumnya, port diatur sebagai input maka, arti konfigurasi CNFy[1:0] adalah sebagai berikut :
01 : floating input (reset state)
10 : input with pull-up/pull-down
11 : reserved
Sementara apabila MODEy[1:0] dikonfigurasi sebagai output, maka konfigurasi arti CNFy[1:0] adalah :
01 : General Output Open-Drain
10 : Alternate Function Push-Pull
11 : Alternate Function Open-Drain
Sebentar, apa itu mode Push Pull dan Open Drain? Baik, saya akan jelaskan sedikit mengenai konfigurasi port keluaran Push Pull dan juga Open Drain
Mode Push Pull.
Sebuah keluaran push – pull pada prinsipnya memiliki kemampuan source dan sink current (sebagai sumber arus ataupun menyerap arus ). Topologi dari mode CMOS push-pull diilustrasikan dari gambar sebagai berikut.
C pada CMOS berarti Complementary karena M2 dan M3 adalah perangkat yang bersifat komplementer. M2 adalah PMOS, sedangkan M3 adalah NMOS. Karena mendapatkan sinyal yang sama, maka jika M3 ON, M2 akan berada pada posisi OFF, begitupula sebaliknya
Sedangkan istilah “open-drain” sebenarnya sudah cukup jelas bagi mereka yang sering bekerja dengan menggunakan MOSFET. Sebuah MOSFET memiliki tiga terminal yang disebut, gate, source dan drain. Pada konfigurasi open-drain, source di-ground-kan, gate di-drive secara internal, dan drain dibiarkan terbuka (alias open, tidak terhubung dengan apapun).
Sebuah keluaran open-drain hanya bisa memiliki kemampuan sink curret. Terdapat dua kondisi yang dikenal, low dan high – impedance. Ketika M1 berada pada posisi ON, keluaran akan diset 0 volt. Ketika M1 berada pada posisi off, keluaran tidak di-drive high ataupun low.
Pada sebagian besar aplikasi termasuk I2C, digunakanlah resistor pull-up eksternal pada keluaran open-drain. Penerapan lain yang berguna adalah ketika terdapat banyak perangkat yang men-drive satu pin interupt active low pada mikrokontroler
4. GPIO port output data register (GPIOx_ODR)
Setelah konfigurasi selesei diatur, kini saatnya mengatur logika nilai yang diberikan pada port – port yang dikehendaki. Untuk memberikan logika 1 atau 0 pada GPIO kita perlu men-set nilai pada register GPIOx_ODR,
ODR adalah register 16-bit read/write. Setiap bit merepresentasikan nilai keluaran pada pin – pin yang terkait. Misalkan kita mengeset nilai 0 pada bit 8 di register GPIOC_ODR. Hal ini mengindikasikan bahwa tegangan pada PC8 di-drive oleh mikrokontroler pada 0V (GND). Sementara mengeset nilai 1 pada pada bit 8 dari register GPIOC_ODR mengindikasikan bahwa tegangan pada PC8 di-drive oleh mikrokontroler pada nilai 3.3V (VDD)
Untuk mengeset nilai pada register ODR direkomendasikan menulis nilai secara keseluruhan port (16 bit) misalkan pada statement berikut
Statement tersebut mengubah kondisi setiap pin pada peripheral GPIOC dari nilai pada kondisi sebelumnya, ke nilai yang baru yaitu 0xF0FE (0b1111000011111110).
Namun jika hanya ingin mengeset nilai 1 pin tunggal (misalkan PC8) secara independen, tanpa ingin mengubah nilai yang lain. Kita bisa menggunakan metode bitmask seperti berikut
Sedangkan untuk men-clear-kan pin PC8 independen terhadap semua pin yang lain pada GPIOC, kita bisa mengunakan sebagai berikut :
Statement ini, biasa disebut dengan metode RMW (Read, Modify and write), karena statement ini mencangkup Read (membaca) Register ODR, OR(|) atau AND (&) yang memodifikasi (modify) dengan bit masking dan kemudian menuliskannya (write) kembali pada Register ODR. Statement tersebut dari ranah bahasa assembly, setidaknya memerlukan tiga instruksi mengeset /men-clear sebuah I/O yang secara signifikan akan memperlambat kecepatan dari perubahan data pada port.
5. GPIO port bit set/reset register (GPIOx _BSRR) dan GPIO port bit Reset Register (GPIOx_BRR)
16 bit LSB digunakan secara atomik mengeset nilai pin menjadi VDD sementara 16 bit MSB digunakan untuk secara atomik men-clear-kan nilai pin menjadi GND. Sehingga semisal jika kita ingin mengeset PC8 independen terhadap semua pin GPIOC yang lain, kita bisa menggunakan
atau
Untuk men-clear-kan PC8 independen terhadap semua pin GPIOC yang lain, kita bisa menggunakan
atau
Perhatikan, bahwa kedua skenario sederhana ini menggunakan operator penugasan (assignment) ‘=’ (atomik) yang lebih jarang digunakan daripada operator ‘|=’ atau ‘&=’. Perhatikan juga pada saat men-clear nilai pin PC8 menjadi GND, kita harus mengeset bit ke 24 pada BSRR (bit ke 8 dari 16 bit MSB).
Cukup membingungkan ya jika kita ingin men-clear-kan pin menggunakan BSRR. Namun ada cara yang paling mudah, yaitu menggunakan Register BRR ( Bit Reset Register ), dimana Register BRR memetakan 16 bit MSB register BSRR ke dalam register tersebut.
Jadi untuk men-clear-kan PC8 independen terhadap pin yang lain pada GPIOC, cukup digunakan
Sebenarnya ada beberapa register lagi yang terlibat ketika kita bermain dengan GPIO, seperti GPIOx_LCKR dan juga AFIO. Namun akan kita simpan dulu agar tidak terlalu muntah – muntah nanti dikarenakan terlalu berlarut larutnya pembahasan ini.
Setelah kita relatif paham dengan register yang terlibat, pada tulisan selanjutnya kita siap untuk mulai membedah fungsi – fungsi yang ada pada program hello world yang dibahas pada tutorial ke 3.
Salam Elektronika.
[…] ← Tutorial STM32 – 4 : Belajar GPIO (Bab Output) – Bagian 1 Mengendalikan Arduino via Aplikasi Web → […]