INHOUDSOPGAWE:

Dus laai u STM32duino -laaiprogram in u 'blou pil' wat dan nou ?: 7 stappe
Dus laai u STM32duino -laaiprogram in u 'blou pil' wat dan nou ?: 7 stappe

Video: Dus laai u STM32duino -laaiprogram in u 'blou pil' wat dan nou ?: 7 stappe

Video: Dus laai u STM32duino -laaiprogram in u 'blou pil' wat dan nou ?: 7 stappe
Video: РАДУЖНЫЕ ДРУЗЬЯ — КАЧКИ?! НЕЗАКОННЫЕ Эксперименты VR! 2024, November
Anonim
U laai dus STM32duino Bootloader in u
U laai dus STM32duino Bootloader in u
U laai dus STM32duino Bootloader in u
U laai dus STM32duino Bootloader in u

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?

Spelde en penne …. Waarom werk die kode nie?
Spelde 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 …

Kom ons
Kom ons

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

AnalogWrite () Versus PwmWrite () … Analoog uitvoer in 2 geure
AnalogWrite () Versus PwmWrite () … Analoog uitvoer in 2 geure
AnalogWrite () Versus PwmWrite () … Analoog uitvoer in 2 geure
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

STM32 Seriële kommunikasie
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

Gee waarde aan mikrokontroleerder oor
Gee waarde aan mikrokontroleerder oor

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:

  1. Om die pwmWrite () -funksie te gebruik, MOET pinMode () as PWM -modus verklaar word.
  2. 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 …
  3. 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 ??

En as ek drie syfers wil tik … of nog meer ??
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:

  1. Gebruik 'n 'eindteken' -karakter, soos' vervoer terug 'of' reëlvoer '. Sodra 'end Mark' char gevind word, eindig die lus.
  2. 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: