STM32 GPIO Ayarlarını Anlama


41

STM32 Standart Çevre Birimi kütüphanesinde GPIO'yu yapılandırmamız gerekiyor.

Ancak bunları nasıl yapılandıracağımdan emin olmadığım 3 fonksiyon var;

  • GPIO_InitStructure.GPIO_Speed
  • GPIO_InitStructure.GPIO_OType
  • GPIO_InitStructure.GPIO_PuPd

In GPIO_Speed , seçim yapmak için 4 ayar vardır

GPIO_Speed_2MHz  /*!< Low speed */
GPIO_Speed_25MHz /*!< Medium speed */
GPIO_Speed_50MHz /*!< Fast speed */
GPIO_Speed_100MHz

Hangi hızdan seçeceğimi nasıl bilebilirim? Yüksek hız veya düşük hız kullanmanın herhangi bir avantajı veya dezavantajı var mı? (örneğin: güç tüketimi?)

In GPIO_OType , seçim yapmak için 2 ayar vardır

GPIO_OType_PP // Push pull
GPIO_OType_OD // Open drain

Hangisini seçeceğinizi nasıl bilebilirim? ve açık tahliye ve itme çekme nedir?

In GPIO_PuPd , seçim yapmak için 3 ayar vardır

GPIO_PuPd_NOPULL // No pull
GPIO_PuPd_UP     // Pull up
GPIO_PuPd_DOWN   // Pull down

Bu ayarların ilk basma çekimi ayarıyla ilgili olduğunu düşünüyorum.


İlgili: AVR / Arduino, PIC, vb. Gibi doğal olarak desteklemeyen mikro denetleyicilerdeki "açık boşaltma" modunu açıkça zorlamak: elektronik.stackexchange.com/a/354993/26234
Gabriel Staples

Yanıtlar:


45
  • GPIO_PuPd (Yukarı Çekme / Aşağı Çekme)

    Dijital devrelerde, sinyal hatlarının asla "yüzmesine" izin verilmemesi önemlidir. Yani, her zaman yüksek veya düşük bir durumda olmaları gerekir. Yüzerken, durum saptanmaz ve birkaç farklı soruna neden olur.

    Bunu düzeltmenin yolu, sinyal hattından Vcc veya Gnd'ye bir direnç eklemektir. Bu şekilde, çizgi aktif olarak yüksek veya düşük sürülmüyorsa, direnç potansiyelin bilinen bir düzeye kaymasına neden olur.

    ARM (ve diğer mikrodenetleyiciler) bunu yapmak için yerleşik devrelere sahiptir. Bu şekilde, devrenize başka bir parça eklemeniz gerekmez. Örneğin, "GPIO_PuPd_UP" öğesini seçerseniz, sinyal hattı ile Vcc arasına bir direnç eklemeye eşdeğerdir.

  • GPIO_OType (Çıkış Tipi):

    Push-Pull: Bu, çoğu kişinin "standart" olarak düşündüğü çıktı türüdür. Çıkış düşük olduğunda, aktif olarak toprağa "çekilir". Tersine, çıkış yüksek olarak ayarlandığında, aktif olarak Vcc'ye doğru "itilir". Basitleştirilmiş, bu gibi görünüyor:

    itme çekme

    Bir Açık Tahliye çıkışı, diğer taraftan, yalnızca bir yönde aktiftir. Pimi zemine doğru çekebilir, ancak yukarı doğru süremez. Önceki görüntüyü, ancak üst MOSFET'in olmadığını düşünün. Toprağa çekmediğinde, MOSFET iletken değildir, bu da çıkışın yüzmesine neden olur:

    Açık drenaj

    Bu tür bir çıkış için, devreye alınmadığında hattın yükselmesine neden olacak, devreye eklenmiş bir direnç direnci olması gerekir. Bunu harici bir parça ile veya GPIO_PuPd değerini GPIO_PuPd_UP olarak ayarlayarak yapabilirsiniz.

    İsim, MOSFET'in drenajının dahili olarak hiçbir şeye bağlı olmamasından kaynaklanıyor. Bu tür bir çıktıya MOSFET yerine BJT kullanılırken "açık kollektör" adı verilir.

  • GPIO_Speed

    Temel olarak, bu çıkış sinyalinin dönüş hızını (yükselme zamanı ve düşme zamanı) kontrol eder. Çevirme hızı ne kadar hızlı olursa, devreden o kadar fazla gürültü yayılır. Çevirme hızını yavaş tutmak ve sadece belirli bir nedeniniz varsa, arttırmak iyi bir uygulamadır.


Teşekkürler! büyük cevap için;), değişken durumdayken farklı problemleri biraz daha açıklar mısınız?
Tim

3
Buradaki fikir, bir ara giriş geriliminde herhangi bir süre boyunca ikamet etmenin, bir giriş bloğundaki hem üst hem de alt FET'leri kısmen açabilmesi ve aralarındaki güç kaynağını kısmen kısabilmesi, aşırı güç tüketimi ya da (özellikle ağır durumlarda) ) potansiyel hasar.
Chris Stratton

@Tim Evet, Chris Stratton az önce ne dedi :)
bitsmack

3
@Tim Ayrıca, hatlar yüzdüğü zaman, voltaj seviyelerini bozmak çok kolaydır. Sadece devre etrafında elini sallayarak ... çünkü kapasitif etkileşimlerin, giriş durumunu değiştirebilir
bitsmack

1
@Tim Gerçekten uygulamaya bağlı. Bir anahtar (veya düğme) okuyorsanız, o zaman gerçekten önemli değil. Diğer bileşenlerle arayüz oluşturuyorsanız, arayüze bağlıdır. Örneğin, SPI iletişiminde, CS hattı aktif düşüktür. Bu durumda, çekme direncini istersiniz, böylece CS asla istemeden düşmez. Her zaman aktif olarak bir mikrodenetleyici ile hattı sürecek olursanız, bunun gereksiz olduğunu düşünebilirsiniz. Peki ya mikrodenetleyici başlatılmadan önce? Ya sıfırlarsa?
Yükseltme

5

GPIO Speed, GPIO'nun üretebileceği maksimum frekanstır. Düşük ayarlar güç tasarrufu sağlayabilir.

Çıkış tipi, pimin yükselip alçaldığını (itme çekme) veya çıkışın drenajdaki pime tutturulmuş bir FET'in kapısını açıp açmadığı (Açık tahliye). Bir otobüsü diğerlerinden kısa devre olmadan kısa bir süre boyunca çekmek için takılı bir pime ihtiyacınız varsa, bu uygun olabilir.

Yukarı çekme dirençleri, pim çıkışını güç rayına bağlar ve aşağı doğru çekerek rezistörden toprağa bağlar. Bu, diğer şeylerin yanı sıra, bit yüksek empedans durumunda olsa bile pimin voltajını kontrol eder. Dijital giriş değerini değiştirmek için spot anahtar kullanmak gibi şeyler yapmak önemlidir. Anahtar açık olsa bile, giriş tahmin edilebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.