Sisukord:

Niisiis, laadite STM32duino alglaaduri oma "sinisesse pilli" Mis siis nüüd?: 7 sammu
Niisiis, laadite STM32duino alglaaduri oma "sinisesse pilli" Mis siis nüüd?: 7 sammu

Video: Niisiis, laadite STM32duino alglaaduri oma "sinisesse pilli" Mis siis nüüd?: 7 sammu

Video: Niisiis, laadite STM32duino alglaaduri oma
Video: 15 минут массажа лица для ЛИФТИНГА и ЛИМФОДРЕНАЖА на каждый день. 2024, November
Anonim
Niisiis, laadite oma seadmesse STM32duino alglaaduri
Niisiis, laadite oma seadmesse STM32duino alglaaduri
Niisiis, laadite oma seadmesse STM32duino alglaaduri
Niisiis, laadite oma seadmesse STM32duino alglaaduri

Kui olete juba lugenud minu juhiseid, mis selgitavad STM32duino alglaaduri või muu sarnase dokumentatsiooni laadimist, proovige laadida koodi näidet ja… võib juhtuda, et midagi ei juhtu.

Probleem on selles, et paljud, kui mitte kõik „üldise” STM32 näited, ei tööta karbist välja. STM32 "Blue Pill" plaadil töötamiseks on vaja teha väikeseid muudatusi.

Valin 4 koodinäidet, et selgitada, mida ja miks tuleb muuta. Koodid on: "BlinkWithoutDelay", "Fading", "Dimmer" ja "AnalogInSerial".

Pange tähele, et ma EI kodeerinud midagi. Teen välja vaid väikesed muudatused koodides, mille on loonud:

David A. Mellis ja hiljaks muudetud Tom Igoe, Marti Bolivar ja mõned juhtumid Scott Fitzgerald

Tom Igoe ja hiljaks muudetud Bryan Newbold

Niisiis, eelistan autori nimesid hoida isegi muudetavates koodides, säilitades loomingukrediidi.

1. samm: tihvtid…. Miks kood ei tööta?

Nõelad ja tihvtid …. Miks kood ei tööta?
Nõelad ja tihvtid …. Miks kood ei tööta?

Vaatame STM32 "Blue Pill" tihvti. Märkus tihvtid on identifitseeritud kui PA1 või PC2…. Midagi sellist.

Kui vaatate näiteks "BlinkWithoutDelay" koodinäidet, deklareeritakse tihvt "33"…. Miks?

Ma kahtlustan, et see on sellepärast, et härra Marti Bolivar kandis selle koodi MAPLE tahvlile.

Ma arvan, et see ei olnud tema kavatsus lasta koodil „Blue Pill“tahvlitega ühilduda.

Vahtra ja vahtra miniplaadi tihvtid on arvuliselt deklareeritud, nagu Arduino, kuigi nad kasutavad numbreid nagu 33, 24 ja mõned sarnased.

Ma ütlesin, et kood ei tööta? Minu viga. Kood kompileerige ilma veata ja laadige õigesti "Blue Pill" -i üles, nii et kas see on minu arvates tõepoolest töökorras, kuid GPIO -väljundit kasutades ei oota me seda. Võib -olla pole isegi saadaval.

Nii et selle toimimiseks oodatud viisil on vaja teha väikeseid muudatusi.

Samm: määratleme mõned nööpnõelad…

Lähme
Lähme

Hea koodipraktika on ressursside deklareerimine muutujate või konstantide hõlpsaks tuvastamiseks või tähendamiseks. See võimaldab teil koodi paremini mõista ja tõrkeotsingut teha.

Kasutasin Arduino nööpnõelte deklareerimist järgmiselt:

const int ledPin = 13;

…"

Kui teile meeldib, siis võib -olla küsite endalt: "Kuidas ma saan deklareerida nööpnõelad selliste nimedega nagu PC13 ???"

Vastus on: kasutage lauset "#define".

