Tartalomjegyzék:

Tehát betölti az STM32duino rendszerindítót a "kék pirulájába" És most mi van?: 7 lépés
Tehát betölti az STM32duino rendszerindítót a "kék pirulájába" És most mi van?: 7 lépés

Videó: Tehát betölti az STM32duino rendszerindítót a "kék pirulájába" És most mi van?: 7 lépés

Videó: Tehát betölti az STM32duino rendszerindítót a
Videó: WIndows telepítő nem látja a meghajtót - MEGOLDÁS - 11. és 12. Generációs Intel CPU 2024, Július
Anonim
Tehát betölti az STM32duino rendszerindítót
Tehát betölti az STM32duino rendszerindítót
Tehát betölti az STM32duino rendszerindítót
Tehát betölti az STM32duino rendszerindítót

Ha már elolvasta az utasításaimat, amelyek elmagyarázzák, hogyan kell betölteni az STM32duino rendszerbetöltőt vagy más hasonló dokumentációt, próbálja meg betölteni a példakódot, és… lehet, hogy nem történik semmi.

A probléma az, hogy sok, ha nem minden példa az "általános" STM32 -re nem fog működni. Kisebb változtatásokra lesz szükség ahhoz, hogy az STM32 "Blue Pill" táblán dolgozhasson.

4 kódpéldát fogok kiválasztani, hogy elmagyarázzam, mit kell megváltoztatni és miért. A kódok: "BlinkWithoutDelay", "Fading", "Dimmer" és "AnalogInSerial".

Megjegyzés: NEM kódoltam semmit. Csak kisebb módosításokat teszek közzé a kódokban, amelyeket a következők hoztak létre:

David A. Mellis és későn módosította Tom Igoe, Marti Bolivar és néhány esetben Scott Fitzgerald

Tom Igoe és későn módosította Bryan Newbold

Tehát inkább a szerzők nevét megtartom még az általam módosított kódokban is, megtartva a létrehozási jóváírást.

1. lépés: Csapok és csapok… Miért nem működik a kód?

Csapok és csapok… Miért nem működik a kód?
Csapok és csapok… Miért nem működik a kód?

Vessünk egy pillantást az STM32 "Blue Pill" tűjére. Megjegyzés: a csapokat PA1 -nek vagy PC2 -nek nevezik… valami ilyesmi.

Ha belenéz például a "BlinkWithoutDelay" kódpéldába, a pin "33" lesz… Miért?

Gyanítom, hogy ez azért van, mert Marti Bolivar úr átvitte ezt a kódot a MAPLE táblához.

Azt hiszem, nem az volt a szándéka, hogy a kódot kompatibilis legyen a "Blue Pill" táblákkal.

A Maple és Maple mini tábla számai deklaráltak, mint az Arduino, bár 33, 24 és néhány ehhez hasonló számot használnak.

Mondtam, hogy a kód nem működik? Az én hibám. Kód fordítás hiba nélkül, és töltse fel helyesen a "Blue Pill" -re, tehát véleményem szerint valóban működik, de nem számítunk GPIO kimenetre. Lehet, hogy nem is elérhető.

Így a kódon kevés változtatásra van szükség, hogy a várt módon működjön.

2. lépés: Határozzuk meg néhány tűt…

Gyerünk
Gyerünk

A helyes kódgyakorlat szerint az erőforrásokat könnyen azonosíthatóvá vagy változóként vagy konstansként jelentik. Ez megkönnyíti a kód megértését és a hibaelhárítást.

A deklarációs Arduino csapokat a következőképpen használtam:

const int ledPin = 13;

…"

Ha tetszik nekem, akkor talán azt kérdezi magától: "Hogyan tudom deklarálni a csapokat olyan nevekkel, mint a PC13 ???"

A válasz: Használja a "#define" C utasítást.

