İçindekiler:
- Adım 1: Pinler ve Pinler….Kod Neden Çalışmıyor?
- Adım 2: Bazı Pinleri "tanımlayalım"…
- Adım 3: PinMode()…Pinlerinizi Nasıl Kullanacaksınız…
- Adım 4: AnalogWrite() ve PwmWrite()…2 Aromada Analog Çıkış
- Adım 5: STM32 Seri Haberleşme
- Adım 6: Mikrodenetleyiciye Değer Geçirme
- 7. Adım: Ve Üç Rakam Yazmak İstersem…. ya da Daha Fazlası??
2025 Yazar: John Day | [email protected]. Son düzenleme: 2025-01-23 15:13
STM32duino önyükleyicisinin veya diğer benzer belgelerin nasıl yüklendiğini açıklayan talimatlarımı zaten okuduysanız, yükleme kodu örneğini denersiniz ve….hiçbir şey olmayabilir.
Sorun şu ki, "Genel" STM32 için tüm örnekler olmasa da çoğu, kutudan çıktığı gibi çalışmayacaktır. STM32 "Mavi Hap" tahtanızda çalışmak için küçük değişiklikler gerekli olacaktır.
Neyin değişmesi gerektiğini ve nedenini açıklamak için 4 kod örneği seçeceğim. Kodlar: "BlinkWithoutDelay", "Fading", "Dimmer" ve "AnalogInSerial".
Not Ben hiçbir şey kodlamadım. Sadece aşağıdakiler tarafından oluşturulan kodlarda küçük değişiklikler yapıyorum:
David A. Mellis ve Tom Igoe, Marti Bolivar ve bazı durumlarda Scott Fitzgerald tarafından geç değiştirildi
Tom Igoe ve Bryan Newbold tarafından geç değiştirildi
Bu yüzden, yarattığım krediyi koruyarak, değiştirdiğim kodlarda bile yazar adlarını tutmayı tercih ediyorum.
Adım 1: Pinler ve Pinler…. Kod Neden Çalışmıyor?
STM32 "Mavi Hap" pin çıkışına bir göz atalım. Not pinleri, PA1 veya PC2 olarak tanımlanır… buna benzer bir şey.
Örneğin, "BlinkWithoutDelay" kod örneğine bakarsanız, pin "33" olarak bildiriliyor…. Neden?
Bunun nedeni Bay Marti Bolivar'ın bu kodu MAPLE panosu için taşıması olduğundan şüpheleniyorum.
Sanırım "Blue Pill" panolarına uyumlu kod izin verme niyeti değildi.
Maple ve Maple mini kart pinleri, Arduino gibi sayısal olarak bildirilir, ancak 33, 24 ve bunun gibi bazı sayılar kullanırlar.
Kod çalışmıyor dedim? Benim hatam. Kod hatasız derlenir ve "Blue Pill"e doğru şekilde yüklenir, bu yüzden bence gerçekten çalışıyor, ancak bir GPIO çıktısı kullanmasını beklemiyoruz. Hatta mevcut olmayabilir.
Beklendiği gibi çalışması için kodda çok az değişiklik yapılması gerekiyor.
Adım 2: Bazı Pinleri "tanımlayalım"…
Kaynakları kolay tanımlanabilen veya değişkenleri veya sabitleri ifade eden iyi bir kod uygulamasıdır. Kodlamanızı daha kolay anlamanızı ve sorun gidermenizi sağlar.
Arduino pinlerini şöyle beyan ettim:
…
const int ledPin =13;
…"
Benden hoşlanıyorsanız, belki kendinize şunu soruyorsunuzdur: "PC13 gibi isimlere sahip pinleri nasıl ilan edebilirim???"
Cevap: "#define" C ifadesini kullanın.
Yani, pinout çekilişine göre, PC13, "BluePill" de yerleşik LED'imize sahip olduğumuz pindir. Bunu kullanmak için, kitaplık tanımından hemen sonra (#include…) ve her şeyden önce şöyle beyan ederim:
…
#define LedPin PC13
…"
";" YOKTUR. satır sonlandırma, NOR "=" ataması.
Her iki kodu da karşılaştırın. Biri IDE'den yüklenen orijinal örnektir. İkincisi, "BluePill" ile çalışmak için biraz ayarladım.
Kodda kullanmayı düşündüğünüz tüm pinleri bildirmenizi şiddetle tavsiye ederim. ADC girişi olarak kullanmayı düşünenler bile (bunun hakkında daha fazla bilgi daha sonra).
Bu hayatınızı kolaylaştıracaktır.
Adım 3: PinMode()…Pinlerinizi Nasıl Kullanacaksınız…
Devam etmeden önce PinMode() fonksiyonunu anlayalım.
Arduino gibi, STM32 pinlerinin birden fazla işlevi vardır. Birini veya diğerini seçmenin en basit yolu pinMode() deyimini kullanmaktır.
Arduino'nun yalnızca 3 modu vardır, INPUT, OUTPUT veya INPUT_PULLUP.
STM32 ise pinMode()'un birçok çeşidine sahiptir. Onlar:
ÇIKIŞ -Temel dijital çıkış: Pin YÜKSEK olduğunda voltaj +3.3v (Vcc)'de tutulur ve DÜŞÜK olduğunda toprağa çekilir
OUTPUT_OPEN_DRAIN -Açık tahliye modunda pin, toprağa akım akışını kabul ederek "düşük" ve empedans artışı sağlayarak "yüksek" gösterir
INPUT_ANALOG -Bu, pinin analog (dijital değil) okumalar için kullanılacağı özel bir moddur. Pindeki voltaj üzerinde ADC dönüşümünün yapılmasını sağlar
INPUT_PULLUP -Bu moddaki pinin durumu, INPUT ile aynı şekilde rapor edilir, ancak pin voltajı +3.3v'a doğru hafifçe “yukarı çekilir”
INPUT_PULLDOWN -Bu moddaki pinin durumu, INPUT ile aynı şekilde rapor edilir, ancak pin voltajı yavaşça 0v'a doğru "aşağı çekilir"
INPUT_FLOATING - INPUT ile eşanlamlıdır
PWM -Bu, pinin PWM çıkışı için ne zaman kullanılacağına ilişkin özel bir moddur (dijital çıkışın özel bir durumu)
PWM_OPEN_DRAIN -DÜŞÜK ve YÜKSEK alternatif döngüleri yerine PWM gibi, pim üzerindeki voltaj DÜŞÜK ve yüzer (bağlantısız) alternatif döngülerden oluşur
(not: https://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/lang/api/pinmode.html#lang-pinmode adresinden alınmıştır)
Bu parantezi açıyorum çünkü kendi kodunuzu oluşturmaya başladığınızda ihtiyacınıza göre doğru pinMode() kullanmaya dikkat edin.
Adım 4: AnalogWrite() ve PwmWrite()…2 Aromada Analog Çıkış
"Mavi Hap" GPIO pinlerini kullanmadan önce davranışını, yani nasıl çalışacağını beyan etmek gerekir. pinMode() işlevinin yaptığı tam olarak budur.
Şimdi bir analog çıkışın ne kadar doğru ayarlandığına odaklanalım. ÇIKIŞ modu veya PWM modu olarak bildirilebilir.
Aynı şekilde, Analog değerler GPIO'ya 2 şekilde atfedilebilir: analogWrite() veya pwmWrite(), AMA, analogWrite() sadece pinMode()= OUTPUT ise çalışır. Diğer yandan, pwmWrite() yalnızca pinMode()=PWM ise çalışır.
PA0'ı ele alalım, örneğin: bu bir analog/pwm çıkış adayıdır.
analogWrite(): bu şu şekilde bildirir:
….
#define ledPin PA0
pinMode(ledPin, OUTPUT);
analogWrite(ledPin, < sayı >);
……"
Arduino gibi sayı 0 ile 255 arasında olmalıdır. Aslında, Arduino ile geriye dönük uyumludur.
pwmWrite(): şu şekilde bildirin:
…
#define ledPin PA0
pinMode(ledPin, PWM);
pwmWrite(ledPin, < sayı.>);
…."
Sayının 0 ~ 65535 arasında olması gerektiğinde, Arduino'dan çok daha yüksek bir çözünürlük.
Görüntülerde 2 kod arasında karşılaştırma yapmak mümkündür. Orijinal kodu da görebilirsiniz.
Adım 5: STM32 Seri Haberleşme
STM32'de USART arayüzlerinin nasıl düzenlendiğini görelim. Evet, çoğul arayüzler…..
"Blue Pill" 3 USART'a (RX/ TX 1~3) sahiptir ve bir önyükleyici kullanıyorsanız USB kullanmanıza izin verir, o zaman hiçbirine bağlı değildir.
USB kullanıp kullanmadığınıza bağlı olarak, kodunuzda bir veya başka şekilde seri bağlantı noktası bildirmeniz gerekir.
Durum 1: USB Kullanımı:
Bu şekilde, eskizler doğrudan USB üzerinden indirilir. BOOT0 jumper'ını 1 konumuna ve tekrar 0'a taşımanıza gerek yok.
Bu durumda, indekssiz "Seri" ilan ettiğinizde, USB üzerinden iletişim anlamına gelir.
Yani, Seri1, TX/ RX 1 anlamına gelir (Pins PA9 ve PA10); Seri2, TX/ RX 2 (PA2 ve PA3 pimleri) anlamına gelir ve Seri 3, TX/ RX 3 (PA10 ve PA11 pimleri) anlamına gelir.
Bu şekilde çalışıyoruz. Bu kodlama yöntemi için örneklerde değişiklikler sunacağım.
Başka bir şey: "Seri USB"nin başlatılması gerekmez. Başka bir deyişle, "…Serial.begin(15200);" gerekli değil.
Herhangi bir başlatma olmadan herhangi bir Seri işlevi (Serial.read(), Serial.write(), vb.) çağırmak mümkündür.
Herhangi bir nedenle kodda mevcutsa, derleyici onu görmezden gelir.
Durum 2: TTL serisini USB adaptörüne kullanma:
Bu şekilde, önyükleyici yerel STM32 USB iletişimini desteklemez, bu nedenle eskizleri yüklemek için TX/RX 1'e (pin PA9 ve PA10) bağlı bir USB'den seriye adaptöre ihtiyacınız vardır.
Bu durumda, indekssiz herhangi bir "Seri" kod olduğunda, TX/ RX1 (kodu yüklemek için kullanılan bağlantı noktası) anlamına gelir. Böylece, Seri1 TX/RX 2'yi (PA2 ve PA3 pimleri) ve Seri2, TX/ RX 3'ü (PA10 ve PA11 pimleri) ifade eder. Seri3 mevcut değil.
Adım 6: Mikrodenetleyiciye Değer Geçirme
Dimmer örneği, bir değerin mikrodenetleyiciye nasıl iletildiğini göstermenin basit bir yoludur.
LED parlaklığını kontrol etmek için 0 ile 255 arasında bir değer geçmesi gerekiyor.
Blue Pill'de beklendiği gibi ÇALIŞMAYACAKTIR:
- pwmWrite() işlevini kullanmak için pinMode(), PWM modu olarak bildirilmelidir ZORUNLU.
- Asla 3 basamaklı bir sayı elde edemezsiniz. Serial.read() işlevi, yalnızca bir "BYTE" olan arabellek içeriğini yakalar. "100" yazıp "enter" tuşuna basarsanız, arabellekten yalnızca son "0" alınacaktır. Ve değeri "48" olacaktır ("0" için ondalık ASCII değeri). "100" değeri vermek isteniyorsa, "d" yazılması gerekir. Yani, LED parlaklığında bir ASCII sembolü ondalık değerini dönüştüreceğini söylemek doğru, değil mi?…. Eh, bir çeşit…
- Sorun, değerleri doğrudan Serial.read() işlevinden eşlemek hileli bir eylemdir. Beklenmedik değerler alması neredeyse kesindir. Daha iyi bir yaklaşım, geçici bir değişkende depolama arabelleği içeriği ve onu eşlemektir.
Daha önce 2. maddede açıkladığım gibi, tanıttığım kod değişiklikleri bir ASCII sembolü girmeye izin verecek ve bu, ASCII ondalık değerine dayalı olarak LED parlaklığını kontrol edecektir… örneğin, "boşluk" 32 değeridir (aslında girebileceğiniz en düşük yazdırılabilir karakterdir) ve "}" mümkün olan en yüksek değerdir (değer 126). Diğer karakterler yazdırılamaz, bu nedenle terminal anlamaz veya bir karakter bileşimi olabilir ("~" gibi, klavyemde ölü bir tuş ve düzgün çalışmayacak). Bu, bu bileşik karakter, terminale girildiğinde, karakterin kendisini ve başka bir şeyi göndereceği anlamına gelir. Genellikle yazdırılamaz bir tane. Ve bu son kod mu yakalayacak. Ayrıca, Terminalinizin bu durumda ne "Satır Başı" ne de "Satır Beslemesi" göndermemesi gerektiğini unutmayın. Kodlamanın doğru çalışması için buna dikkat etmelisiniz.
Düşersen biraz kafa karıştırıcı olur, daha da kötüleşir…..
7. Adım: Ve Üç Rakam Yazmak İstersem…. ya da Daha Fazlası??
Seri iletişimden birden fazla karakter almak basit bir iş değildir.
Seri arabellek, FIFO bayt karakter yığınıdır. Serial.read() işlevi her çağrıldığında, gönderilen ilk karakter yığından çıkarılır ve başka bir yerde saklanır. Genellikle kodda bir char değişkeni. Not, donanıma bağlıdır, genellikle günlük arabelleğinin bilgileri nasıl tutabileceğine ilişkin bir zaman aşımı vardır.
Seri yoluyla birden fazla rakam girmeyi düşünüyorsanız, UART arabelleğine girdiklerinde karakter karakter "oluşturmanız" gerekir.
Bu, döngünün her bir arabellek karakterini okuması, geçici bir değişkende saklaması, onu bir dizi dizisinin ilk konumuna yüklemesi, bir sonraki konuma geçmesi ve yeniden başlaması anlamına gelir, ta ki… pekala, uygulamaya bağlı olana kadar. Döngüyü bitirmenin 2 yolu vardır:
- "Satır Başı" veya "Satır Beslemesi" gibi bazı "bitiş işareti" karakterlerini kullanma. "Bitiş İşareti" karakteri bulunur bulunmaz döngü sona erer.
- Alternatif olarak, dizi zincirindeki karakter sayısı, etkileşimli döngü sayısı gibi sınırlandırılabilir. Sınıra ulaştığında, diyelim ki 4, rutin bitirmeleri kendi başına elde edin.
Bunun nasıl yapıldığına basit bir örnekle bakalım:
- '\n' gibi bir "bitiş" karakteri ayarlayın (bu, satır besleme ASCII karakteri anlamına gelir).
- döngü bu arada Serial.available() doğrudur
- Serial.read()'in saklanması geçici bir char değişkeniyle sonuçlanır. Unutmayın: Serial.read() aslında arabelleği "okuduğu" anda, temizdir ve sonraki karakter içine yüklenir.
- bu karakterle bir dize değişkenini artır
- Son karakter "son" ise döngüden çıkın.
Genellikle, seri karakter dizisi almak için rutin resim gibi görünür.
Bay David A. Mellis orijinal kodunun kapsamlı bir uyarlamasına dayanıyordu.
Kullanmak ve test etmek için serbest düştü. Unutmayın: değerler 3 basamaklı biçimde girilmelidir ZORUNLU.
Şimdilik bu kadar. Ek seri iletişim detaylarına girmeyeceğim. Burada ele alınamayacak kadar karmaşıktır ve kendi Intructables'ını hak ediyor.
Umarım Blue Pill'deki örnekleri kullanmanıza yardımcı olur ve bu küçük tahta için kodun ne kadar doğru olduğunu biraz aydınlatır.
Başka bir talimatta görüşürüz.
Önerilen:
Güncellenmiş Solar Lazer + Şimdi Güç Bankası ile Led: 3 Adım
Güncellenmiş Solar Lazer + Şimdi Güç Bankası ile Led: USB için bir güç bankası devresi kullanıyorum ve süper kapasitörler yerine LED için nikel metal hidrit kullandım ve bir lazer işaretçi ekledim ve güç bankası için bir lityum hücre kullandım ve kullanarak şarj ettim USB değil solar.ve üzerine bir yedek güneş paneli ekledim
Yeni ve Geliştirilmiş Geiger Sayacı - Şimdi WiFi İle!: 4 Adım (Resimlerle)
Yeni ve Geliştirilmiş Geiger Sayacı - Şimdi WiFi İle!: Bu, bu Eğitilebilir Dosyadaki Geiger sayacımın güncellenmiş bir versiyonudur. Oldukça popülerdi ve onu inşa etmekle ilgilenen insanlardan çok sayıda geri bildirim aldım, işte devamı: GC-20. Bir Geiger sayacı, dozimetre ve radyasyon m
İletişim ESP-ŞİMDİ. Kontrol Remoto De Vehículo, Joystick, Arduino Wemos.: 28 Adım
İletişim ESP-ŞİMDİ. Kontrol Uzaktan Kumandası, Joystick, Arduino Wemos.: Kişisel engelleri ortadan kaldırmak için, uzaktan kumanda ile yapılacaklar. En iyi proyecto. Posteriormente se pueden cambiar los cir
Palm Os Cihazı LCD Durum Göstergesi Olarak Çalışır. (şimdi Resimlerle!): 4 Adım
Palm Os Cihazı LCD Durum Göstergesi Olarak Çalışır. (şimdi Resimlerle birlikte!): Bu makalenin tamamı, bilgisayarınız için bir LCD durum görüntüsünü taklit etmek için avuç içi OS cihazınızı nasıl kullanacağınızla ilgilidir! Sistem istatistiklerini (örneğin: CPU yük grafikleri, CPU sıcaklıkları, boş disk alanı), haber uyarılarını, hisse senedi endekslerini, WinAmp grafiklerini vb. görüntüleyebilirsiniz.
Yani Dev Bir Robot Yapmak İstiyorsunuz.: 19 Adım (Resimli)
Yani Dev Bir Robot Yapmak İstiyorsunuz.: Dev bir robot yapmak istediğinizi mi söylüyorsunuz? Amacınız ne? Dünya hakimiyeti? Kız arkadaşın o birayı senin için almayacak mı? Her ne ise, kendinize bir robot yapmaya nasıl başlayacağınız aşağıda açıklanmıştır. Bu robotun amacı, benim için bir sahne dekoru