Niisiis, vastavalt pinouti joonisele, on PC13 PIN -kood, mis meil on "BluePill" LED -is. Selle kasutamiseks deklareeriksin niimoodi vahetult pärast raamatukogude määratlust (#include…) ja enne kõike muud:

#define LedPin PC13

…"

Pange tähele, EI ole ";" liini lõpetamine, NOR "=" määramine.

Võrrelge mõlemat koodi. Üks neist on IDE -st laaditud algne näide. Teiseks korrigeerisin veidi tööd BluePilliga.

Soovitan tungivalt deklareerida koodis kõik tihvtid, mida kavatsete kasutada. Isegi need kavatsevad kasutada ADC sisendina (sellest lähemalt hiljem).

See muudab teie elu lihtsaks.

Samm 3: PinMode ()… kuidas te oma nõelu kasutate…

Enne jätkamist mõistame PinMode () funktsiooni.

Nagu Arduino, on ka STM32 tihvtidel mitu funktsiooni. Lihtsaim viis ühe või teise valimiseks on lause pinMode () kasutamine.

Arduinol on saadaval ainult 3 režiimi: INPUT, OUTPUT või INPUT_PULLUP.

Seevastu STM32 -l on palju maitseid pinMode (). Nemad on:

VÄLJUND -Põhiline digitaalne väljund: kui tihvt on KÕRGE, hoitakse pinget +3,3 V (Vcc) ja kui see on madal, tõmmatakse see maapinnale

OUTPUT_OPEN_DRAIN -avatud tühjendusrežiimis näitab tihvt „madalat”, võttes vastu voolu maapinnale, ja „kõrge”, suurendades takistust

INPUT_ANALOG -See on erirežiim, mille puhul tihvti kasutatakse analoog (mitte digitaalse) lugemiseks. Võimaldab ADC teisendamist tihvti pingel

INPUT_PULLUP -Tihvti olekut selles režiimis teavitatakse samamoodi nagu INPUT -i puhul, kuid tihvti pinget tõmmatakse õrnalt üles +3.3v suunas

INPUT_PULLDOWN -Tihvti olekut selles režiimis teavitatakse samamoodi nagu INPUT -i puhul, kuid tihvti pinget tõmmatakse õrnalt alla 0v suunas

INPUT_FLOATING -INPUT sünonüüm

PWM -See on erirežiim, mille puhul tihvti kasutatakse PWM -väljundiks (digitaalse väljundi erijuhtum)

PWM_OPEN_DRAIN -Nagu PWM, välja arvatud see, et vahelduvate tsüklite LOW ja HIGH asemel koosneb pinti pinge vahelduvatest tsüklitest LOW ja ujuv (lahti ühendatud)

(märkus: väljavõte saidilt

Avasin just selle sulu, sest kui hakkate oma koodi looma, olge ettevaatlik ja kasutage oma vajaduste jaoks õiget pinMode ().

Samm 4: AnalogWrite () versus PwmWrite ()… Analoogväljund kahes maitses

AnalogWrite () versus PwmWrite ()… Analoogväljund kahes maitses
AnalogWrite () versus PwmWrite ()… Analoogväljund kahes maitses
AnalogWrite () versus PwmWrite ()… Analoogväljund kahes maitses
AnalogWrite () versus PwmWrite ()… Analoogväljund kahes maitses

Enne "Blue Pill" GPIO nõelte kasutamist on vaja deklareerida selle käitumist, st kuidas see toimib. Funktsioon pinMode () teeb täpselt seda.

Niisiis, keskendume nüüd sellele, kuidas õigesti analoogväljund seadistada. Selle saab kuulutada kas väljund- või PWM -režiimiks.

Samamoodi saab analoogväärtusi GPIO -le omistada kahel viisil: analogWrite () või pwmWrite (), BUT, analogWrite () TOIMIB ainult siis, kui pinMode () = OUTPUT. Teisest küljest töötab pwmWrite () ainult siis, kui pinMode () = PWM.

Võtame näiteks PA0: see on analoog-/pwm -väljundi kandidaat.

analogWrite (): see deklareerib nii:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <number>);

……"

kus arv peab olema vahemikus 0 kuni 255, nagu Arduino. Tegelikult ühildub see Arduinoga tagasi.

pwmWrite (): deklareerige nii:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

Kui arv peab olema vahemikus 0 ~ 65535, eraldusvõime palju suurem kui Arduino.

Piltidel on võimalik võrrelda kahe koodi vahel. Näete ka algkoodi.

5. samm: STM32 jadaühendus

STM32 jadakommunikatsioon
STM32 jadakommunikatsioon

Vaatame, kuidas USART -liidesed on paigutatud STM32 -sse. Jah, liidesed mitmuses ….

"Sinisel pillil" on 3 USART -i (RX/ TX 1 ~ 3) ja kui kasutate alglaadurit, võimaldab see USB -d kasutada, pole see ühegagi ühendatud.

Sõltuvalt sellest, kas kasutate USB -d või mitte, peate jadapordi ühel või teisel viisil oma koodis deklareerima.

Juhtum 1: USB kasutamine:

Sel viisil laaditakse visandid otse USB kaudu alla. Pole vaja liigutada BOOT0 hüppajat 1 asendisse ja tagasi 0.

Sel juhul tähendab iga kord, kui deklareerite "Serial" ilma indeksita, side USB kaudu.

Niisiis, Serial1 tähendab TX/ RX 1 (tihvtid PA9 ja PA10); Serial2 tähendab TX/ RX 2 (tihvtid PA2 ja PA3) ja Serial 3 tähendab TX/ RX 3 (tihvtid PA10 ja PA11).

See on viis, kuidas me töötame. Esitan muudatused selle kodeerimisviisi näidetes.

Teine asi: "Serial USB" ei pea lähtestama. Teisisõnu: "… Serial.begin (15200);" ei ole vajalik.

Võimalik on käivitada mis tahes jadafunktsioon (Serial.read (), Serial.write () jne) ilma igasuguse initsialiseerimiseta.

Kui see on mingil põhjusel koodis olemas, ignoreerib kompilaator seda.

Juhtum 2: TTL seria kasutamine USB -adapteriga:

Sel moel ei toeta alglaadur natiivset STM32 USB -ühendust, seega on visandite üleslaadimiseks vaja USB -jadaadapterit, mis on ühendatud TX/ RX 1 -ga (tihvtid PA9 ja PA10).

Sel juhul tähendab iga kord, kui "Serial" ilma indeksita kood, TX/ RX1 (koodi üleslaadimiseks kasutatav port). Nii et Serial1 viitab TX/ RX 2 (tihvtid PA2 ja PA3) ja Serial2 viitab TX/ RX 3 (tihvtid PA10 ja PA11). Serial3 pole saadaval.

Samm: väärtuse edastamine mikrokontrollerile

Väärtuse edastamine mikrokontrollerile
Väärtuse edastamine mikrokontrollerile

Dimmeri näide on lihtne viis näidata, kuidas väärtus mikrokontrollerile edastada.

See eeldab, et LED -i heleduse juhtimiseks antakse väärtus vahemikku 0–255.

See EI tööta Blue Pillis ootuspäraselt:

  1. Funktsiooni pwmWrite () kasutamiseks tuleb PINMode () deklareerida PWM -režiimiks.
  2. Te ei saa kunagi tervet 3 -kohalist numbrit. Funktsioon Serial.read () salvestab lihtsalt puhverdatud sisu, mis on "BYTE". kui sisestate "100" ja vajutate sisestusklahvi, salvestatakse puhvrist ainult viimane "0". Ja selle väärtus on "48" (ASCII kümnendarv "0" jaoks). Kui kavatsete välja anda väärtuse "100", peate sisestama "d". Niisiis, on õige öelda, et see teisendab ASCII sümboli kümnendväärtuse LED -heleduse järgi, eks ??…. Noh, omamoodi…
  3. Probleem, kaardiväärtused otse funktsioonist Serial.read () on trikk. On peaaegu kindel, et saate ootamatuid väärtusi. Parem lähenemisviis on salvestuspuhvri sisu ajutises muutuja ja selle kaardistamine.

Nagu ma selgitasin punktis 2, võimaldab minu sisse viidud muudatuste sisestamine sisestada ASCII sümboli ja see juhib LED -i heledust, lähtudes selle ASCII kümnendväärtusest… näiteks "tühik" on väärtus 32 (tegelikult on madalaim prinditav märk, mille saate sisestada) ja "}" on võimalik kõrgeim (väärtus 126). Teisi märke ei saa printida, seega ei saa terminal aru või on need võimalikud tähemärkide ühendid (nt "~" on minu klaviatuuril surnud klahv ja ei tööta õigesti). See tähendab, et see liitmärk terminali sisenedes saadab märgi ise ja midagi muud. Tavaliselt mitteprinditav. Ja kas see viimane kood jäädvustab. Samuti pidage meeles, et sel juhul EI TOHI terminal saata "Carriage Return" ega "Line Feed". Koodi õigeks toimimiseks peate sellele tähelepanu pöörama.

Kui kukkusite, on see pisut segane, läheb see halvemaks…..

Samm: ja kui ma sooviksin sisestada kolm numbrit…. või isegi rohkem ??

Ja kui ma tahaksin sisestada kolm numbrit…. või isegi rohkem ??
Ja kui ma tahaksin sisestada kolm numbrit…. või isegi rohkem ??

Jadaühendusest mitme märgi saamine pole lihtne ülesanne.

Seeriapuhver on FIFO baitide märkide hunnik. Iga kord, kui funktsioon Serial.read () helistab, eemaldatakse esimene saadetud sümbol hunnikust ja salvestatakse mõnda mujale. Tavaliselt on koodis muutuja char. Pange tähele, oleneb riistvarast, tavaliselt on ajavahemik selle kohta, kuidas logipuhver saab teavet hoida.

Kui kavatsete jada kaudu sisestada rohkem kui ühe numbri, peate UART -puhvrisse sisenedes stringimärgi kaupa "komponeerima".

See tähendab, et jalgrattasõit loeb iga puhvri sümboli, salvestab temp muutuja, laadib selle stringimassiivi esimesse positsiooni, liigub järgmisesse asendisse ja alustab uuesti, kuni… noh, sõltub rakendusest. Tsükli lõpetamiseks on kaks võimalust:

  1. Kasutades mõnda "lõppmärgi" märki, näiteks "vaguni tagastamine" või "Rea etteandmine". Niipea, kui leitakse "end Mark" sümbol, lõpeb loop.
  2. Alternatiivina võib piirata stringide ahela tähemärkide arvu, nii ka interaktiivsete tsüklite arvu. Kui see jõuab piirini, näiteks 4, omandage rutiinsed viimistlused ise.

Vaatame lihtsat näidet, kuidas seda teha:

  • Määrake lõppmärk, näiteks „\ n” (see tähendab reavahetuse ASCII sümbolit).
  • looping vahepeal Serial.available () on tõene
  • Serial.read () salvestamine annab ajutise char muutuja. Pidage meeles: niipea kui Serial.read () puhver tegelikult "loeb", on see puhas ja järgmine märk laaditakse sellesse.
  • suurendage stringi muutujat selle märgiga
  • Kui viimane märk on "lõpp", väljuge ringist.

Tavaliselt näeb seeriamärkide massiivi hankimise rutiin välja nagu pilt.

See põhines härra David A. Mellise algkoodi ulatuslikul kohandamisel.

Kasutamiseks ja testimiseks vabalt. Pidage meeles: väärtused PEAVAD olema sisestatud 3 -kohalises vormingus.

See on praegu. Ma ei laienda end täiendavate jadakommunikatsiooni üksikasjade juurde. See on siin kajastamiseks liiga keeruline ja väärib oma intructabeleid.

Loodan, et see aitab teil Blue Pilli näiteid kasutada ja annab teile valgust, kui õige kood selle väikese tahvli jaoks on.

Kohtumiseni mujal juhendatavas.

Soovitan: