GPIO Ayarlamaları Mantığı
Bazı Terimler
- High-Z ve Floating: Bir sinyalin durumu belirsiz iken biz bu duruma floating deriz. Pinlerde bu durum, ne güç kaynağına ne de toprağa bağlı olan pinler için kullanılır. Girdiden ne geleceği belli değildir. High-Z durumu ile eşdeğerdir.
- Pull-up ve Pull-down: Pinin dünyaya bakan çıkışında duran, pull-up kısmında bir direnç ile güç kaynağı, pull-down kısmında ise bir direnç ile toprak bağlantısı vardır. Bu iki kol da asıl pine bağlı değildir. Pull-down modu ayarlandığında toprağın direnci bağlanır, pull-up modu ayarlandığında güç kaynağının direnci bağlanır.
- Current sink: MCU'nun içine pinin dünyaya bakan ucundaki devreden akım gelmesidir.
- Current source: MCU'nun içinden pinin dünyaya bakan ucundaki devreye bir akım gitmesidir.
Output Modları
Bir pini output ayarlamak istiyor isek iki bağlantı tipimiz bulunmaktadır. Bunlar push-pull ve open-drain modlarıdır.
Referans kılavuzundan da göreceğiniz üzere pinin "output" bağlantısında bir modifiyeli CMOS vardır. CMOS'un hemen önünde ise aslında bir inverter bulunur. Bizler output'a registerlar aracılığı ile HIGH
sinyali verdiğimizde, inverter onu LOW
a çevirir. PMOS'un önündeki inverter bunu tekrar HIGH
a çevirdiği için PMOS aktive edilir. Güç kaynağından pinin çıkışına doğru voltaj verilir. NMOS kısmında ise inverter olmadığı için alınan sinyal LOW
dur. Bu yüzden NMOS aktive edilmez, toprak bağlantısı yoktur. Aynı olayda registerlar ile LOW
verdiğimizde ise işlemin tersi gerçekleşir. Bu olayların mümkün olduğu, gerçekleştiği ayara push-pull modu denilir.
Aynı devredeki CMOS'un PMOS ayağının bağlantısının yok olmasına ise open-drain modu denir. Registerlar ile verilen LOW
sinyali inverterdan geçip HIGH
a dönüşür. Artık ortada PMOS da olmadığı için sinyal direk olarak NMOS'a gider. NMOS'u aktive eder ve dışarıya bakan pini toprağa bağlar. Ancak aynı hikayeyi HIGH
ayarlanan register ile hayal edersek bir sorunla karşılaşırız: NMOS aktive edilmemiştir ve ortada PMOS yoktur. Bu da aslında pinin dünyaya bakan ucunda hiçbir şekilde bir voltaj varlığı belirtisi yok demektir, belki biraz gürültü sinyali dışında.
Open-drain modunda çıktıdan HIGH
okuyabilmemiz için iki yol bulunmaktadır. Bu yollardan biri pull-up modunu aktive etmek ve bu sayede $V_{dd} = 5V$'u çıkışa vermektir. Ancak bunu yaptığımızda göreceğimiz üzere, pull-up direncinin direnci çok yüksek olduğu için (40k$\Omega$) dışarıya verilecek akım çok küçük seviyede olacaktır. Genelde bu yöntem tercih edilmez. Bunun yerine dışarıdan bir pull-up direnci ve güç kaynağı kullanılır. Pinin dünyadaki ucuna bağlanan kısma bir güç kaynağı ve direnç seri olarak bağlanır. Bu bağlantıya ek olarak ise asıl devremiz eklenir. T şeklinde bir bağlantı görmeniz gerekiyor. T'nin üstteki yatay çizgisini asıl devrenin pine bağlantısı olarak düşünebiliriz ve T'nin dikey çizgisini ise güç kaynağımız ve direncimiz olarak düşünebiliriz. Bu sayede HIGH
verdiğimizde topraklama olmayacak (ek bir güç kaynağı da verilmeyecek) ve dışarıdan eklediğimiz güç kaynağımız paşa gibi devremize enerji aktaracaktır. LOW
verdiğimizde ise NMOS'umuz açılacak ve dışarıdaki güç kaynağımız direk olarak toprağa bağlanacaktır. Devremizi beslemeyecektir.
Output Ek:
- STM32 için GPIO port output speed register diye bir yazmaç bulunmaktadır. Bu yazmacın amacı slew rate frekansını belirlemektir.
HIGH
danLOW
a (veya tersi) geçme süresini bu yazmaç ile belirleriz. Bu sürenin çarpıma göre tersinin alınması ile elde edilen değere slew rate adı verilir. - Pull-down veya pull-up'ı aktive etmek için STM32 için GPIO port pull-up/pull-down register adlı yazmacı kullanabilirsiniz.
- Yine STM32'de GPIO port output data register kullanarak çıktıda vereceğiniz durumu (
HIGH
ya daLOW
) belirleyebilirsiniz. Referans Klavuzundan fark edebileceğiniz üzere bu yazmaç hem okuma hem yazma yetkisine sahiptir. Bu yüzden okuma da yapabilirsiniz. Buna ek olarak bir pinOUTPUT
ayarlansa daINPUT
kolu kapanmaz. Okumaya devam eder. Bu da pine ayarladığınız değerin ne olduğunu GPIO port input data register ile okuyabilirsiniz demek oluyor.
Input Modları
Inputta öğrenebildiğim kadarı ile iki mod bulunuyor. Bunlar, kullanılması önerilmeyen floating ve pull-up modlarıdır.
Floating modu, direk olarak pine bir devrenin bağlanması ve inputtan veri okunmasıdır. Bir pini INPUT
olarak ayarladığımızda output yolunun bağlantısı kesilse dahi bir gürültü oluşma ihtimali her zaman vardır. Bu gürültü, eğer ki pinin çıkışındaki devreden bir sinyal gelmiyor ise veri olarak işlenir ve bizi kandırır. Bu yüzden ki eğer pinden bazı zamanlarda veri alınmayacağı olursa, bu mod kullanılmamalıdır.
Diğer mod ise pull-up'ı aktive ettiğimiz durumdur. Bu durumda dışarıdaki devre toprak olduğu zaman güç kaynağımızdan ona doğru bir akım geçişi olur ve aynı şekilde varlığından şüphe ettiğimiz gürültü yine bu şekilde toprağa doğru yol alır. Input yolunda kesinlikle bir akım oluşmaz. Eğer ki dışarıdaki devre bir toprak değil de başka bir şeyse, örneğin bir güç kaynağı, giriş yoluna gele voltaj pull-up ayarı sayesinde $V_{dd} \pm V_{out}$ olacaktır. Öyleyse kısaca söyleyebiliriz ki pull-up modunda eğer girdimiz toprak ise bunu LOW
olarak okuruz, girdimiz başka bir şey ise HIGH
olarak okuruz.
Inputa Ek:
- STM32'de inputtan gelen veriyi GPIO port input data register aracılığı ile okuyabiliriz.
Anlattıklarımı gözünüzde canlandırabilmeniz için şu şematiğe bakabilirsiniz. İlgili şematik, STM32 Nucleo kartlarından birinin referans klavuzundan alınmıştır.
Referanslar ve İleri Okuma
- Terimleri adlarını buradan çaldım. https://embeddedartistry.com/blog/2018/06/04/demystifying-microcontroller-gpio-settings/
- Bu blogu çok seviyorum, bir göz atın derim. https://blog.stratifylabs.co/device/2013-10-21-Understanding-Microcontroller-Pin-Input-Output-Modes/
- Pull-up ve Pull-down dirençlere biraz daha detaylı bakış sunmuş. https://blog.stratifylabs.co/device/2013-10-25-Using-Pull-Up-and-Pull-Down-Resistors/
- Wikipedia'sız referanslar olmaz, dediler. https://en.wikipedia.org/wiki/High_impedance
- Size Türkçesini hazırlamak istediğim makale kalitesinin aynısını burada buldum. Eğer daha iyi anlamak isterseniz İngilizce olan şu makaleyi okumanızı tavsiye ederim. http://makerholik.com/embedded-system/different-microcontroller-gpio-settings/