İçindekiler:

Yani, STM32duino Bootloader'ı "Mavi Hapınıza" Yüklediniz Peki Şimdi Ne Yapacaksınız?: 7 Adım
Yani, STM32duino Bootloader'ı "Mavi Hapınıza" Yüklediniz Peki Şimdi Ne Yapacaksınız?: 7 Adım

Video: Yani, STM32duino Bootloader'ı "Mavi Hapınıza" Yüklediniz Peki Şimdi Ne Yapacaksınız?: 7 Adım

Video: Yani, STM32duino Bootloader'ı
Video: STM32 Blue Pill Bootloader Yükleme İşlemi #4 2024, Temmuz
Anonim
Böylece, STM32duino Bootloader'ı Bilgisayarınıza Yüklersiniz
Böylece, STM32duino Bootloader'ı Bilgisayarınıza Yüklersiniz
Böylece, STM32duino Bootloader'ı Bilgisayarınıza Yüklersiniz
Böylece, STM32duino Bootloader'ı Bilgisayarınıza Yüklersiniz

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?

Pinler ve Pinler…. Kod Neden Çalışmıyor?
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"…

Haydi
Haydi

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ış

AnalogWrite() ve PwmWrite()…2 Aromada Analog Çıkış
AnalogWrite() ve PwmWrite()…2 Aromada Analog Çıkış
AnalogWrite() ve PwmWrite()…2 Aromada Analog Çıkış
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 Seri Haberleşme
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

Mikrodenetleyiciye Değer Geçirme
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:

  1. pwmWrite() işlevini kullanmak için pinMode(), PWM modu olarak bildirilmelidir ZORUNLU.
  2. 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…
  3. 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ı??

Ve Üç Rakam Yazmak İstersem…. ya da Daha Fazlası??
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:

  1. "Satır Başı" veya "Satır Beslemesi" gibi bazı "bitiş işareti" karakterlerini kullanma. "Bitiş İşareti" karakteri bulunur bulunmaz döngü sona erer.
  2. 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: