Kazalo:

Torej, naložite zagonski nalagalnik STM32duino v svojo "modro tableto" Kaj torej zdaj?: 7 korakov
Torej, naložite zagonski nalagalnik STM32duino v svojo "modro tableto" Kaj torej zdaj?: 7 korakov

Video: Torej, naložite zagonski nalagalnik STM32duino v svojo "modro tableto" Kaj torej zdaj?: 7 korakov

Video: Torej, naložite zagonski nalagalnik STM32duino v svojo
Video: ⚡️ Я НЕ СДАМСЯ! AMAZON 2.0 | Интернет магазин с нуля - Часть 3 2024, Junij
Anonim
Torej, naložite STM32duino zagonski nalagalnik v svoj
Torej, naložite STM32duino zagonski nalagalnik v svoj
Torej, naložite STM32duino zagonski nalagalnik v svoj
Torej, naložite STM32duino zagonski nalagalnik v svoj

Če ste že prebrali moja navodila, ki pojasnjujejo, kako naložite zagonski nalagalnik STM32duino ali katero koli drugo podobno dokumentacijo, poskusite z nalaganjem kode nalaganja in ….mogoče se sploh ne zgodi nič.

Težava je v tem, da mnogi, če ne vsi primeri za "generični" STM32 ne bodo uspeli. Za delo na plošči STM32 "Blue Pill" bodo potrebne manjše spremembe.

Izbral bom 4 primere kode, ki bodo razložili, kaj je treba spremeniti in zakaj. Kode so: "BlinkWithoutDelay", "Fading", "Dimmer" in "AnalogInSerial".

Opomba: Nisem nič kodiral. Izdajam le manjše spremembe kod, ki so jih ustvarili:

David A. Mellis in pozno spremenil Tom Igoe, Marti Bolivar in nekaj primerov Scott Fitzgerald

Tom Igoe in pozno spremenil Bryan Newbold

Zato raje obdržim imena avtorjev tudi v kodah, ki jih spreminjam, pri tem pa ohranim zasluge za ustvarjanje.

1. korak: Zatiči in zatiči …. Zakaj koda ne deluje?

Pins and Pins…. Zakaj koda ne deluje?
Pins and Pins…. Zakaj koda ne deluje?

Oglejmo si oznako STM32 "Blue Pill". Opozorilni zatiči so označeni kot PA1 ali PC2….

Če na primer pogledate primer kode "BlinkWithoutDelay", je pin deklariran kot "33" … Zakaj?

Sumim, da je to zato, ker je g. Marti Bolivar prenesel to kodo za ploščo MAPLE.

Mislim, da ni bil njegov namen, da bi kodo združil s ploščami "Blue Pill".

Zatiči mini plošče Maple in Maple so numerično deklarirani, tako kot Arduino, čeprav uporabljajo številke, kot so 33, 24 in nekatere podobne.

Rekel sem, da koda ne deluje? Moja napaka. Koda se prevede brez napak in pravilno naloži v "Blue Pill", zato mislim, da res deluje, vendar z uporabo izhoda GPIO ne pričakujemo. Morda sploh ni na voljo.

Zato je v kodi potrebno malo sprememb, da bo delovalo po pričakovanjih.

2. korak: "Opredelimo" nekaj zatičev…

Gremo
Gremo

Dobra praksa kode je razglasiti vire kot enostavne za prepoznavanje ali pomen spremenljivk ali konstant. Omogočil vam bo lažje razumevanje kode in odpravljanje težav.

Uporabil sem deklarirane zatiče Arduino tako:

const int ledPin = 13;

…"

Če sem vam všeč, se morda sprašujete: "Kako lahko razglasim zatiče z imeni, kot je PC13 ???"

Odgovor je: Uporabite stavek "#define" C.

