Gömülü bir işlemcide neden önce GPIO'nun değerini ve ardından yönünü ayarlamam gerekiyor?


16

Yazılım mühendisi olarak tam zamanlı bir işim var. Yakın zamanda GPIO yapılandırmalarını gözden geçirme ve ayarları gerektiği gibi değiştirme görevim verildi. Yanlış yapılandırılmış birkaç pim buldum, doğal olarak onları yeniden yapılandırdım, ancak yanlış sırayla yaptığım söylendi. İşte bahsettiğim şey:

Önce:
GPIO1.direction = INPUT;

Sonra:
GPIO1.direction = ÇIKIŞ;
GPIO1.değer = 0;

Ancak kod inceleme sırasında başlatma sırasını aşağıdaki şekilde değiştirmeniz gerektiği söylendi:

GPIO1.değer = 0;
GPIO1.direction = ÇIKIŞ;

Başka bir deyişle, önce değeri ve sonra da pimin yönünü ayarlayın. Aynı zamanda modern işlemcilerde böyle olması gerektiği söylendi çünkü biri giriş, diğeri çıkış için iki kayıt kullanıyorlar, ancak eski işlemciler yalnızca bir kayıt kullanıyor, bu nedenle işlem sırası önemli değil.
(Not: Modern = ARM Cortex M3 ve üstü, Eski = Intel 8051)

İş yerinde daha iyi bir açıklama istedim, ancak iyi bir cevap alamadım. Bu yüzden burada sormaya karar verdim.

Sorularım işte burada:

  1. Başlatma sırası yeni işlemcilerde neden önemlidir?
  2. Başlatma sırası eski işlemcilerde neden önemli değil?
  3. Modern işlemcilerde hangi iki kayıttan bahsediyorlar?
  4. Eski işlemcilerden hangi tek kayıttan bahsediyorlar?

Birisi bir çeşit diyagram sağlayabilirse, bu daha da iyi olurdu.


1
"Modern" ve "Eski" işlemciler faydalı bir cevap vermek için çok belirsiz. Farklı mimarilerin farklı kayıt ayarları vardır; hangileri hakkında konuştuğunuzu bilmeden, onlara akıllıca yorum yapmanın bir yolu yoktur.
Nick Johnson

@ IgnacioVazquez-Abrams Hayır, pek değil. Odada çok deneyimli mühendisler vardı, eğer benim yolumda yapılırsa hatta aksaklıklar yapacağınızı söyledi.
Flashburn

@NickJohnson Modern = ARM Cortex M4 ve üstü, Eski = Intel 8051.
flashburn

@BrianDrummond LOL. Çok güzel bir açıklama. Peki ya eski işlemciler, örneğin 8051. Bu neden onlar için önemli değil?
Flashburn

2
Q4'ün bir veri sayfası bağlantısıyla yanıtlaması daha kolay olacaktır.
pjc50

Yanıtlar:


22

Orijinal 8051 sözde çift yönlü çıkış portları (pullups ile açık tahliye) kullandı, bu yüzden gerçekten port yönü ayarı yoktu.

Elbette modern gerçek çift yönlü çıkış portları için port pinini çıkış için etkinleştirmeden önce bilinen bir değere sahip olmak daha iyidir, aksi takdirde çıkışta istenmeyen bir şey yapabilen geçici bir süre olabilir.

Örneğin cevabımı buraya bakın .

Düzenleme: İşte (nispeten) modern bir CMOS mikrodenetleyici için I / O pin yapısı :

resim açıklamasını buraya girin

TRIS (TRIState) diğer birçok mikroda DDR (Veri Yön Kaydı) olarak adlandırılır. Bu durumda, TRIS mandal çıkışı yüksekse, her iki transistör de 'kapalı' olur, ancak bağlantı noktası hala okunabilir.

İşte daha yeni bir Microchip mikro için biraz daha karmaşık I / O pin yapısı .

resim açıklamasını buraya girin

Yine, TRIS mandalı çıkışı devre dışı bırakır. Bu, okuma-değiştirme-yazma sorunlarından kaçınmaya yardımcı olan bir LAT mandalını içerir . PIC serisinde sadece LAT kaydına yazmalısınız (ve PORT kaydından okumalısınız).

İşte orijinal 8051 ve CMOS 8051 klasik I / O port pin iç devresi ( bu kaynaktan ):

resim açıklamasını buraya girin

Harici kapasitansın üstesinden gelmek için kısa bir süre açılan çekime paralel olarak bir hızlandırma transistörünün olması biraz ekstra karmaşıklıktır. Gördüğünüz gibi hiç TRIS / DDR kontrolü yok. Normal çalışmada kullanılan pull-up MOSFET'ler 'zayıf' - pime bağlı harici bir çıkışın sahte çift yönlü bağlantı noktası hattını aşağı çekebileceği kadar küçüktür (düşük Ids).


Açıklama için teşekkürler. Bir süredir donanım ile çalışmadım, bu yüzden bir açıklamadan açıklamayı anlamakta zorlanıyorum. Görüntü sağlamayı düşünür müsünüz? Pin yapılandırma donanımının modern bir işlemcide nasıl görüneceğini ve 8051'de nasıl göründüğünü söyle? Gerçekten minnettar olurum.
Flashburn

Donanımla ne demek istiyorsun? Çipin dahili GPIO devresi?
Spehro Pefhany

Bu doğru. Bir çeşit diyagram gerçekten yardımcı olacaktır.
Flashburn

16

Önce yönü ayarlarsanız, pim mevcut çıkış değeri ne olursa olsun çıkış için kısa bir süre yapılandırılacaktır. Önce değeri ayarlarsanız, bu gerçekleşmez.

Bu nedenle, önerildiği şekilde yapmak, pimin ne bağlı olduğuna bağlı olarak, zararsızdan felakete kadar değişebilen çıktıdaki aksaklıkları önler.


Teşekkürler. Peki eski işlemciler için bu neden onlar için önemli değil? Eski = Intel 8051
flashburn

8051'e aşina değilim. Meslektaşlarınızın söylediklerine dayanarak, eğer aynı kayıt hem yönü hem de değeri yapılandırırsa, derleyici iki yazıyı bire optimize edecek.
Nick Johnson

2
muhtemelen eski işlemciler için bu "yeni" yolu yukarıdaki nedenlerden dolayı yapmak hala iyi bir alışkanlık olacaktır. Farklı işlemciler farklı gereksinimlere sahip olabilir, farklı satıcılar diğerlerinden daha iyi öneri verebilir ve farklı şirketler / işverenler / ekipler bu tür ayrıntılar hakkında farklı politikalara sahip olabilir.
billt

2
gerçekten ... her zaman DIO'nun kıyametin doom lazerine bağlı olduğunu varsayalım;)
Michael

4

Varsayılan yönün bir giriş olduğu varsayılırsa (yani, MCU'nun bağlı hatlarda herhangi bir değeri zorlamasını istemediğimiz için mantıklıdır), bağlantı noktasını kurma sırası tercih edilir, ancak gerekli değildir. Başvurunuz zaman aslında gerekli olduğunu gerektirir limanın değeri olmayacaktır başlangıçta, demek ki 1. Sonra değeri olarak ayarlayacak 0ve sonra yönü değiştireceksiniz. Bu durumda, yön ve değer arasında olası bir “aksaklık” oluşmasını önlersiniz, bu da bu pim üzerinde bir sivriye neden olabilir. Ve sadece yenilerini değil, böyle bir mantığı olan tüm işlemciler için doğrudur.

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.