Sadržaj:
- Korak 1: Igle i iglice ….Zašto kôd ne radi?
- 2. korak: "Definirajmo" 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 bih htio upisati tri znamenke…. ili još više ??
2025 Autor: John Day | [email protected]. Zadnja promjena: 2025-01-23 14:47
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žda se ništa neće dogoditi.
Problem je u tome što mnogi, ako ne i svi primjeri za "generički" STM32 neće uspjeti. Bit će potrebne manje promjene za rad na ploči STM32 "Blue Pill".
Odabrat ću 4 primjera koda kako bih objasnio što 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 i kasno izmijenio Bryan Newbold
Stoga 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". Napomena pinovi su identificirani 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 g. Marti Bolivar prenio ovaj kôd za ploču MAPLE.
Mislim da mu nije bila namjera dopustiti kod kompatibilan s 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 pogreška. Kodiraj se bez greške i ispravno učitaj 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.
2. korak: "Definirajmo" neke pinove…
Dobra je praksa koda deklarirati resurse kao lako prepoznatljive 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 isječaka, PC13 je pin koji imamo na LED diodi u "BluePill -u". Da bih ga koristio, deklarirao bih ovako, odmah nakon definicije knjižnica (#include …) i prije svega ostalog:
…
#define LedPin PC13
…"
Imajte na umu da NE ";" prekid linije, NOR "=" dodjela.
Usporedite oba koda. Jedan je izvorni primjer učitan iz IDE -a. Druga je ona koju sam prilagodio za rad s "BluePill -om".
Toplo preporučujem da sve pinove koje namjeravate koristiti navedete u kodu. Čak i oni namjeravaju koristiti ADC ulaz (o tome kasnije).
To ć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 okusa 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 načinu otvorenog odvoda, pin označava "nisko" prihvaćanjem protoka struje prema zemlji i "visoko" osiguravajući povećanu impedanciju
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,3 V
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 dolje" prema 0v
INPUT_FLOATING -Sinonim za INPUT
PWM -Ovo je poseban način kada će se pin koristiti za PWM izlaz (poseban slučaj digitalnog izlaza)
PWM_OPEN_DRAIN -Kao PWM, osim što se umjesto izmjeničnih ciklusa LOW i HIGH, napon na pinu sastoji od izmjeničnih ciklusa LOW i plutajućih (isključenih)
(napomena: izvučeno iz
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 uporabe GPIO pinova "Blue Pill" potrebno je deklarirati njegovo ponašanje, tj. 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 deklarirajte 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, razlučivost mnogo veća od Arduina.
Na slikama je moguće usporediti dva koda. Također možete vidjeti izvorni kod.
Korak 5: STM32 serijska komunikacija
Pogledajmo kako su uređena USART sučelja u STM32. Da, sučelja 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 USB ili ne, morate u svom kodu deklarirati serijski port na jedan ili drugi način.
Slučaj 1: Korištenje USB -a:
Na ovaj način skice se preuzimaju izravno 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), a serijski 3 znači TX/ RX 3 (pinovi PA10 i PA11).
Ovo je način na koji radimo. Iznijet ću promjene u primjerima za ovaj način kodiranja.
Još jedna stvar: "Serijski USB" ne treba 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, prevoditelj će ga zanemariti.
Slučaj 2: Korištenje TTL serije na USB adapter:
Na taj 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). Pa nadalje, 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 jednostavan je način da se pokaže 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:
- Za korištenje funkcije pwmWrite (), pinMode () MORA biti deklariran kao PWM način rada.
- Nikada nećete dobiti cijeli troznamenkasti broj. Funkcija Serial.read () hvata samo sadržaj međuspremnika, 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 svjetlinu LED -a, zar ne ?? … Pa, neka vrsta …
- Problem, mapiranje vrijednosti izravno 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 je 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 temelju njegove decimalne vrijednosti ASCII … na primjer, "razmak" je vrijednost 32 (zapravo je najniži znak za ispis koji možete unijeti) a "}" je moguće najveći (vrijednost 126). Drugi znakovi se ne mogu ispisivati, pa terminal neće razumjeti ili su mogući slogovi znakova (poput "~" je mrtva tipka na mojoj tipkovnici i neće raditi ispravno). To znači da će ovaj složeni znak, kada uđete u terminal, poslati sam znak i nešto drugo. Obično se ne ispisuje. I hoće li ovaj zadnji kod biti obuhvaćen. Također, imajte na umu da vaš terminal, u ovom slučaju, NE smije slati ni "Carriage Return" niti "Line Feed". Morate obratiti pozornost na ovo kako bi kod ispravno radio.
Ako ste pali, to je malo zbunjujuće, bit će najgore …….
Korak 7: I ako bih htio upisati tri znamenke…. ili još više ??
Primanje više znakova iz serijske komunikacije nije jednostavan zadatak.
Serijski međuspremnik je FIFO bajt hrpa znakova. Svaki put kada se funkcija Serial.read () pozove, prvi poslani znak se uklanja s hrpe i pohranjuje na neko drugo mjesto. Obično char varijabla u kodu. Napomena, ovisno o hardveru, obično postoji vrijeme čekanja 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 znak, jer oni ulaze u UART međuspremnik.
To znači cikličko č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 dva načina za završetak ciklusa:
- Upotreba nekog znaka "krajnja oznaka", poput "vraćanja nosača" ili "uvlačenja linije". Čim se pronađe znak "kraj oznake", 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 retka).
- petlja u međuvremenu Serial.available () je istina
- spremanje Serial.read () rezultira privremenom varijablom char. Zapamtite: čim Serial.read () zapravo "pročita" međuspremnik, on je čist i u njega se učitava sljedeći znak.
- povećajte niz varijablu s ovim znakom
- Ako je zadnji znak "kraj", izađite iz petlje.
Obično rutina za dobivanje serijskog niza znakova izgleda poput slike.
Temeljen je na opsežnoj adaptaciji izvornog koda gospodina Davida A. Mellisa.
Slobodno ga koristite i isprobajte. Upamtite: vrijednosti MORAJU biti unijete u troznamenkasti format.
Ovo je to za sada. Neću se dodatno proširivati detaljima serijske komunikacije. Ovdje je previše složeno za pokrivanje i zaslužuje vlastite Neukrotive.
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 uputama.
Preporučeni:
Što je dvosmislen osjećaj_ "EMEMOHO": 5 koraka
Što je dvosmislen osjećaj_ "EMEMOHO": Projekt je KNUA (Korea National University of Arts) centar fuzijske umjetnosti, < tim koji vodi 2019: Hej, stranci. Učinite to zajedno! ≫. Ovo je rezultat tima "Slaba nada". U ovom projektu definirali smo izraze koji imaju dva kontrasta
HC - 06 (Slave modul) Promjena "NAME" bez upotrebe "Monitor Serial Arduino" koji "radi jednostavno": Besprijekoran način!: 3 koraka
HC - 06 (Slave modul) Promjena "NAME" bez upotrebe "Monitor Serial Arduino" … koji "radi lako": Besprijekoran način!: Nakon " Dugotrajno " pokušavajući promijeniti naziv u HC - 06 (slave modul), koristeći " serijski monitor Arduina, bez " Uspjeh ", pronašao sam drugi jednostavan način i dijelim ih sada! Zabavite se prijatelji
Napravite najsvjetliju 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 možda čak 4 W)? Želite potrošiti 30 USD na badass LED svjetiljku 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 divovskog robota. Kažete da želite izgraditi divovskog robota? Koja je vaša svrha? Svjetska dominacija? Tvoja djevojka neće dobiti to pivo za tebe? Što god to bilo, evo kako započeti s izradom robota. Svrha ovog robota bila je scenski rekvizit za m
Igrajte bilo što od NES -a do Xbox -a sa Skittlespider -om A.T.S Aka "The Contraption": 11 koraka (sa slikama)
Igrajte bilo što od NES -a do Xbox -a sa Skittlespider A.T.S -om zvanim "The Contraption": Ova instrukcija je za Skittlespider A.T.S (All Together System) također poznat kao "The Contraption" Ovaj se projekt pokazao težim nego što sam očekivao. Na nekoliko načina bilo je i lakše, pa ne mogu reći da je to bio sveukupno težak ili lagan projekt