Tehát a pinout húzás szerint a PC13 a "BluePill" LED -ben lévő csap. Használatához így nyilatkoznék, közvetlenül a könyvtárak meghatározása után (#include…) és bármi más előtt:

#define LedPin PC13

…"

Megjegyzés: NINCS ";" vonalvégződés, NOR "=" hozzárendelés.

Hasonlítsa össze mindkét kódot. Az egyik az IDE -ből betöltött eredeti példa. A második az, amelyet némileg kiigazítottam a "BluePill" funkcióval való együttműködéshez.

Erősen javaslom, hogy deklarálja a kódban az összes használni kívánt csapot. Még azok is, akik ADC bemenetként kívánják használni (erről később).

Ez megkönnyíti az életét.

3. lépés: PinMode ()… Hogyan fogja használni a csapjait…

A folytatás előtt ismerkedjünk meg a PinMode () funkcióval.

Az Arduinohoz hasonlóan az STM32 tűknek is több funkciójuk van. Az egyik vagy másik kiválasztásának legegyszerűbb módja a pinMode () utasítás használata.

Az Arduino -nak csak 3 módja van: INPUT, OUTPUT vagy INPUT_PULLUP.

Az STM32 viszont számos ízben rendelkezik pinMode () -val. Ők:

OUTPUT -Alapvető digitális kimenet: ha a csap MAGAS, a feszültséget +3,3 V (Vcc) értéken tartják, és ha alacsony, akkor le kell húzni a földre

OUTPUT_OPEN_DRAIN -Nyitott leeresztési üzemmódban a csap jelzi az „alacsony” értéket azáltal, hogy elfogadja a jelenlegi áramlást a földhöz, és a „magas” értéket a megnövelt impedancia biztosításával

INPUT_ANALOG -Ez egy speciális mód arra az esetre, amikor a tűt analóg (nem digitális) olvasáshoz használják. Lehetővé teszi az ADC átalakítást a tűn lévő feszültségre

INPUT_PULLUP -A csap állapotát ebben az üzemmódban ugyanúgy jelzik, mint az INPUT -nál, de a tű feszültségét óvatosan „felfelé” húzzák fel +3.3v felé

INPUT_PULLDOWN -A tüske állapotát ebben az üzemmódban ugyanúgy jelzi, mint az INPUT esetében, de a csap feszültségét óvatosan „lefelé” húzza le 0v felé

INPUT_FLOATING -Az INPUT szinonimája

PWM -Ez egy speciális mód arra az esetre, amikor a tűt a PWM kimenetre használják (a digitális kimenet speciális esete)

PWM_OPEN_DRAIN -Mint a PWM, azzal a különbséggel, hogy a váltakozó LOW és HIGH ciklusok helyett a csap feszültsége LOW és lebegő (leválasztott) váltakozó ciklusokból áll

(Megjegyzés: a https://docs.leaflabs.com/static.leaflabs.com/pub/leaflabs/maple-docs/latest/lang/api/pinmode.html#lang-pinmode webhelyről származik)

Most nyitom ki ezt a zárójelet, mert amikor elkezdi létrehozni saját kódját, ügyeljen arra, hogy az igényeinek megfelelő pinMode () -ot használja.

4. lépés: AnalogWrite () Versus PwmWrite ()… Analóg kimenet 2 ízben

AnalogWrite () Versus PwmWrite ()… Analóg kimenet 2 ízben
AnalogWrite () Versus PwmWrite ()… Analóg kimenet 2 ízben
AnalogWrite () Versus PwmWrite ()… Analóg kimenet 2 ízben
AnalogWrite () Versus PwmWrite ()… Analóg kimenet 2 ízben

A "Blue Pill" GPIO csapok használata előtt ki kell jelenteni a viselkedését, azaz hogyan fog működni. A pinMode () függvény pontosan ezt teszi.

Tehát most összpontosítsunk arra, hogyan kell helyesen beállítani az analóg kimenetet. OUTPUT vagy PWM módként is deklarálható.

Ugyanígy, az analóg értékek kétféleképpen is hozzárendelhetők a GPIO -hoz: analogWrite () vagy pwmWrite (), DE, analogWrite () csak akkor működik, ha a pinMode () = OUTPUT. Másrészt a pwmWrite () csak akkor működik, ha a pinMode () = PWM.

Vegyük például a PA0 -t: analóg/pwm kimenet.

analogWrite (): ez így deklarálja:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <szám>);

……"

ahol a számnak 0 és 255 között kell lennie, mint az Arduino. Valójában visszafelé kompatibilis az Arduino -val.

pwmWrite (): deklarálja így:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <szám.>);

…."

Ahol a számnak 0 ~ 65535 között kell lennie, a felbontás sokkal magasabb, mint az Arduino.

A képeken összehasonlítható a két kód. Láthatja az eredeti kódot is.

5. lépés: STM32 soros kommunikáció

STM32 soros kommunikáció
STM32 soros kommunikáció

Lássuk, hogyan van elrendezve USART interfész az STM32 -ben. Igen, az interfészek többes számban ….

A "Blue Pill" -nek 3 USART -ja van (RX/ TX 1 ~ 3), és ha egy rendszerbetöltőt használ, lehetővé teszi az USB használatát, akkor az egyikhez sem csatlakozik.

Attól függően, hogy USB -t használ -e vagy sem, a soros portot egy vagy másik módon deklarálnia kell a kódban.

1. eset: USB használata:

Így a vázlatok közvetlenül USB -n keresztül tölthetők le. Nem kell a BOOT0 jumpert 1 pozícióba és 0 -ba visszahelyezni.

Ebben az esetben minden alkalommal, amikor index nélkül sorosnak nyilvánítja, USB -n keresztüli kommunikációt jelent.

Tehát a Serial1 jelentése TX/ RX 1 (PA9 és PA10 csapok); Serial2: TX/ RX 2 (PA2 és PA3 csapok), és 3 -as sorozat TX/ RX 3 (PA10 és PA11 csapok).

Így dolgozunk. Példákat mutatok be a kódolás ezen módján.

Egy másik dolog: a "Serial USB" -t nem kell inicializálni. Más szóval: "… Sorozat.kezdet (15200);" nem szükséges.

Bármilyen soros függvény (Serial.read (), Serial.write () stb.) Inicializálás nélkül meghívható.

Ha valamilyen oknál fogva jelen van a kódban, a fordító figyelmen kívül hagyja.

2. eset: TTL seria - USB adapter használata:

Ily módon a rendszerbetöltő nem támogatja a natív STM32 USB kommunikációt, ezért a vázlatok feltöltéséhez szüksége van egy TX/ RX 1 -hez csatlakoztatott USB -soros adapterre (PA9 és PA10 érintkezők).

Ebben az esetben bármikor a "Sorozat", index nélkül kód, TX/ RX1 -et jelent (a kód feltöltésére használt port). Tehát a Serial1 utal a TX/ RX 2 -re (PA2 és PA3 csapok), a Serial2 pedig a TX/ RX 3 -ra (PA10 és PA11 csapok). A Serial3 nem érhető el.

6. lépés: Érték átadása a mikrokontrollernek

Érték átadása a mikrokontrollernek
Érték átadása a mikrokontrollernek

A dimmer példa egyszerű módja annak, hogy bemutassa, hogyan adja át az értéket a mikrokontrollernek.

Feltételezi, hogy 0 és 255 közötti értéket ad át a LED fényerejének szabályozásához.

NEM fog működni a várt módon a Blue Pill miatt:

  1. A pwmWrite () függvény használatához a PINMode () -t PWM módnak KELL deklarálni.
  2. Soha nem kapsz egész 3 számjegyű számot. A Serial.read () függvény csak puffertartalmat rögzít, amely "BYTE". ha beírja a "100" -t és megnyomja az "enter" billentyűt, akkor csak az utolsó "0" lesz rögzítve a pufferből. És értéke "48" lesz (decimális ASCII érték "0" esetén). Ha a "100" értéket kívánja kiadni, akkor be kell írni a "d" -t. Tehát helyes azt mondani, hogy átalakítja az ASCII szimbólum tizedes értékét a LED fényerejében, nem?…. Nos, egyfajta…
  3. Probléma, a térképértékek közvetlenül a Serial.read () függvényből egy trükkös művelet. Szinte biztos, hogy váratlan értékeket kap. Jobb megközelítés a tárolópuffer tartalom egy ideiglenes változóban, és mint a térkép.

