Turinys:
- 1 žingsnis: smeigtukai ir smeigtukai… Kodėl kodas neveikia?
- 2 žingsnis: „Apibrėžkime“kai kuriuos smeigtukus…
- 3 veiksmas: „PinMode“() … Kaip naudosite smeigtukus …
- 4 žingsnis: „AnalogWrite“() prieš „PwmWrite“()… Analoginė išvestis 2 skoniuose
- 5 žingsnis: STM32 nuoseklusis ryšys
- 6 veiksmas: vertės perdavimas mikrovaldikliui
- 7 žingsnis: Ir jei norėčiau įvesti tris skaitmenis…. ar net daugiau ??
2025 Autorius: John Day | [email protected]. Paskutinį kartą keistas: 2025-01-23 14:58
Jei jau perskaitėte mano instrukcijas, paaiškinančias, kaip įkelti STM32duino įkrovos tvarkyklę ar bet kokią kitą panašią dokumentaciją, pabandykite įkelti kodo pavyzdį ir … gali būti, kad nieko neįvyks.
Problema ta, kad daugelis, jei ne visi „Generic“STM32 pavyzdžiai neveiks. Norint pradėti dirbti su STM32 „Mėlynosios tabletės“lenta, reikės atlikti nedidelius pakeitimus.
Parinksiu 4 kodo pavyzdžius, kurie paaiškins, ką ir kodėl reikia keisti. Kodai yra šie: „BlinkWithoutDelay“, „Fading“, „Dimmer“ir „AnalogInSerial“.
Pastaba Nieko nekodavau. Aš tik išleidžiu nedidelius kodų pakeitimus, sukurtus:
Davidas A. Mellisas ir vėlai modifikuotas Tomo Igoe, Marti Bolivaro ir kai kuriais atvejais - Scott Fitzgerald
Tomas Igoe ir vėlai modifikuotas Bryano Newboldo
Taigi, norėčiau išsaugoti autorių vardus net ir mano modifikuojamuose koduose, išlaikant kūrimo įskaitą.
1 žingsnis: smeigtukai ir smeigtukai… Kodėl kodas neveikia?
Pažvelkime į STM32 „Blue Pill“kaištį. Atkreipkite dėmesį, kad kaiščiai yra identifikuojami kaip PA1 arba PC2 … kažkas panašaus.
Jei pažvelgsite, pavyzdžiui, į „BlinkWithoutDelay“kodo pavyzdį, smeigtukas deklaruojamas kaip „33“… Kodėl?
Įtariu, kad taip yra todėl, kad ponas Marti Bolivar perkėlė šį kodą į MAPLE plokštę.
Manau, kad jis neketino leisti kodo suderinti su „Blue Pill“lentomis.
Klevo ir klevo mini lentos smeigtukai yra skaitiniai, kaip ir „Arduino“, nors jie naudoja tokius skaičius kaip 33, 24 ir kai kurie panašūs.
Sakiau, kad kodas neveikia? Mano klaida. Kodas sukompiliuotas be klaidų ir teisingai įkeliamas į „Blue Pill“, taigi, mano nuomone, jis tikrai veikia, tačiau nesitikime, kad naudosime GPIO išvestį. Gali būti net nepasiekiamas.
Taigi reikia atlikti nedidelius kodo pakeitimus, kad jis veiktų taip, kaip tikėtasi.
2 žingsnis: „Apibrėžkime“kai kuriuos smeigtukus…
Gera kodo praktika - skelbti išteklius kaip lengvai atpažįstamus ar reikšmingus kintamuosius ar konstantas. Tai leis lengviau suprasti kodą ir pašalinti triktis.
Aš naudoju deklaruoti „Arduino“kaiščius taip:
…
const int ledPin = 13;
…"
Jei jums patinka aš, galbūt klausiate savęs: „Kaip aš galiu paskelbti kaiščius su tokiais pavadinimais kaip PC13 ???“
Atsakymas yra toks: naudokite „#define“C teiginį.
Taigi, pagal „pinout“piešinį, PC13 yra kaištis, kurį mes turime „BluePill“LED. Jei norite jį naudoti, aš pareikšiu taip, iškart po bibliotekų apibrėžimo (#include…) ir prieš ką nors kitą:
…
#define LedPin PC13
…"
Atkreipkite dėmesį, kad nėra ";" linijos nutraukimas, NOR "=" priskyrimas.
Palyginkite abu kodus. Vienas iš jų yra originalus pavyzdys, įkeltas iš IDE. Antra, aš šiek tiek pakoregavau darbą su „BluePill“.
Aš primygtinai rekomenduoju deklaruoti visus kaiščius, kuriuos ketinate naudoti kodu. Net tie, kurie ketina naudoti kaip ADC įvestį (daugiau apie tai vėliau).
Tai palengvins jūsų gyvenimą.
3 veiksmas: „PinMode“() … Kaip naudosite smeigtukus …
Prieš tęsdami, suprasime PinMode () funkciją.
Kaip ir „Arduino“, STM32 kaiščiai turi keletą funkcijų. Paprasčiausias būdas pasirinkti vieną ar kitą yra naudoti teiginį pinMode ().
„Arduino“turi tik 3 režimus: INPUT, OUTPUT arba INPUT_PULLUP.
Kita vertus, STM32 turi daug pinMode () skonių. Jie yra:
OUTPUT -Pagrindinė skaitmeninė išvestis: kai kaištis yra AUKŠTAS, įtampa palaikoma +3,3 V (Vcc), o kai ji yra ŽEMA, ji traukiama žemyn
OUTPUT_OPEN_DRAIN -Atviro nutekėjimo režimu kaištis rodo „žemą“, priimdamas srovės srautą į žemę, ir „aukštą“, padidindamas varžą
INPUT_ANALOG -Tai specialus režimas, kai kaištis bus naudojamas analoginiam (ne skaitmeniniam) skaitymui. Leidžia ADC konvertuoti į kaiščio įtampą
INPUT_PULLUP -Kaiščio būsena šiuo režimu pranešama taip pat, kaip ir naudojant INPUT, tačiau kaiščio įtampa švelniai „pakeliama“link +3.3v
INPUT_PULLDOWN -Šio režimo kaiščio būsena pranešama taip pat, kaip ir naudojant Įvestį, tačiau kaiščio įtampa švelniai „traukiama žemyn“link 0v
INPUT_FLOATING -INPUT sinonimas
PWM -Tai specialus režimas, kai kaištis bus naudojamas PWM išėjimui (ypatingas skaitmeninės išvesties atvejis)
PWM_OPEN_DRAIN -Kaip ir PWM, išskyrus tai, kad vietoj kintamų ciklų LOW ir HIGH, kaiščio įtampą sudaro kintami ciklai LOW ir plaukiojantys (atjungti)
(pastaba: ištraukta iš
Aš tik atidariau šį skliaustą, nes pradėdami kurti savo kodą, būkite atsargūs ir naudokite teisingą pinMode ().
4 žingsnis: „AnalogWrite“() prieš „PwmWrite“()… Analoginė išvestis 2 skoniuose
Prieš naudojant „Blue Pill“GPIO kaiščius, būtina deklaruoti jo elgesį, t. Y. Kaip jis veiks. Funkcija pinMode () būtent tai ir daro.
Taigi, dabar sutelkime dėmesį į tai, kaip teisingai nustatyti analoginę išvestį. Jis gali būti paskelbtas kaip išvesties arba PWM režimas.
Panašiai analoginės vertės gali būti priskiriamos GPIO dviem būdais: analogWrite () arba pwmWrite (), BET, analogWrite () veiks tik tuo atveju, jei pinMode () = OUTPUT. Kita vertus, pwmWrite () veiks tik tuo atveju, jei pinMode () = PWM.
Paimkime, pavyzdžiui, PA0: tai analoginis/pwm išvesties kandidatas.
analogWrite (): tai deklaruoja taip:
….
#define ledPin PA0
pinMode (ledPin, OUTPUT);
analogWrite (ledPin, <skaičius>);
……"
kur skaičius turi būti nuo 0 iki 255, kaip ir „Arduino“. Tiesą sakant, jis yra suderinamas su „Arduino“.
pwmWrite (): deklaruokite taip:
…
#define ledPin PA0
pinMode (ledPin, PWM);
pwmWrite (ledPin, <skaičius.>);
…."
Kai skaičius turi būti nuo 0 iki 65535, skiriamoji geba yra daug didesnė nei „Arduino“.
Nuotraukose galima palyginti 2 kodus. Taip pat galite pamatyti originalų kodą.
5 žingsnis: STM32 nuoseklusis ryšys
Pažiūrėkime, kaip išdėstytos USART sąsajos STM32. Taip, sąsajos daugiskaita ….
„Blue Pill“turi 3 USART (RX/ TX 1 ~ 3) ir, jei naudojate įkrovos tvarkyklę, galite naudoti USB, ji nėra prijungta prie nė vieno iš to.
Priklausomai nuo to, ar naudojate USB jungtį, ar ne, kode turite vienaip ar kitaip deklaruoti nuoseklųjį prievadą.
1 atvejis: USB naudojimas:
Tokiu būdu eskizai atsisiunčiami tiesiogiai per USB. Nereikia perkelti BOOT0 trumpiklio į 1 padėtį ir atgal į 0.
Tokiu atveju bet kuriuo metu, kai paskelbiate „Serial“be indekso, reiškia ryšį per USB.
Taigi, Serial1 reiškia TX/ RX 1 (kaiščiai PA9 ir PA10); Serial2 reiškia TX/ RX 2 (kaiščiai PA2 ir PA3), o 3 serija - TX/ RX 3 (kaiščiai PA10 ir PA11).
Taip mes dirbame. Pateiksiu šio kodavimo būdo pavyzdžių pakeitimus.
Kitas dalykas: „Serial USB“nereikia inicijuoti. Kitaip tariant, "… Serial.begin (15200);" nebūtina.
Galima inicijuoti bet kurią serijos funkciją (Serial.read (), Serial.write () ir tt) be jokio inicijavimo.
Jei dėl kokių nors priežasčių jis yra kode, kompiliatorius to nepaisys.
2 atvejis: TTL serijos naudojimas USB adapteriui:
Tokiu būdu įkrovos tvarkyklė nepalaiko vietinio STM32 USB ryšio, todėl norint įkelti eskizus, jums reikia USB prie nuoseklaus adapterio, prijungto prie TX/ RX 1 (kaiščiai PA9 ir PA10).
Tokiu atveju bet kuriuo metu „Serijinis“be indekso yra kodas, reiškia TX/ RX1 (prievadas, naudojamas kodui įkelti). Taigi Serial1 reiškia TX/ RX 2 (kaiščiai PA2 ir PA3), o Serial2 - TX/ RX 3 (kaiščiai PA10 ir PA11). Nėra „Serial3“.
6 veiksmas: vertės perdavimas mikrovaldikliui
„Dimmer“pavyzdys yra paprastas būdas parodyti, kaip perduoti vertę mikrovaldikliui.
Manoma, kad norint išlaikyti šviesos diodų ryškumą, reikia perduoti vertę nuo 0 iki 255.
„Blue Pill“jis neveiks, kaip tikėtasi, nes:
- Norėdami naudoti „pwmWrite“() funkciją, „PINMode“() TURI būti paskelbta kaip PWM režimas.
- Jūs niekada negausite viso 3 skaitmenų skaičiaus. Funkcija Serial.read () fiksuoja tik buferio turinį, kuris yra „BYTE“. jei įvesite „100“ir paspausite „Enter“, tik paskutinis „0“bus įrašytas iš buferio. Ir jo vertė bus „48“(dešimtainė ASCII reikšmė „0“). Jei ketinate išleisti vertę „100“, būtina įvesti „d“. Taigi, teisinga sakyti, kad ji konvertuos ASCII simbolio dešimtainę reikšmę į LED ryškumą, tiesa?…. Na, tam tikra…
- Problema, žemėlapio vertės tiesiogiai iš Serial.read () funkcijos yra apgaulingas veiksmas. Beveik neabejotina gauti netikėtų vertybių. Geresnis būdas yra saugojimo buferio turinys laikinajame kintamajame ir jį susieti.
Kaip paaiškinau anksčiau 2 punkte, kodo, kurį įvedu, pakeitimai leis įvesti ASCII simbolį ir tai valdys šviesos diodų ryškumą pagal ASCII dešimtainę vertę … pavyzdžiui, „erdvė“yra 32 vertė (iš tikrųjų yra mažiausias spausdinamas simbolis, kurį galite įvesti) ir „}“yra didžiausias (126 vertė). Kiti simboliai yra neišspausdinami, todėl terminalas nesupras arba jie gali būti simbolių junginys (pvz., „~“Yra negyvas klavišas mano klaviatūroje ir neveiks tinkamai). Tai reiškia, kad šis sudėtinis simbolis, įvestas į terminalą, atsiųs patį simbolį ir dar ką nors. Paprastai nespausdinamas. Ir ar šis paskutinis kodas bus užfiksuotas. Be to, atminkite, kad jūsų terminalas šiuo atveju neturėtų siųsti nei „vežimo grąžinimo“, nei „eilutės tiekimo“. Turite atkreipti dėmesį į tai, kad kodas veiktų teisingai.
Jei nukrisite, tai bus šiek tiek painu, bus blogiau …
7 žingsnis: Ir jei norėčiau įvesti tris skaitmenis…. ar net daugiau ??
Gauti kelis simbolius iš nuoseklaus ryšio nėra paprasta užduotis.
Serijinis buferis yra FIFO baitų krūva. Kiekvieną kartą, kai skambina Serial.read () funkcija, pirmoji išsiųsta žyma pašalinama iš krūvos ir saugoma kitur. Paprastai char kintamasis kodas. Atminkite, kad priklauso nuo aparatinės įrangos, paprastai yra skirtasis laikas, kaip žurnalo buferis gali saugoti informaciją.
Jei ketinate per seriją įvesti daugiau nei vieną skaitmenį, turėsite „sudaryti“eilutės simbolį po simbolio, kai jie patenka į UART buferį.
Tai reiškia, kad važiavimas dviračiu perskaito kiekvieną buferio simbolį, išsaugo temp kintamajame, įkelia jį į pirmąją eilutės masyvo poziciją, pereina į kitą poziciją ir pradeda iš naujo, kol … na, priklauso nuo taikymo. Yra 2 būdai baigti ciklą:
- Naudojamas koks nors „pabaigos ženklo“simbolis, pvz., „Vežimo grąžinimas“arba „Eilutės tiekimas“. Kai tik randamas „end Mark“ženklas, kilpa baigiasi.
- Arba simbolių skaičius eilutės grandinėje gali būti ribotas, taip pat ir interaktyvių ciklų skaičius. Kai jis pasiekia ribą, tarkime, 4, įgykite įprastą užbaigimą pats.
Pažvelkime į paprastą pavyzdį, kaip tai padaryti:
- Nustatykite „pabaigos“ženklą, pvz., „\ N“(tai reiškia eilutės sklaidos kanalo ASCII simbolį).
- looping tuo tarpu Serial.available () yra tiesa
- išsaugojus Serial.read () gaunamas laikinas char kintamasis. Atminkite: kai Serial.read () iš tikrųjų „nuskaito“buferį, jis yra švarus ir į jį įkeliamas kitas simbolis.
- padidinkite eilutės kintamąjį naudodami šį simbolį
- Jei paskutinis simbolis yra „pabaiga“, išeikite iš kilpos.
Paprastai serijinių simbolių masyvo gavimo tvarka atrodo kaip paveikslėlis.
Jis buvo pagrįstas plačiu pono David A. Mellis kodo pritaikymu.
Nemokamai naudokitės ir išbandykite. Atminkite: vertės turi būti įvestos 3 skaitmenų formatu.
Tai dabar. Aš nesiplėsiu į papildomą serijinio ryšio informaciją. Čia per daug sudėtinga ją apimti ir ji nusipelno savo „Intructables“.
Tikiuosi, kad tai padės jums naudoti pavyzdžius „Blue Pill“ir suteiks jums šiek tiek apšvietimo, kaip teisingas šios mažos lentos kodas.
Iki pasimatymo kituose pamokymuose.
Rekomenduojamas:
Dabar nereikia šlapintis, naminių gyvūnėlių elgesio reguliavimo prietaisas, neleidžiantis katėms šlapintis jūsų namuose: 4 žingsniai
Jokio šlapinimosi, naminių gyvūnėlių elgesio reguliavimo prietaisas, neleidžiantis katėms šlapintis jūsų namuose: mane taip vargino kačiukas, kad jai patinka šlapintis ant mano lovos, aš patikrinau viską, ko jai reikia, taip pat nuvedžiau pas veterinarą. Išsiaiškinęs viską, ką galiu galvoti, ir įsiklausęs į gydytojo žodį, suprantu, kad ji tiesiog elgiasi blogai. Taigi t
Atnaujintas saulės lazeris + LED dabar su „Power Bank“: 3 žingsniai
Atnaujintas „Solar Laser + Led“dabar su „Power Bank“: USB naudoju maitinimo banko grandinę, o vietoj superkondensatorių naudojau LED nikelio metalo hidridą, pridėjau lazerinį žymiklį ir maitinimo bankui naudojau ličio elementą ir įkroviau USB nėra saulės energija. Ir aš pridėjau atsarginę saulės bateriją
Durų skambučio pranešimas žmonėms su klausos negalia naudojant namų automatiką (ESP-dabar, MQTT, „Openhab“): 3 žingsniai
Durų skambučio pranešimas žmonėms su klausos sutrikimais naudojant namų automatiką (ESP-dabar, MQTT, „Openhab“): šioje instrukcijoje parodysiu, kaip į savo namų automatiką įtraukiau įprastą durų skambutį. Šis sprendimas puikiai tinka žmonėms su klausos negalia. Mano atveju aš naudoju jį norėdamas gauti pranešimą, jei vaikų gimtadienio vakarėlyje kambarys yra užimtas ir triukšmingas. Aš
Naujas ir patobulintas „Geiger“skaitiklis - dabar su „WiFi“!: 4 žingsniai (su nuotraukomis)
Naujas ir patobulintas „Geiger“skaitiklis - dabar su „WiFi“!: Tai atnaujinta mano „Geiger“skaitiklio versija iš šios instrukcijos. Tai buvo gana populiaru ir aš gavau daug atsiliepimų iš žmonių, besidominčių jį statyti, todėl čia yra tęsinys: „GC-20“. Geigerio skaitiklis, dozimetras ir radiacijos matuoklis
Taigi jūs norite sukurti milžinišką robotą: 19 žingsnių (su nuotraukomis)
Taigi jūs norite sukurti milžinišką robotą: Jūs sakote, kad norite sukurti milžinišką robotą? Koks jūsų tikslas? Pasaulio viešpatavimas? Ar tavo mergina negaus tau alaus? Kad ir kas tai būtų, štai kaip pradėti kurti robotą. Šio roboto tikslas buvo scenos atrama m