Sadržaj:
- Korak 1: Igle i iglice ….Zašto kôd ne radi?
- Korak 2: Hajdemo "definirati" neke pinove…
- Korak 3: PinMode () … Kako ćete koristiti svoje igle …
- Korak 4: AnalogWrite () naspram PwmWrite ()… Analogni izlaz u 2 okusa
- Korak 5: STM32 serijska komunikacija
- Korak 6: Prosljeđivanje vrijednosti mikrokontroleru
- Korak 7: I ako želim unijeti tri znamenke…. ili još više ??
2025 Autor: John Day | [email protected]. Zadnja izmjena: 2025-01-23 14:37
Ako ste već pročitali moje upute koje objašnjavaju kako učitati STM32duino bootloader ili bilo koju drugu sličnu dokumentaciju, isprobajte primjer učitavanja koda i ….može se dogoditi da se ništa ne dogodi.
Problem je u tome što mnogi, ako ne i svi primjeri za "generički" STM32 neće uspjeti. Bit će potrebne manje promjene da biste započeli s radom na ploči STM32 "Blue Pill".
Odabrat ću 4 primjera koda da objasnim šta treba promijeniti i zašto. Kodovi su: "BlinkWithoutDelay", "Fading", "Dimmer" i "AnalogInSerial".
Napomena: NISAM ništa kodirao. Samo izdajem manje izmjene u kodovima koje su stvorili:
David A. Mellis i kasno izmijenili Tom Igoe, Marti Bolivar i neki slučajevi Scott Fitzgerald
Tom Igoe, a kasnije je izmijenio Bryan Newbold
Zato radije zadržavam imena autora čak i u kodovima koje mijenjam, zadržavajući zasluge za stvaranje.
Korak 1: Igle i iglice …. Zašto kôd ne radi?
Pogledajmo pin STM32 "Blue Pill". Igle za napomene su identifikovane kao PA1 ili PC2 ….nešto slično.
Ako pogledate, na primjer, primjer koda "BlinkWithoutDelay", pin je deklariran kao "33" …. Zašto?
Pretpostavljam da je to zato što je gospodin Marti Bolivar prenio ovaj kod za MAPLE ploču.
Mislim da mu nije bila namjera dopustiti kod kompatibilan sa pločama "Blue Pill".
Igle za mini ploču Maple i Maple numerički su deklarirane, poput Arduina, iako koriste brojeve poput 33, 24 i neke poput ovoga.
Rekao sam da kôd ne radi? Moja greška. Kod kompajlirajte bez greške i ispravno učitajte na "Blue Pill", pa mislim da zaista radi, ali ne očekujemo korištenje GPIO izlaza. Možda čak nije ni dostupan.
Stoga su potrebne male promjene u kodu kako bi radio kako se očekuje.
Korak 2: Hajdemo "definirati" neke pinove…
Dobra je praksa koda deklarirati resurse kao lako identificirajuće ili značenje varijabli ili konstanti. Omogućit će vam lakše razumijevanje koda i rješavanje problema.
Koristio sam deklariranje Arduino iglica ovako:
…
const int ledPin = 13;
…"
Ako vam se sviđam, možda se pitate: "Kako mogu proglasiti pinove s imenima poput PC13 ???"
Odgovor je: Koristite "#define" C naredbu.
Dakle, prema izvlačenju pinout -a, PC13 je pin koji imamo na LED diodi u "BluePill -u". Da bih ga koristio, proglasio bih ovako, odmah nakon definicije biblioteka (#include…) i prije svega ostalog:
…
#define LedPin PC13
…"
Imajte na umu da NE ";" prekid linije, NOR "=" dodjela.
Uporedite oba koda. Jedan je originalni primjer učitan iz IDE -a. Drugo je ono što sam prilagodio za rad sa "BluePill -om".
Toplo preporučujem da sve pinove koje namjeravate koristiti navedete u kodu. Čak i oni namjeravaju koristiti kao ADC ulaz (o tome kasnije).
Ovo će vam olakšati život.
Korak 3: PinMode () … Kako ćete koristiti svoje igle …
Prije nego nastavimo, razumijemo funkciju PinMode ().
Kao i Arduino, STM32 pinovi imaju više funkcija. Najjednostavniji način odabira jednog ili drugog načina je upotreba izraza pinMode ().
Arduino ima samo 3 načina rada, INPUT, OUTPUT ili INPUT_PULLUP.
STM32, s druge strane, ima mnogo ukusa pinMode (). Oni su:
IZLAZ -Osnovni digitalni izlaz: kada je pin VISOK, napon se održava na +3,3 V (Vcc), a kada je NISKI, povlači se na masu
OUTPUT_OPEN_DRAIN -U režimu otvorenog odvoda, pin označava "nisko" prihvatanjem protoka struje prema zemlji i "visoko" obezbeđivanjem povećane impedanse
INPUT_ANALOG -Ovo je poseban način kada će se pin koristiti za analogna (ne digitalna) čitanja. Omogućuje ADC konverziju na naponu na pinu
INPUT_PULLUP -Stanje pina u ovom načinu rada prijavljuje se na isti način kao i kod INPUT -a, ali napon pina se lagano "podiže" prema +3.3v
INPUT_PULLDOWN -Stanje pina u ovom načinu rada prijavljuje se na isti način kao i kod INPUT -a, ali napon pina se lagano "povlači" prema 0v
INPUT_FLOATING -Sinonim za INPUT
PWM -Ovo je poseban način za koji će se pin koristiti za PWM izlaz (poseban slučaj digitalnog izlaza)
PWM_OPEN_DRAIN -Slično PWM -u, osim što se umjesto izmjeničnih ciklusa LOW i HIGH, napon na pinu sastoji od naizmjeničnih ciklusa LOW i plutajućih (isključenih)
(napomena: izvučeno sa
Upravo otvaram ove zagrade jer kad počnete stvarati vlastiti kôd, pazite da koristite ispravni pinMode () za svoje potrebe.
Korak 4: AnalogWrite () naspram PwmWrite ()… Analogni izlaz u 2 okusa
Prije upotrebe GPIO pinova "Blue Pill" potrebno je deklarirati njegovo ponašanje, odnosno kako će funkcionirati. To je upravo ono što funkcija pinMode () radi.
Dakle, fokusirajmo se sada kako je ispravno postaviti analogni izlaz. Može se deklarirati ili kao OUTPUT način ili PWM način rada.
Na isti način, analogne vrijednosti se mogu pripisati GPIO -u na dva načina: analogWrite () ili pwmWrite (), ALI, analogWrite () će raditi samo ako je pinMode () = OUTPUT. S druge strane, pwmWrite () će raditi samo ako je pinMode () = PWM.
Uzmimo na primjer PA0: to je analogni/pwm izlazni kandidat.
analogWrite (): ovo se deklariše na ovaj način:
….
#define ledPin PA0
pinMode (ledPin, OUTPUT);
analogWrite (ledPin, <broj>);
……"
gdje broj mora biti između 0 i 255, poput Arduina. Zapravo, unatrag je kompatibilan s Arduinom.
pwmWrite (): deklarirajte na ovaj način:
…
#define ledPin PA0
pinMode (ledPin, PWM);
pwmWrite (ledPin, <broj.>);
…."
Gdje broj mora biti između 0 ~ 65535, rezolucija mnogo veća od Arduina.
Na slikama je moguće uporediti dva koda. Takođe možete vidjeti originalni kod.
Korak 5: STM32 serijska komunikacija
Pogledajmo kako je uređen USART interfejs u STM32. Da, interfejsi u množini…..
"Plava pilula" ima 3 USART -a (RX/ TX 1 ~ 3), a ako koristite bootloader koji vam omogućuje korištenje USB -a, nije povezan ni s jednim od njih.
Ovisno o tome koristite li ili ne USB, morate navesti serijski port na jedan ili drugi način u svom kodu.
Slučaj 1: Korištenje USB -a:
Na ovaj način skice se preuzimaju direktno putem USB -a. Nema potrebe za pomicanjem kratkospojnika BOOT0 u 1 položaj i natrag u 0.
U ovom slučaju, svaki put kada deklarirate "Serijski" bez indeksa, znači komunikacija putem USB -a.
Dakle, Serial1, znači TX/ RX 1 (pinovi PA9 i PA10); Serijski2, znači TX/ RX 2 (pinovi PA2 i PA3) i Serijski 3 znači TX/ RX 3 (pinovi PA10 i PA11).
Ovo je način na koji radimo. Predstavit ću promjene u primjerima za ovaj način kodiranja.
Još jedna stvar: "Serijski USB" ne mora se inicijalizirati. Drugim riječima, "… Serial.begin (15200);" nije potrebno.
Moguće je pozvati bilo koju serijsku funkciju (Serial.read (), Serial.write (), itd.) Bez ikakve inicijalizacije.
Ako je iz nekog razloga prisutan u kodu, kompajler će ga zanemariti.
Slučaj 2: Korištenje TTL serije na USB adapter:
Na ovaj način pokretački program ne podržava izvornu STM32 USB komunikaciju, pa vam je za prijenos skica potreban USB -serijski adapter spojen na TX/ RX 1 (pin PA9 i PA10).
U ovom slučaju, svaki put kada je "Serijski" bez indeksa kôd, znači TX/ RX1 (port koji se koristi za učitavanje koda). Dakle, Serial1 se odnosi na TX/ RX 2 (pinovi PA2 i PA3), a Serial2 se odnosi na TX/ RX 3 (Igle PA10 i PA11). Serija 3 nije dostupna.
Korak 6: Prosljeđivanje vrijednosti mikrokontroleru
Primjer zatamnjivanja je jednostavan način da pokažete kako proslijediti vrijednost mikrokontroleru.
Pretpostavlja se da će proći vrijednost od 0 do 255 za kontrolu svjetline LED -a.
NEĆE raditi prema očekivanjima u Blue Pill -u zbog:
- Da biste koristili funkciju pwmWrite (), pinMode () MORA biti deklariran kao PWM način rada.
- Nikada nećete dobiti cijeli trocifreni broj. Funkcija Serial.read () hvata samo sadržaj bafera, koji je "BYTE". ako upišete "100" i pritisnete "enter", samo posljednja "0" bit će snimljena iz međuspremnika. Njegova vrijednost bit će "48" (decimalna ASCII vrijednost za "0"). Ako namjeravate izdati vrijednost "100", potrebno je upisati "d". Dakle, ispravno je reći da će pretvoriti decimalnu vrijednost ASCII simbola u LED svjetlinu, zar ne? … Pa, neka vrsta …
- Problem, mapiranje vrijednosti direktno iz funkcije Serial.read () je trik. Gotovo je sigurno da ćete dobiti neočekivane vrijednosti. Bolji pristup je sadržaj međuspremnika za pohranu u privremenoj varijabli i NEMOJ ga mapirati.
Kao što sam već objasnio u točki 2, kod koji unosim izmjene omogućit će unos ASCII simbola i to će kontrolirati svjetlinu LED -a na osnovu njegove ASCII decimalne vrijednosti … na primjer, "razmak" je vrijednost 32 (zapravo je najniži znak za ispis koji možete unijeti) i "}" je moguće najveći (vrijednost 126). Drugi znakovi se ne mogu ispisivati, pa terminal neće razumjeti ili su moguće složeni znakovi (poput "~" je mrtva tipka na mojoj tastaturi i neće raditi ispravno). To znači da će ovaj složeni znak, kada uđe u terminal, poslati sam znak i nešto drugo. Obično se ne štampa. I da li će ovaj zadnji kod biti obuhvaćen. Također, imajte na umu da vaš terminal, u ovom slučaju, NE bi trebao slati ni "Carriage Return" ni "Line Feed". Morate obratiti pažnju na ovo kako bi kod ispravno radio.
Ako ste pali, to je malo zbunjujuće, postat će najgore ….
Korak 7: I ako želim unijeti tri znamenke…. ili još više ??
Primanje više znakova iz serijske komunikacije nije jednostavan zadatak.
Serijski međuspremnik je FIFO bajt gomila znakova. Svaki put kada se pozove funkcija Serial.read (), prvi poslani znak se uklanja sa hrpe i skladišti na nekom drugom mjestu. Obično char varijabla u kodu. Napomena, ovisno o hardveru, obično postoji vremensko ograničenje za to kako međuspremnik dnevnika može čuvati informacije.
Ako namjeravate unijeti više od jedne znamenke putem serije, morat ćete "sastaviti" niz znakova po znakove, jer oni ulaze u UART bafer.
To znači ciklično čitanje svakog međuspremnika, spremanje u temp varijablu, učitavanje na prvu poziciju nizova nizova, prelazak na sljedeću poziciju i početak ispočetka, sve dok … pa, ovisi o aplikaciji. Postoje 2 načina da završite ciklus:
- Koristeći neki znak "krajnja oznaka", poput "vraćanja nosača" ili "uvlačenja linije". Čim se znak "end Mark" pronađe, petlja završava.
- Alternativno, broj znakova u nizu može biti ograničen, pa tako i broj interaktivnih ciklusa. Kad dosegne granicu, recimo, 4, sama stječe rutinske završne obrade.
Pogledajmo na jednostavnom primjeru kako to učiniti:
- Postavite "end" char, poput '\ n' (to znači ASCII char u feedu linije).
- petlja u međuvremenu Serial.available () je istina
- spremanje Serial.read () rezultira privremenom char varijablom. Zapamtite: čim Serial.read () zaista "pročita" bafer, on je čist i u njega se učitava sljedeći znak.
- povećajte string varijablu s ovim znakom
- Ako je zadnji znak "kraj", izađite iz petlje.
Obično rutina za dobivanje serijskog niza znakova izgleda kao slika.
Zasnovan je na opsežnoj adaptaciji izvornog koda gospodina Davida A. Mellisa.
Slobodno ga koristite i isprobajte. Upamtite: vrijednosti MORAJU biti unete u trocifrenom formatu.
Ovo je to za sada. Neću se proširivati na dodatne detalje serijske komunikacije. Ovdje je previše složeno za pokrivanje i zaslužuje da posjeduje Intructables.
Nadam se da će vam pomoći u korištenju primjera u Blue Pill -u i dati vam neko prosvjetljenje koliko je ispravan kod za ovu malu ploču.
Vidimo se u drugim uputstvima.
Preporučuje se:
FLEXBALL - fleksibilna PCB kugla od sto piksela sa WiFi -em: 6 koraka (sa slikama)
FLEXBALL - fleksibilna PCB kugla od sto piksela sa WiFi -jem: Pozdrav proizvođači, ona je proizvođač moekoe! Flexball je baziran na fleksibilnoj PCB -i koja je opremljena sa 100 WS2812 2020 adresabilnih LED dioda. Upravlja se ESP8285-01f - najmanjim modulom zasnovanim na ESP -u kompanije Espressif. Dodatno ima ADXL345 akcelerometar
Interaktivni zid od LED pločica (lakše nego što izgleda): 7 koraka (sa slikama)
Interaktivni zid od LED pločica (lakše nego što izgleda): U ovom projektu izgradio sam interaktivni LED zidni ekran koristeći Arduino i 3D štampane dijelove. Inspiracija za ovaj projekt djelomično je došla od Nanoleaf pločica. Htio sam smisliti vlastitu verziju koja je ne samo pristupačnija, već i mo
HC - 06 (Slave modul) Promjena "NAME" bez upotrebe "Monitor Serial Arduino" koji "radi lako": Besprijekoran način!: 3 koraka
HC - 06 (Slave modul) Promjena "NAME" bez upotrebe "Monitor Serial Arduino" … koji "radi lako": Način bez greške!: Nakon " Dugotrajno " pokušavajući promijeniti naziv u HC - 06 (slave modul), koristeći " serijski monitor Arduina, bez " Uspješno ", pronašao sam još jedan lak način i dijelim ih sada! Zabavite se prijatelji
Napravite najsjajniju plavu svjetiljku na svijetu: 5 koraka
Napravite najsjajniju plavu svjetiljku na svijetu: Kako promijeniti boju snopa Rayovac LED svjetiljke od 3 W (ili 1 ili eventualno čak 4 W)? Želite potrošiti 30 USD na LED lampicu sa lošom svjetlošću i pretvoriti je u lošiju plavu svjetiljku? ŽELITE ZA UKIDANJE GARANCIJE?! Ne čitajte dalje, nemojte, mi bismo
Dakle, želite izgraditi divovskog robota .: 19 koraka (sa slikama)
Dakle, želite izgraditi džinovskog robota. Kažete da želite izgraditi džinovskog robota? Koja je vaša svrha? Svetska dominacija? Tvoja djevojka neće dobiti to pivo za tebe? Što god da je, evo kako započeti s izradom robota. Svrha ovog robota bila je scenski rekvizit za m