Ahogy a 2. pontban már kifejtettem, az általam módosított kód lehetővé teszi az ASCII szimbólum bevitelét, és ez vezérli a LED fényerejét az ASCII tizedes értéke alapján … például a "szóköz" értéke 32 (valójában a legalacsonyabb nyomtatható karakter, amelyet be lehet írni) és "}" lehetséges a legmagasabb (126 érték). Más karakterek nem nyomtathatók, így a terminál nem fogja megérteni, vagy lehetséges karakterösszetétel (például a "~" egy halott billentyű a billentyűzetemen, és nem fog megfelelően működni). Ez azt jelenti, hogy ez az összetett karakter, amikor belép a terminálba, magát a karaktert és valami mást küld. Általában nem nyomtatható. És ezt az utolsó kódot rögzíti. Ne feledje, hogy ebben az esetben a terminálja NEM küldhet sem "kocsivisszatérést", sem "sorbevitelt". Erre figyelni kell, hogy a kód megfelelően működjön.

Ha elesel, kicsit zavaró, akkor a legrosszabb lesz ….

7. lépés: És ha három számjegyet szeretnék beírni…. vagy még több ??

És ha három számjegyet szeretnék beírni…. vagy még több ??
És ha három számjegyet szeretnék beírni…. vagy még több ??

Több karakter fogadása a soros kommunikációból nem egyszerű feladat.

A soros puffer FIFO bájt karakterhalom. Amikor a Serial.read () függvény hív, az első küldött karaktert eltávolítják a halomból, és máshol tárolják. Általában char változó a kódban. Megjegyzés: a hardvertől függően általában van időkorlát arra vonatkozóan, hogy a naplópuffer hogyan tudja tárolni az információkat.

Ha egynél több számjegyet szándékozik megadni soros úton, akkor karakterlánconként kell "összeállítania" egy karakterláncot, amint azok belépnek az UART pufferbe.

Ez azt jelenti, hogy ciklikusan olvassa el az egyes puffer karaktereket, tárolja azokat egy temp változóban, töltse be a karakterlánc -tömb első pozíciójába, lépjen a következő helyre és kezdje elölről, amíg… nos, az alkalmazástól függ. A ciklus befejezésének két módja van:

  1. Néhány "végjel" karakter, például "kocsi vissza" vagy "Sor előtolás" használata. Amint megtalálja a "end Mark" karaktert, a hurok véget ér.
  2. Alternatív megoldásként a karakterláncok karaktereinek száma korlátozható, így az interaktív ciklusok száma is korlátozható. Amikor eléri a határt, mondjuk 4 -et, saját maga szerezzen rutinbefejezést.

Nézzünk egy egyszerű példát, hogyan kell ezt csinálni:

  • Állítson be egy "vég" karaktert, például "\ n" (ez a sorcsatorna ASCII karakterét jelenti).
  • ciklus közben a Serial.available () igaz
  • A Serial.read () tárolása ideiglenes char változót eredményez. Ne feledje: amint a Serial.read () valóban "beolvassa" a puffert, az tiszta és a következő karakter betöltődik.
  • növelje a karakterlánc változóját ezzel a karakterrel
  • Ha az utolsó karakter "vége", lépjen ki a ciklusból.

Általában a soros karakter tömb lekérésének rutinja képnek tűnik.

David A. Mellis eredeti kódjának kiterjedt adaptációján alapult.

Szabadon használható és tesztelhető. Ne feledje: az értékeket 3 számjegy formátumban KELL megadni.

Egyelőre ennyi. Nem fogom kiterjeszteni magam további soros kommunikációs részletekre. Ez itt túl bonyolult ahhoz, hogy lefedje, és megérdemli a saját Intructables -t.

Remélem, segít a Blue Pill példáinak használatában, és felvilágosítást ad a helyes tábla kódjáról.

Találkozunk más tanulsággal.

Ajánlott: