Advertisement

Tutorial STM32 : #4 Belajar GPIO (Bab Output) – Bagian 1

Tutorial Mikrokontroler STM32 (Bagian ke 4)

1 8.798

stm1-520x190Sebelumnya 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

watermarked-gpio1

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.

GPIOx_CRL
GPIOx_CRL
GPIOx_CRH
GPIOx_CRH

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:

00 : input mode (reset state)
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 :

00 : analog mode
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 :

00 : General Output Push-Pull
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.

watermarked-pushpull

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

Open-Drain

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,

watermarked-gpio5

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

GPIOC->ODR = 0xF0FE

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

GPIOC->ODR |= 0x00000100; //( 0b00000000000000000000000100000000)

Sedangkan untuk men-clear-kan  pin PC8 independen terhadap semua pin yang lain pada GPIOC, kita bisa mengunakan sebagai berikut :

GPIOC->ODR &= ~(0x00000100); //( 0b00000000000000000000000100000000)

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)

Ada cara yang lebih baik selain menggunakan metode RMW, yaitu menggunakan register BSRR dan register BRR untuk mengeset dan men-clear-kan pin. Register tersebut mengaktifkan  akses atomik yang memungkinkan pin I/O untuk di-clear atau di-set dengan waktu yang secepat mungkin.

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

GPIOC->BSRR = 0x00000100;//( 0b00000000000000000000000100000000)

atau

GPIOC->BSRR = (1<<8);

Untuk men-clear-kan PC8 independen terhadap semua pin GPIOC yang lain, kita bisa menggunakan

GPIOC->BSRR = 0x01000000; //( 0b00000001000000000000000000000000)

atau

GPIOC->BSRR = (1<<24);

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.

watermarked-gpio7

Jadi untuk men-clear-kan PC8 independen terhadap pin yang lain pada GPIOC, cukup digunakan

 GPIOC->BRR = (1<<8);

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.

Baca juga tulisan tentang #Tutorial Mikrokontroler STM32 atau tulisan menarik lainnya di kategori Mikrokontroler  ARM 32 bit
1 Komentar
  1. […] ← Tutorial STM32 – 4 : Belajar GPIO (Bab Output) – Bagian 1 Mengendalikan Arduino via Aplikasi Web → […]

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses.

%d blogger menyukai ini: