Turinys:

Taigi, jūs įkeliate „STM32duino Bootloader“į savo „mėlynąją tabletę“Taigi, kas dabar?: 7 žingsniai
Taigi, jūs įkeliate „STM32duino Bootloader“į savo „mėlynąją tabletę“Taigi, kas dabar?: 7 žingsniai

Video: Taigi, jūs įkeliate „STM32duino Bootloader“į savo „mėlynąją tabletę“Taigi, kas dabar?: 7 žingsniai

Video: Taigi, jūs įkeliate „STM32duino Bootloader“į savo „mėlynąją tabletę“Taigi, kas dabar?: 7 žingsniai
Video: Fixing Marlin Firmware loading issues on 32-bit MCU(s) 2024, Liepa
Anonim
Taigi, jūs įkeliate „STM32duino“įkrovos įkroviklį
Taigi, jūs įkeliate „STM32duino“įkrovos įkroviklį
Taigi, jūs įkeliate „STM32duino“įkrovos įkroviklį
Taigi, jūs įkeliate „STM32duino“įkrovos įkroviklį

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?

Smeigtukai ir smeigtukai… Kodėl kodas neveikia?
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…

Leiskite
Leiskite

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

AnalogWrite () Palyginti su PwmWrite ()… Analoginė išvestis 2 skoniais
AnalogWrite () Palyginti su PwmWrite ()… Analoginė išvestis 2 skoniais
AnalogWrite () Palyginti su PwmWrite ()… Analoginė išvestis 2 skoniais
AnalogWrite () Palyginti su PwmWrite ()… Analoginė išvestis 2 skoniais

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

STM32 nuoseklusis ryšys
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

Vertės perdavimas mikrovaldikliui
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:

  1. Norėdami naudoti „pwmWrite“() funkciją, „PINMode“() TURI būti paskelbta kaip PWM režimas.
  2. 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…
  3. 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 ??

Ir jei norėčiau įvesti tris skaitmenis … ar net daugiau ??
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ą:

  1. Naudojamas koks nors „pabaigos ženklo“simbolis, pvz., „Vežimo grąžinimas“arba „Eilutės tiekimas“. Kai tik randamas „end Mark“ženklas, kilpa baigiasi.
  2. 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: