Përmbajtje:

Pra, ju Ngarkoni STM32duino Bootloader në "Pilula juaj Blu" Pra, Çfarë Tani ?: 7 Hapa
Pra, ju Ngarkoni STM32duino Bootloader në "Pilula juaj Blu" Pra, Çfarë Tani ?: 7 Hapa

Video: Pra, ju Ngarkoni STM32duino Bootloader në "Pilula juaj Blu" Pra, Çfarë Tani ?: 7 Hapa

Video: Pra, ju Ngarkoni STM32duino Bootloader në
Video: Как записать загрузчик Outseal PLC Nano на Arduino Nano 2024, Korrik
Anonim
Pra, ju ngarkoni STM32duino Bootloader në tuajin
Pra, ju ngarkoni STM32duino Bootloader në tuajin
Pra, ju ngarkoni STM32duino Bootloader në tuajin
Pra, ju ngarkoni STM32duino Bootloader në tuajin

Nëse tashmë i keni lexuar udhëzimet e mia që shpjegojnë se si ngarkoni STM32duino bootloader ose ndonjë dokumentacion tjetër të ngjashëm, provoni shembullin e kodit të ngarkimit dhe….ndoshta asgjë nuk ndodh fare.

Problemi është, shumë, nëse jo të gjithë shembujt për "Generic" STM32 nuk do të funksionojnë jashtë kutisë. Do të jenë të nevojshme ndryshime të vogla për të filluar punën në bordin tuaj STM32 "Blue Pill".

Unë do të zgjedh 4 shembuj të kodit për të shpjeguar se çfarë duhet të ndryshojë dhe pse. Kodet janë: "BlinkWithoutDelay", "Fading", "Dimmer" dhe "AnalogInSerial".

Shënim NUK kam koduar asgjë. Unë vetëm lëshoj ndryshime të vogla në kodet e krijuara nga:

David A. Mellis dhe i modifikuar vonë nga Tom Igoe, Marti Bolivar dhe disa raste nga Scott Fitzgerald

Tom Igoe dhe i modifikuar vonë nga Bryan Newbold

Pra, unë preferoj të mbaj emrat e autorëve edhe në kodet që modifikoj, duke mbajtur kreditin e krijimit.

Hapi 1: Kunjat dhe kunjat…. Pse Kodi Nuk Punon?

Kunjat dhe Kunjat…. Pse Kodi Nuk Punon?
Kunjat dhe Kunjat…. Pse Kodi Nuk Punon?

Le të hedhim një vështrim në kunjin STM32 "Blue Pill". Shënim kunjat identifikohen si PA1 ose PC2 …. Diçka e tillë.

Nëse i hidhni një sy, për shembull, shembullit të kodit "BlinkWithoutDelay", kunja deklarohet si "33" …. Pse?

Unë dyshoj se kjo ndodh sepse z. Marti Bolivar e transferoi këtë kod për bordin MAPLE.

Unë mendoj se nuk ishte qëllimi i tij që kodet të përputheshin me tabelat e "Blue Pill".

Këmbët mini të bordit Maple dhe Maple janë numerike të deklaruara, si Arduino, megjithëse përdorin numra si 33, 24 dhe disa si ky.

Unë thashë që kodi nuk funksionon? Gabimi im. Kodi përpilohet pa asnjë gabim dhe ngarkohet saktë në "Blue Pill", kështu që, mendimi im është me të vërtetë duke punuar, por duke përdorur një dalje GPIO ne nuk presim. Mund të mos jetë as në dispozicion.

Pra, ndryshime të vogla janë të nevojshme në kodin për të punuar ashtu siç pritej.

Hapi 2: Le të "përcaktojmë" disa kunja…

Le të
Le të

Ashtë një praktikë e mirë e kodit që deklaron burimet si të lehtë për tu identifikuar ose kuptuar variabla ose konstante. Kjo do t'ju lejojë të kodoni më lehtë për t'u kuptuar dhe zgjidhur problemet.

Kam përdorur kunjat e deklaruara Arduino si kjo:

const int ledPin = 13;

…"

Nëse ju pëlqen mua, ndoshta po pyesni veten: "Si mund t'i deklaroj kunjat me emra si PC13 ???"

Përgjigja është: Përdorni deklaratën "#define" C.

Pra, sipas barazimit pinout, PC13 është kunja që kemi në bordin LED në "BluePill". Për ta përdorur atë, unë do të deklaroja kështu, menjëherë pas përcaktimit të bibliotekave (#përfshini…) dhe para çdo gjëje tjetër:

#përcaktoni LedPin PC13

…"

Vini re se NUK ka ";" përfundimi i linjës, caktimi NOR "=".

Krahasoni të dy kodet. Njëra është shembulli origjinal i ngarkuar nga IDE. E dyta është ajo që kam rregulluar për të punuar me "BluePill".

Unë rekomandoj fuqimisht të deklaroni të gjitha kunjat që keni ndërmend të përdorni në kod. Edhe ata kanë ndërmend të përdorin si input ADC (më shumë për këtë më vonë).

Kjo do ta bëjë jetën tuaj të lehtë.

Hapi 3: PinMode ()… Si do të përdorni kunjat tuaja…

Para se të vazhdoni, le të kuptojmë funksionimin e PinMode ().

Ashtu si Arduino, pin -et STM32 kanë funksione të shumta. Mënyra më e thjeshtë për të zgjedhur njërën ose tjetrën është përdorimi i deklaratës pinMode ().

Arduino ka vetëm 3 mënyra në dispozicion, INPUT, OUTPUT, ose INPUT_PULLUP.

STM32, nga ana tjetër kanë shumë shije të pinMode (). Ata janë:

OUTPUT -Dalja bazë dixhitale: kur kunja është e LART, tensioni mbahet në +3.3v (Vcc) dhe kur është I UL,, tërhiqet poshtë në tokë

OUTPUT_OPEN_DRAIN -Në mënyrën e kullimit të hapur, kunja tregon "e ulët" duke pranuar rrjedhën aktuale në tokë dhe "e lartë" duke siguruar rezistencë të shtuar

INPUT_ANALOG -Kjo është një mënyrë e veçantë kur pin do të përdoret për lexime analoge (jo dixhitale). Mundëson që konvertimi ADC të kryhet në tensionin në kunj

INPUT_PULLUP -Gjendja e kunjit në këtë mënyrë raportohet njësoj si me INPUT, por tensioni i kunjit "tërhiqet" butësisht drejt +3.3v

INPUT_PULLDOWN -Gjendja e kunjit në këtë mënyrë raportohet njësoj si me INPUT, por tensioni i kunjit "tërhiqet" butësisht drejt 0v

INPUT_FLOATING -Sinonim për INPUT

PWM -Kjo është një mënyrë e veçantë kur pin do të përdoret për daljen PWM (një rast i veçantë i daljes dixhitale)

PWM_OPEN_DRAIN -Si PWM, me përjashtim të faktit që në vend të cikleve alternative të LOW dhe HIGH, tensioni në kunj përbëhet nga cikle të alternuara të LOW dhe lundrues (të shkëputur)

(shënim: nxjerrë nga

Unë sapo hap këtë parantezë sepse kur filloni të krijoni kodin tuaj, kini kujdes të përdorni pinMode () të duhur për nevojat tuaja.

Hapi 4: AnalogWrite () kundrejt PwmWrite ()… Prodhimi analog në 2 shije

AnalogWrite () kundrejt PwmWrite ()… Prodhimi analog në 2 shije
AnalogWrite () kundrejt PwmWrite ()… Prodhimi analog në 2 shije
AnalogWrite () kundrejt PwmWrite ()… Prodhimi analog në 2 shije
AnalogWrite () kundrejt PwmWrite ()… Prodhimi analog në 2 shije

Para përdorimit të kunjave "Blue Pill" GPIO është e nevojshme të deklaroni sjelljen e tij, domethënë se si do të funksionojë. Kjo është pikërisht ajo që bën funksioni pinMode ().

Pra, le të përqëndrohemi tani se sa saktë vendosim një dalje analoge. Mund të deklarohet ose si mënyrë OUTPUT ose PWM.

Në të njëjtën mënyrë, vlerat analoge mund t'i atribuohen GPIO në 2 mënyra: analogWrite () ose pwmWrite (), POR, analogWrite () DO të funksionojnë vetëm nëse pinMode () = OUTPUT. Nga ana tjetër, pwmWrite () DO të funksionojë vetëm nëse pinMode () = PWM.

Le të marrim PA0, për shembull: është një kandidat dalës analog/pwm.

analogWrite (): kjo deklarohet në këtë mënyrë:

….

#përcaktoni ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <numri>);

……"

ku numri duhet të jetë midis 0 dhe 255, si Arduino. Në fakt, është i pajtueshëm prapa me Arduino.

pwmWrite (): deklaro në këtë mënyrë:

#përcaktoni ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <numri.>);

…."

Ku numri duhet të jetë midis 0 ~ 65535, një rezolutë shumë më e lartë se Arduino.

Në imazhe është e mundur të krahasohet midis 2 kodeve. Ju gjithashtu mund të shihni kodin origjinal.

Hapi 5: Komunikimi Serial STM32

Komunikimi Serial STM32
Komunikimi Serial STM32

Le të shohim se si janë rregulluar ndërfaqet USART në STM32. Po, ndërfaqet në shumës…..

"Blue Pill" ka 3 USART (RX/ TX 1 ~ 3), dhe, nëse jeni duke përdorur një bootloader ju lejon të përdorni USB, ai nuk është i lidhur me asnjë prej atyre atëherë.

Në varësi të përdorimit ose jo të USB -së, duhet të deklaroni portin serik në një mënyrë tjetër në kodin tuaj.

Rasti 1: Përdorimi i USB:

Në këtë mënyrë, skicat shkarkohen drejtpërdrejt përmes USB. Nuk ka nevojë të zhvendosni kërcyesin BOOT0 në 1 pozicion dhe përsëri në 0.

Në këtë rast, çdo herë që deklaroni "Serial" pa indeks, do të thotë komunikim përmes USB.

Pra, Serial1, do të thotë TX/ RX 1 (Kunjat PA9 dhe PA10); Serial2, do të thotë TX/ RX 2 (kunjat PA2 dhe PA3) dhe Serial 3 do të thotë TX/ RX 3 (Kunjat PA10 dhe PA11).

Kjo është mënyra me të cilën po punojmë. Unë do të paraqes ndryshime në shembuj për këtë mënyrë të kodimit.

Një gjë tjetër: "Serial USB" nuk ka nevojë të inicializohet. Me fjalë të tjera, "… Serial.fillo (15200);" nuk është e nevojshme.

Callshtë e mundur të thërrisni çdo funksion Serial (Serial.read (), Serial.write (), etj) pa asnjë inicializim.

Nëse për ndonjë arsye është i pranishëm në kod, përpiluesi do ta injorojë atë.

Rasti 2: Përdorimi i serisë TTL në përshtatësin USB:

Në këtë mënyrë, bootloader nuk mbështet komunikimin amtare USB STM32, kështu që keni nevojë për një përshtatës USB në serial të lidhur me TX/ RX 1 (pin PA9 dhe PA10) për të ngarkuar skica.

Në këtë rast, çdo kohë "Serial" pa indeks është kodi, do të thotë TX/ RX1 (porti i përdorur për të ngarkuar kodin). Kështu, Serial1 i referohet TX/ RX 2 (kunjat PA2 dhe PA3) dhe Serial2 i referohet TX/ RX 3 (Kunjat PA10 dhe PA11). Nuk ka Serial3 në dispozicion.

Hapi 6: Kalimi i një vlere te mikrokontrolluesi

Kalimi i një vlere te mikrokontrolluesi
Kalimi i një vlere te mikrokontrolluesi

Shembulli Dimmer është një mënyrë e thjeshtë për të treguar se si i kalon një vlerë mikrokontrolluesit.

Supozoni se kalon një vlerë nga 0 në 255 për të kontrolluar shkëlqimin e LED.

NUK do të funksionojë siç pritej në Blue Pill për shkak:

  1. Për të përdorur funksionin pwmWrite (), pinMode () DUHET të deklarohet si modalitet PWM.
  2. Ju kurrë nuk do të merrni një numër të plotë me 3 shifra. Funksioni Serial.read () kap vetëm përmbajtje tampon, e cila është një "BYTE". nëse shtypni "100" dhe shtypni "enter", vetëm "0" i fundit do të kapet nga tamponi. Dhe vlera e tij do të jetë "48" (vlera dhjetore ASCII për "0"). Nëse synoni të lëshoni vlerën "100", është e nevojshme të shkruani "d". Pra, është e saktë të thuhet se do të shndërrojë një vlerë dhjetore të simbolit ASCII në shkëlqimin LED, apo jo…. Epo, një lloj…
  3. Problemi, vlerat e hartës drejtpërdrejt nga funksioni Serial.read () është një veprim mashtrues. Almostshtë pothuajse e sigurtë që merrni vlera të papritura. Qasje më e mirë është ruajtja e përmbajtjes tampon në një ndryshore të përkohshme dhe THAN hartoj atë.

Ashtu siç e shpjegova më parë në pikën 2, kodi që prezantoj ndryshimet do të lejojnë futjen e një simboli ASCII dhe kjo do të kontrollojë shkëlqimin e LED bazuar në vlerën e tij dhjetore ASCII … për shembull, "hapësira" është vlera 32 (në fakt është karakteri më i ulët i printueshëm që mund të futni) dhe "}" është e mundur më e larta (vlera 126). Karakteret e tjerë nuk janë të printueshëm, kështu që terminali nuk do të kuptojë ose janë të mundshëm një përbërës i karakterit (si "~" është një çelës i vdekur në tastierën time dhe nuk do të funksionojë si duhet). Kjo do të thotë, ky karakter i përbërë, kur futet në terminal, do të dërgojë vetë karakterin dhe diçka tjetër. Zakonisht nuk është e printueshme. Dhe a është ky kodi i fundit që do të kapë. Gjithashtu, mbani në mend Terminalin tuaj, në këtë rast, NUK duhet të dërgoni as "Kthimi i Transportit" as "Burimi i Linjës". Ju duhet t'i kushtoni vëmendje kësaj që kodi të funksionojë si duhet.

Nëse bini është pak konfuze, bëhet më e keqja…..

Hapi 7: Dhe nëse do të doja të shkruaja tre shifra…. apo edhe me shume ??

Dhe nëse do të doja të shkruaja tre shifra…. apo edhe me shume ??
Dhe nëse do të doja të shkruaja tre shifra…. apo edhe me shume ??

Marrja e karakterit të shumëfishtë nga një komunikim serik nuk është një detyrë e thjeshtë.

Tampon serik është një grumbull karakteresh FIFO byte. Sa herë që thërret funksioni Serial.read (), shkronja e parë e dërguar hiqet nga pirgu dhe ruhet në ndonjë vend tjetër. Zakonisht një ndryshore char në kod. Shënim, vareni nga hardueri, zakonisht ka një afat kohor për mënyrën sesi log buffer mund të ruajë informacionin.

Nëse keni ndërmend të futni më shumë se një shifër përmes serialit, duhet të "kompozoni" një varg sipas karakterit, pasi ato futen në tampon UART.

Kjo do të thotë që biçikleta të lexojë secilën shkronjë tampon, të ruhet në një ndryshore temp, ta ngarkojë atë në pozicionin e parë të një grupi vargu, të kalojë në pozicionin tjetër dhe të fillojë nga e para, derisa … mirë, varet aplikimi. Ka 2 mënyra për të përfunduar ciklin:

  1. Përdorimi i një karakteri "shenje fundore", si "Kthimi i karrocës" ose "Burimi i linjës". Sapo të gjendet shenja "fund Mark", lak përfundon.
  2. Përndryshe, numri i karaktereve në zinxhirin e vargut mund të jetë i kufizuar, po kështu edhe numri i cikleve ndërvepruese. Kur arrin kufirin, le të themi, 4, fitoni përfundime rutinore vetë.

Le të hedhim një vështrim në një shembull të thjeshtë se si ta bëjmë këtë:

  • Vendosni një shenjë "fund", si '\ n' (kjo do të thotë burim ASCII i shkrirjes së linjës).
  • looping ndërkohë Serial.i disponueshëm () është i vërtetë
  • ruajtja e Serial.read () rezulton në një ndryshore të përkohshme char. Mbani mend: sapo Serial.read () në fakt "lexon" tampon, është i pastër dhe karakteri tjetër ngarkohet në të.
  • rrit një variabël vargu me këtë shenjë
  • Nëse shenja e fundit është "fund" dilni nga laku.

Zakonisht, rutina për marrjen e grupit të karakterit serik duket si foto.

Ai u bazua në një përshtatje të gjerë të kodit origjinal të z. David A. Mellis.

Ra falas për ta përdorur dhe testuar atë. Mbani mend: vlerat DUHET të futen në formatin 3 shifror.

Kjo është tani për tani. Unë nuk do të zgjatem në detaje shtesë të komunikimit serik. Tooshtë shumë komplekse për t'u mbuluar këtu dhe e meriton atë vetë Intructables.

Shpresoj se do t'ju ndihmojë të përdorni shembuj në Blue Pill dhe t'ju japë një sqarim se sa korrekt është kodi për këtë tabelë të vogël.

Shihemi përreth në udhëzime të tjera.

Recommended: