INHOUDSOPGAWE:
- Stap 1: penne en penne …. Waarom werk die kode nie?
- Stap 2: Kom ons definieer 'n paar penne …
- Stap 3: PinMode () … Hoe u u penne sal gebruik …
- Stap 4: AnalogWrite () Versus PwmWrite () … Analoog uitvoer in 2 geure
- Stap 5: STM32 seriële kommunikasie
- Stap 6: Gee 'n waarde oor aan mikrobeheerder
- Stap 7: En as ek drie syfers wil tik … of nog meer ??
Video: Dus laai u STM32duino -laaiprogram in u 'blou pil' wat dan nou ?: 7 stappe
2024 Outeur: John Day | [email protected]. Laas verander: 2024-01-30 07:24
As u al my instruksies gelees het waarin ek verduidelik hoe die laai van die STM32duino -laaiprogram of enige ander soortgelyke dokumentasie, probeer u 'n voorbeeld van 'n laaikode en … kan niks gebeur nie.
Die probleem is dat baie, indien nie alle voorbeelde vir 'generiese' STM32 nie uit die boks sal werk nie. Dit sal geringe veranderinge nodig wees om dan in u STM32 "Blue Pill" -bord te werk.
Ek sal 4 kode voorbeelde kies om te verduidelik wat moet verander en waarom. Kodes is: "BlinkWithoutDelay", "Fading", "Dimmer" en "AnalogInSerial".
Let daarop dat ek niks gekodeer het nie. Ek gee net klein veranderinge aan in kodes wat deur:
David A. Mellis en laat aangepas deur Tom Igoe, Marti Bolivar en 'n paar gevalle deur Scott Fitzgerald
Tom Igoe en laat aangepas deur Bryan Newbold
Dus, ek verkies om die outeurname te hou, selfs in kodes wat ek verander, terwyl ek die skeppingskrediet behou.
Stap 1: penne en penne …. Waarom werk die kode nie?
Kom ons kyk na die pen STM32 "Blue Pill". Let op dat penne geïdentifiseer word as PA1 of PC2 …. so iets.
As u byvoorbeeld in die kode -voorbeeld van "BlinkWithoutDelay" kyk, word die pen as "33" verklaar …. Waarom?
Ek vermoed dit is omdat mnr. Marti Bolivar hierdie kode vir die MAPLE -bord oorgedra het.
Ek dink dit was nie sy bedoeling dat die kode versoenbaar is met die "Blue Pill" -borde nie.
Maple en Maple mini -bordpenne word numeries verklaar, net soos Arduino, hoewel hulle getalle soos 33, 24 en sommige hiervan gebruik.
Ek het gesê dat kode nie werk nie? My fout. Kode stel sonder enige fout op en laai dit korrek op na "Blue Pill", so myns insiens dit werk, maar ons verwag nie 'n GPIO -uitset nie. Mag nie eers beskikbaar wees nie.
Daar is dus min veranderinge aan die kode nodig om te werk soos verwag.
Stap 2: Kom ons definieer 'n paar penne …
Dit is 'n goeie kode praktyk verklaar hulpbronne as maklik identifiseer of beteken veranderlikes of konstante. Hiermee kan u die kode makliker verstaan en probleme oplos.
Ek gebruik Arduino -penne soos volg:
…
const int ledPin = 13;
…"
As u van my hou, vra u uself miskien af: "Hoe kan ek penne met name soos PC13 verklaar ???"
Die antwoord is: Gebruik '#define' C -stelling.
Dus, volgens pinout -trekking, is PC13 die pen wat ons aan boord LED in "BluePill" het. Om dit te gebruik, sou ek so verklaar, net na die definisie van biblioteke (#insluit …) en voor enigiets anders:
…
#definieer LedPin PC13
…"
Let daarop dat daar NEE is ";" lynbeëindiging, NOR "=" opdrag.
Vergelyk albei kodes. Die een is die oorspronklike voorbeeld wat vanaf IDE gelaai is. Tweedens is die een wat ek aangepas het om met "BluePill" te werk.
Ek beveel sterk aan dat u alle penne wat u van plan is om in kode te gebruik, verklaar. Selfs diegene wat van plan is om dit as ADC -invoer te gebruik (meer hieroor later).
Dit sal jou lewe makliker maak.
Stap 3: PinMode () … Hoe u u penne sal gebruik …
Laat ons eers die funksie van PinMode () verstaan.
Net soos Arduino, het STM32 -penne verskeie funksies. Die eenvoudigste manier om die een of ander te kies, is deur pinMode () -verklaring te gebruik.
Arduino het slegs drie modusse beskikbaar: INPUT, OUTPUT of INPUT_PULLUP.
STM32, aan die ander kant, het baie geure van pinMode (). Hulle is:
UITGANG -Basiese digitale uitset: as die pen HOOG is, word die spanning op +3.3v (Vcc) gehou, en as dit LAAG is, word dit na die grond getrek
OUTPUT_OPEN_DRAIN -In die oop dreineringsmodus dui die pen "laag" aan deur die huidige vloei na die grond en "hoog" te aanvaar deur 'n verhoogde impedansie te bied
INPUT_ANALOG -Dit is 'n spesiale modus vir wanneer die pen gebruik sal word vir analoog (nie digitaal) lees. Hiermee kan ADC -omskakeling uitgevoer word op die spanning by die pen
INPUT_PULLUP -Die toestand van die pen in hierdie modus word op dieselfde manier gerapporteer as met INPUT, maar die penspanning word saggies "opgetrek" na +3.3v
INPUT_PULLDOWN -Die toestand van die pen in hierdie modus word op dieselfde manier as met INPUT gerapporteer, maar die penspanning word saggies "afgetrek" na 0v
INPUT_FLOATING -Sinoniem vir INPUT
PWM -Dit is 'n spesiale modus vir wanneer die pen vir PWM -uitset gebruik sal word ('n spesiale geval van digitale uitset)
PWM_OPEN_DRAIN -Net soos PWM, behalwe dat die spanning op die pen in plaas van afwisselende siklusse van LOW en HIGH bestaan uit afwisselende siklusse van LOW en floating (losgemaak)
(let wel: onttrek uit
Ek maak hierdie hakie oop, want as u u eie kode begin skep, moet u die korrekte pinMode () vir u behoefte gebruik.
Stap 4: AnalogWrite () Versus PwmWrite () … Analoog uitvoer in 2 geure
Voordat u 'Blue Pill' GPIO -penne gebruik, moet u die gedrag daarvan verklaar, dit wil sê hoe dit sal werk. Dit is presies wat pinMode () funksie doen.
Dus, laat ons nou fokus op hoe korrek 'n analoog uitset gestel word. Dit kan óf as OUTPUT -modus óf PWM -modus verklaar word.
Op dieselfde manier kan analoogwaardes op twee maniere aan GPIO toegeskryf word: analogWrite () of pwmWrite (), MAAR, analogWrite () SAL slegs werk as pinMode () = OUTPUT. Aan die ander kant sal pwmWrite () slegs werk as pinMode () = PWM.
Kom ons neem byvoorbeeld PA0: dit is 'n analoog/pwm -uitsetkandidaat.
analogWrite (): dit verklaar op hierdie manier:
….
#define ledPin PA0
pinMode (ledPin, OUTPUT);
analogWrite (ledPin, <number>);
……"
waar die getal tussen 0 en 255 moet wees, soos Arduino. Dit is eintlik agteruit versoenbaar met Arduino.
pwmWrite (): verklaar op hierdie manier:
…
#define ledPin PA0
pinMode (ledPin, PWM);
pwmWrite (ledPin, <number.>);
…."
Waar die getal tussen 0 ~ 65535 moet wees, 'n resolusie veel hoër as Arduino.
In beelde is dit moontlik om te vergelyk tussen 2 kodes. U kan ook die oorspronklike kode sien.
Stap 5: STM32 seriële kommunikasie
Kom ons kyk hoe die USART -koppelvlakke in STM32 ingerig is. Ja, koppelvlakke in meervoud ….
'Blue Pill' het 3 USART's (RX/ TX 1 ~ 3), en as u 'n selflaaiprogram gebruik, kan u USB gebruik, is dit dan nie aan die een of ander tyd gekoppel nie.
Afhangende van die feit dat u USB al dan nie gebruik, moet u die seriële poort op een of ander manier in u kode verklaar.
Geval 1: Gebruik USB:
Op hierdie manier word sketse direk via USB afgelaai. Dit is nie nodig om die BOOT0 -trui na 1 posisie te skuif en terug na 0 nie.
In hierdie geval beteken kommunikasie via USB elke keer as u 'Serial' sonder 'n indeks verklaar.
Dus, Serial1, beteken TX/ RX 1 (penne PA9 en PA10); Serial2, beteken TX/ RX 2 (penne PA2 en PA3) en Serial 3 beteken TX/ RX 3 (penne PA10 en PA11).
Dit is die manier waarop ons werk. Ek sal veranderinge in voorbeelde vir hierdie manier van kodering aanbied.
'N Ander ding:' Serial USB 'hoef nie geïnitialiseer te word nie. Met ander woorde, "… Serial.begin (15200);" is nie nodig nie.
Dit is moontlik om enige Serial -funksie (Serial.read (), Serial.write (), ens) te noem sonder inisialisering.
As dit om een of ander rede in die kode voorkom, sal die samesteller dit ignoreer.
Geval 2: Gebruik TTL seria na USB -adapter:
Op hierdie manier ondersteun bootloader nie inheemse STM32 USB -kommunikasie nie, dus benodig u 'n USB -na -seriële adapter wat gekoppel is aan TX/ RX 1 (pen PA9 en PA10) om sketse op te laai.
In hierdie geval beteken die kode "Serial" sonder 'n indeks TX/ RX1 (poort wat gebruik word om die kode op te laai). So aan, Serial1 verwys na TX/ RX 2 (penne PA2 en PA3) en Serial2 verwys na TX/ RX 3 (penne PA10 en PA11). Geen Serial3 beskikbaar nie.
Stap 6: Gee 'n waarde oor aan mikrobeheerder
Dimmer voorbeeld is 'n eenvoudige manier om aan te toon hoe 'n waarde aan mikrobeheerder oorgedra word.
Dit veronderstel om 'n waarde van 0 tot 255 te slaag om die helderheid van LED's te beheer.
Dit werk NIE soos verwag in Blue Pill nie:
- Om die pwmWrite () -funksie te gebruik, MOET pinMode () as PWM -modus verklaar word.
- U kry nooit 'n hele 3 -syfergetal nie. Die funksie Serial.read () vang net bufferinhoud op, wat 'n 'BYTE' is. as u "100" tik en "enter" druk, word slegs die laaste "0" uit buffer vasgelê. En die waarde daarvan is "48" (desimale ASCII -waarde vir "0"). As u van plan is om waarde "100" uit te gee, moet u "d" tik. Dit is dus korrek om te sê dat dit 'n desimale waarde van die ASCII -simbool in LED -helderheid sal omskep, nie waar nie … …. Wel, 'n soort …
- Probleem, kaartwaardes direk vanaf die Serial.read () -funksie is 'n truukaksie. Dit is byna seker dat u onverwagte waardes kry. 'N Beter benadering is die inhoud van die stoorbuffer in 'n tydelike veranderlike en dan dit in kaart bring.
Soos ek voorheen in item 2 verduidelik het, kan die kode wat ek verander, 'n ASCII -simbool invoer, en dit sal die LED -helderheid beheer op grond van sy ASCII desimale waarde … byvoorbeeld, "spasie" is waarde 32 (eintlik is die laagste drukbare karakter wat u kan invoer) en "}" is moontlik die hoogste (waarde 126). Ander karakters kan nie gedruk word nie, so die terminaal sal dit nie verstaan nie, of dit is moontlik 'n samestelling van karakter (soos '~' is 'n dooie sleutel op my sleutelbord en werk nie korrek nie). Dit beteken dat hierdie saamgestelde karakter, wanneer dit in die terminale ingaan, die karakter self en iets anders sal stuur. Gewoonlik 'n nie -drukbare een. En is dit die laaste een wat die kode sal vasvang? Hou ook in gedagte dat u terminale in hierdie geval NIE 'koetsopgawe' of 'lynvoer' moet stuur nie. U moet hieraan aandag gee om die kode korrek te laat werk.
As u geval het, is dit min verwarrend, dit word die ergste ….
Stap 7: En as ek drie syfers wil tik … of nog meer ??
Ontvang veelvuldige karakters uit 'n reekskommunikasie is nie 'n eenvoudige taak nie.
Die reeksbuffer is 'n FIFO -bytstapel karakters. Elke keer as die Serial.read () -funksie bel, word die eerste handtekening wat uitgestuur word uit die stapel verwyder en in 'n ander plek gestoor. Gewoonlik 'n char veranderlike in kode. Let op, hang af van hardeware, gewoonlik is daar 'n tydsduur vir hoe logbuffer inligting kan bewaar.
As u van voorneme is om meer as een syfer via reeks in te voer, moet u 'n string teken vir karakter 'saamstel', aangesien dit by UART -buffer kom.
Dit beteken fietsry lees elke buffer char, stoor in 'n temp veranderlike, laai dit in die eerste posisie van 'n string array, skuif na die volgende posisie en begin weer, totdat … wel, hang van toepassing af. Daar is 2 maniere om die siklus te beëindig:
- Gebruik 'n 'eindteken' -karakter, soos' vervoer terug 'of' reëlvoer '. Sodra 'end Mark' char gevind word, eindig die lus.
- Alternatiewelik kan die aantal karakters in die stringketting beperk word, so ook die aantal interaktiewe siklusse. As dit die limiet bereik, laat ons sê, 4, verkry self roetine -afwerkings.
Kom ons kyk in 'n eenvoudige voorbeeld hoe ons dit doen:
- Stel 'n "einde" -teken in, soos '\ n' (dit beteken lynvoer ASCII -teken).
- loop, terwyl Serial.available () waar is
- Die stoor van Serial.read () lei tot 'n tydelike veranderlike. Onthou: sodra Serial.read () buffer eintlik "lees", is dit skoon en word die volgende karakter daarin gelaai.
- verhoog 'n string veranderlike met hierdie char
- As die laaste char "einde" is, verlaat die lus.
Gewoonlik lyk die roetine om 'n reeks reekskarakter te kry, soos 'n prentjie.
Dit was gebaseer op 'n uitgebreide aanpassing van die oorspronklike kode van David A. Mellis.
Voel vry om dit te gebruik en te toets. Onthou: waardes MOET in 3 syfers formaat ingevoer word.
Dit is dit vir nou. Ek sal myself nie uitbrei met bykomende seriële kommunikasie -besonderhede nie. Dit is te ingewikkeld om hier te dek, en dit verdien sy eie Intructables.
Ek hoop dat dit u kan help om voorbeelde in Blue Pill te gebruik en u 'n bietjie insig te gee oor die korrekte kode vir hierdie bordjie.
Sien jou in ander instruksies.
Aanbeveel:
Broek wat u telefoon laai: 6 stappe (met foto's)
Broek wat u telefoon laai: ons neem dus byna 1000 stappe per dag sonder om my fisieke aktiwiteite wat ek gewoonlik doen, te tel, en as u gereeld fietsryers soos ek is, tel dit ook. En wat as ons die elektrisiteit op een of ander manier kan benut om goed te laai? Dit is dus 'n instruksie
Geen plas nou nie, 'n toestel vir aanpassing van troeteldiere wat die katte keer om in u huis te plas: 4 stappe
No Pee Now, Pet Behavior Adjustment Device waarmee die katte in u huis kan plas: ek het my kat so gepla dat sy daarvan hou om op my bed te piepie, ek het alles nagegaan wat ek nodig het en ek het haar ook na die veearts geneem. Nadat ek alles wat ek kan dink, ontstel en na die dokter se woord geluister het, besef ek dat sy net 'n slegte gedrag het. So die
Die herstel van 'n Lenovo IdeaPad -skootrekenaar wat nie laai nie: 3 stappe
Die herstel van 'n Lenovo IdeaPad -skootrekenaar wat nie laai nie: laaiers is soms suiwer, maar soms is dit nie die laaier nie. Maar nou is dit tyd om te leer hoe u 'n skootrekenaar moet opereer om dit te herstel !!! U HET NODIG: 'n Phillips -skroewedraaier met 'n punt van 5 mm oor 'n kragaansluiting - in Amazon soek na (u model)
DIY sonlaaier wat selfone kan laai: 10 stappe
DIY sonkraglaaier wat selfone kan laai: In reaksie op die kragtekort tydens die ramp, het ons 'n paar dae gelede 'n tutoriaal vir kinetiese kragopwekking geloods. Maar waar is daar geen manier om genoeg kinetiese energie te kry nie? Watter metode gebruik ons om elektrisiteit te verkry? Benewens kinetiese
Probleemoplossing van telefone en tablette wat stadig laai: 7 stappe
Probleme met die oplaai van telefone en tablette: dit lyk soms asof dit ewig neem om 'n toestel op te laai. Dit is moontlik dat die battery sleg kan gaan, maar dit is meer waarskynlik dat dit iets anders is. Gelukkig is dit waarskynlik iets maklik om op te los.Dit is 'n baie eenvoudige instruksie