Torej, po žrebanju pinout, je PC13 pin, ki ga imamo na plošči LED v "BluePill". Za njegovo uporabo bi razložil takole, tik po definiciji knjižnic (#include…) in pred vsem drugim:

#define LedPin PC13

…"

Upoštevajte, da NE ";" prekinitev vrstice, NOR "=" dodelitev.

Primerjajte obe kodi. Eden je prvotni primer, naložen iz IDE. Drugi je tisti, ki sem ga nekoliko prilagodil delu z "BluePill".

Močno priporočam, da vse kode, ki jih nameravate uporabiti, deklarirate v kodi. Tudi tisti, ki jih nameravajo uporabiti kot vhod ADC (več o tem kasneje).

To vam bo olajšalo življenje.

3. korak: PinMode () … Kako boste uporabljali zatiče …

Preden nadaljujemo, razumemo funkcijo PinMode ().

Tako kot Arduino imajo tudi zatiči STM32 več funkcij. Najpreprostejši način za izbiro enega ali drugega je uporaba stavka pinMode ().

Arduino ima na voljo samo 3 načine: INPUT, OUTPUT ali INPUT_PULLUP.

STM32 pa ima veliko okusov pinMode (). So:

IZHOD -Osnovni digitalni izhod: ko je zatič VISOK, napetost ostane pri +3,3 V (Vcc) in ko je NIZKA, se potegne navzdol na tla

OUTPUT_OPEN_DRAIN -V načinu odprtega odtoka zatič označuje "nizko" s sprejemanjem toka toka v zemljo in "visoko" z zagotavljanjem povečane impedance

INPUT_ANALOG -To je poseben način, ko se bo pin uporabil za analogno (ne digitalno) branje. Omogoča pretvorbo ADC za napetost na zatiču

INPUT_PULLUP -Stanje nožice v tem načinu se poroča na enak način kot pri vhodu, vendar se napetost nožice nežno »potegne« proti +3,3 V

INPUT_PULLDOWN -Stanje nožice v tem načinu se poroča na enak način kot pri vhodu, vendar se napetost zatiča nežno "potegne navzdol" proti 0v

INPUT_FLOATING -Sinonim za INPUT

PWM -To je poseben način, ko se bo pin uporabljal za izhod PWM (poseben primer digitalnega izhoda)

PWM_OPEN_DRAIN -Tako kot PWM, le da namesto izmeničnih ciklov LOW in HIGH napetost na zatiču sestavljajo izmenični cikli LOW in plavajoči (odklopljeni)

(opomba: izvleček iz

Odprem samo te oklepaje, ker ko začnete ustvarjati lastno kodo, bodite previdni in uporabite pravilni pinMode () za svoje potrebe.

4. korak: AnalogWrite () v primerjavi s PwmWrite () … Analogni izhod v 2 okusih

AnalogWrite () v primerjavi s PwmWrite ()… Analogni izhod v 2 okusih
AnalogWrite () v primerjavi s PwmWrite ()… Analogni izhod v 2 okusih
AnalogWrite () v primerjavi s PwmWrite () … Analogni izhod v 2 okusih
AnalogWrite () v primerjavi s PwmWrite () … Analogni izhod v 2 okusih

Pred uporabo zatičev GPIO "Blue Pill" je treba prijaviti njeno obnašanje, to je, kako bo delovalo. Točno to počne funkcija pinMode ().

Zato se zdaj osredotočimo, kako pravilno nastaviti analogni izhod. Lahko se razglasi za način IZHOD ali način PWM.

Na enak način lahko analogne vrednosti GPIO pripišemo na dva načina: analogWrite () ali pwmWrite (), VEDNO, analogWrite () BO delovalo le, če je pinMode () = OUTPUT. Po drugi strani pa bo pwmWrite () deloval le, če je pinMode () = PWM.

Vzemimo na primer PA0: je analogni/pwm izhodni kandidat.

analogWrite (): to razglasite tako:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <število>);

……"

kjer mora biti število med 0 in 255, na primer Arduino. Pravzaprav je nazaj združljiv z Arduinom.

pwmWrite (): razglasite tako:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <število.>);

…."

Kjer mora biti število med 0 ~ 65535, ločljivost precej višja od Arduina.

Na slikah je mogoče primerjati med 2 kodama. Ogledate si lahko tudi izvirno kodo.

5. korak: Serijska komunikacija STM32

Serijska komunikacija STM32
Serijska komunikacija STM32

Poglejmo, kako so urejeni vmesniki USART v STM32. Ja, vmesniki v množini …….

"Blue Pill" ima 3 USART -je (RX/ TX 1 ~ 3), in če uporabljate zagonski nalagalnik, ki vam omogoča uporabo USB, ni povezan z nobenim od teh.

Odvisno od tega, ali uporabljate USB ali ne, morate v svoji kodi na tak ali drugačen način prijaviti serijska vrata.

Primer 1: Uporaba USB -ja:

Na ta način se skice naložijo neposredno prek USB -ja. Mostiča BOOT0 ni treba premikati v 1 položaj in nazaj v 0.

V tem primeru, kadar koli razglasite "Serijsko" brez indeksa, pomeni komunikacijo prek USB -ja.

Torej, Serial1, pomeni TX/ RX 1 (nožici PA9 in PA10); Serial2, pomeni TX/ RX 2 (nožici PA2 in PA3) in Serial 3 pomeni TX/ RX 3 (nožici PA10 in PA11).

Tako delamo. Predstavil bom spremembe v primerih za ta način kodiranja.

Še nekaj: "Serijskega USB -ja" ni treba inicializirati. Z drugimi besedami, "… Serial.begin (15200);" ni potrebno.

Možno je poklicati katero koli serijsko funkcijo (Serial.read (), Serial.write () itd) brez inicializacije.

Če je iz nekega razloga prisoten v kodi, ga prevajalnik ne upošteva.

Primer 2: Uporaba serije TTL za adapter USB:

Na ta način zagonski nalagalnik ne podpira izvorne komunikacije STM32 USB, zato za nalaganje skic potrebujete USB -serijski adapter, priključen na TX/ RX 1 (pin PA9 in PA10).

V tem primeru je kadar koli "Serijski" brez indeksa koda, pomeni TX/ RX1 (vrata, ki se uporabljajo za nalaganje kode). Torej, Serial1 se nanaša na TX/ RX 2 (nožici PA2 in PA3), Serial2 pa na TX/ RX 3 (nožici PA10 in PA11). Serial3 ni na voljo.

6. korak: Posredovanje vrednosti mikrokontrolerju

Posredovanje vrednosti mikrokrmilniku
Posredovanje vrednosti mikrokrmilniku

Primer zatemnitve je preprost način, da pokažete, kako posredujete vrednost mikrokrmilniku.

Predvideva prenos vrednosti od 0 do 255 za nadzor svetlosti LED.

V Blue Pill NE bo delovalo po pričakovanjih zaradi:

  1. Če želite uporabiti funkcijo pwmWrite (), morate pinMode () deklarirati kot način PWM.
  2. Nikoli ne boste dobili celotne 3 -mestne številke. Funkcija Serial.read () zajema samo vsebino medpomnilnika, ki je "BYTE". če vnesete "100" in pritisnete "enter", bo iz vmesnega pomnilnika zajet le zadnji "0". Njegova vrednost bo "48" (decimalna vrednost ASCII za "0"). Če nameravate izdati vrednost "100", morate vnesti "d". Torej je pravilno reči, da bo pretvoril decimalno vrednost simbola ASCII v svetlost LED, kajne ?? … No, neke vrste …
  3. Težava, zemljevid vrednosti neposredno iz funkcije Serial.read () je zvijača. Skoraj zagotovo dobite nepričakovane vrednosti. Boljši pristop je shranjevanje vmesnega pomnilnika v začasni spremenljivki in ga nato preslikajte.

Kot sem že pojasnil v točki 2, bo koda, ki jo uvedem, omogočila vnos simbola ASCII in to bo nadzorovalo svetlost LED glede na njeno decimalno vrednost ASCII … na primer "presledek" je vrednost 32 (pravzaprav je najnižji znak za tiskanje, ki ga lahko vnesete) in "}" je lahko najvišji (vrednost 126). Drugi znaki niso za tiskanje, zato terminal ne bo razumel ali pa so lahko sestavljeni iz znakov (na primer "~" je mrtva tipka na moji tipkovnici in ne bo delovala pravilno). To pomeni, da bo ta sestavljeni znak ob vnosu v terminal poslal sam znak in še kaj drugega. Ponavadi ni tiskano. In ta zadnja koda bo zajela. Upoštevajte tudi, da vaš terminal v tem primeru NE sme pošiljati niti "Carriage Return" niti "Line Feed". Če želite, da koda deluje pravilno, morate biti pozorni na to.

Če padeš, je malo zmedeno, postane najslabše ….

Korak 7: Če bi rad vnesel tri števke … ali še več ??

In če bi rad vnesel tri števke … ali še več ??
In če bi rad vnesel tri števke … ali še več ??

Prejemanje več znakov iz serijske komunikacije ni preprosta naloga.

Zaporedni vmesni pomnilnik je FIFO bajtov kup znakov. Kadar koli pokličete funkcijo Serial.read (), se prvi poslani znak odstrani iz kupa in shrani na drugo mesto. Običajno je spremenljivka char v kodi. Upoštevajte, da je odvisno od strojne opreme, običajno obstaja časovna omejitev, kako lahko medpomnilnik dnevnika hrani podatke.

Če nameravate v serijo vnesti več kot eno številko, morate "sestaviti" niz po znak, ko pridejo v medpomnilnik UART.

To pomeni, da kolesarjenje prebere vsak vmesni znak, shrani v časovno spremenljivko, naloži na prvo mesto niza nizov, premakne na naslednji položaj in začne znova, dokler … no, odvisno od aplikacije. Obstajata 2 načina za zaključek cikla:

  1. Z uporabo nekega znaka "oznaka konca", na primer "Vrnitev nosilca" ali "Vnos vrstice". Takoj, ko se najde znak »end Mark«, se zanka konča.
  2. Druga možnost je, da je število znakov v verigi nizov omejeno, zato tudi število interaktivnih ciklov. Ko doseže mejo, recimo 4, si sam pridobi rutinske zaključke.

Poglejmo na preprostem primeru, kako to storiti:

  • Nastavite "end" char, na primer '\ n' (to pomeni znak vrstice ASCII).
  • zankanje medtem Serial.available () je res
  • shranjevanje Serial.read () povzroči začasno spremenljivko char. Ne pozabite: takoj, ko Serial.read () dejansko "prebere" vmesnik, je čist in vanj se naloži naslednji znak.
  • povečajte spremenljivko niza s tem znakom
  • Če je zadnji znak "konec", zapustite zanko.

Običajno je rutina za pridobivanje zaporednega niza znakov videti kot slika.

Temeljilo je na obsežni priredbi izvirne kode gospoda Davida A. Mellisa.

Uporabite ga in preizkusite. Ne pozabite: vrednosti MORATE vnesti v trimestno obliko.

To je to za zdaj. Ne bom se podal v dodatne podrobnosti o serijski komunikaciji. Tu je preveč zapleteno in si zasluži lastne Vsiljive.

Upam, da vam bo v pomoč pri uporabi primerov v Blue Pill -u in vam razsvetlil, kako pravilna je koda za to majhno tablo.

Se vidimo v drugih navodilih.

Priporočena: