Indholdsfortegnelse:

Så du indlæser STM32duino Bootloader i din "blå pille" Så hvad nu ?: 7 trin
Så du indlæser STM32duino Bootloader i din "blå pille" Så hvad nu ?: 7 trin

Video: Så du indlæser STM32duino Bootloader i din "blå pille" Så hvad nu ?: 7 trin

Video: Så du indlæser STM32duino Bootloader i din
Video: Sådan indlæser du din grovfoderanalyse i PC Horse 2024, Juli
Anonim
Så du indlæser STM32duino Bootloader i din
Så du indlæser STM32duino Bootloader i din
Så du indlæser STM32duino Bootloader i din
Så du indlæser STM32duino Bootloader i din

Hvis du allerede har læst mine instrukser, der forklarer, hvordan indlæsning af STM32duino bootloader eller anden lignende dokumentation, prøver du eksempel på indlæsningskode, og … der kan ikke ske noget som helst.

Problemet er mange, hvis ikke alle eksempler på "Generisk" STM32 ikke fungerer ud af kassen. Det vil være nødvendigt med mindre ændringer for derefter at arbejde i dit STM32 "Blue Pill" -kort.

Jeg vælger 4 kodeeksempler for at forklare, hvad der skal ændres, og hvorfor. Koderne er: "BlinkWithoutDelay", "Fading", "Dimmer" og "AnalogInSerial".

Bemærk, at jeg IKKE har kodet noget. Jeg udsteder bare mindre ændringer i koder skabt af:

David A. Mellis og sent modificeret af Tom Igoe, Marti Bolivar og nogle sager af Scott Fitzgerald

Tom Igoe og sent modificeret af Bryan Newbold

Så jeg foretrækker at beholde forfatternavne, selv i koder, jeg ændrer, og beholde oprettelseskreditten.

Trin 1: Pins and Pins…. Hvorfor fungerer koden ikke?

Pins and Pins…. Hvorfor fungerer koden ikke?
Pins and Pins…. Hvorfor fungerer koden ikke?

Lad os tage et kig i STM32 "Blue Pill" pin ud. Bemærk stifter er identificeret som PA1 eller PC2 …. sådan noget.

Hvis du f.eks. Kigger på kodeeksemplet "BlinkWithoutDelay", erklæres pin som "33" …. Hvorfor?

Jeg formoder, at det er fordi Mr. Marti Bolivar overførte denne kode til MAPLE board.

Jeg tror, det ikke var hans hensigt at lade kode være kompatibel med "Blue Pill" -tavler.

Maple og Maple mini board pins er numerisk deklareret, ligesom Arduino, selvom de bruger tal som 33, 24 og nogle som dette.

Jeg sagde, at koden ikke fungerede? Min fejl. Koden kompileres uden fejl og uploades korrekt til "Blue Pill", så efter min mening virker det faktisk, men ved hjælp af et GPIO -output forventer vi ikke. Måske ikke engang tilgængelig.

Så små ændringer er nødvendige i koden for at den fungerer som forventet.

Trin 2: Lad os "definere" nogle pins …

Lad os
Lad os

Det er en god kode praksis at erklære ressourcer som lette at identificere eller betyde variabler eller konstantes. Det lader dig kode lettere at forstå og fejlfinding.

Jeg brugte declare Arduino pins som denne:

const int ledPin = 13;

…"

Hvis du kan lide mig, spørger du måske dig selv: "Hvordan kan jeg erklære pins med navne som PC13 ???"

Svaret er: Brug "#define" C -sætning.

Så ifølge pinout draw er PC13 den pin, vi har ombord LED i "BluePill". For at bruge det ville jeg erklære sådan her, lige efter biblioteksdefinitionen (#inkludere …) og før alt andet:

#define LedPin PC13

…"

Bemærk, at der ikke er NO ";" linjeafslutning, NOR "=" opgave.

Sammenlign begge koder. Det ene er det originale eksempel indlæst fra IDE. For det andet er den, jeg lavede nogle justeringer til at arbejde med "BluePill".

Jeg anbefaler kraftigt at erklære alle pins, du har til hensigt at bruge i kode. Selv de har til hensigt at bruge som ADC -input (mere om det senere).

Dette vil gøre dit liv let.

Trin 3: PinMode () … Sådan vil du bruge dine pins …

Inden vi fortsætter, lad os forstå PinMode () -funktionen.

Ligesom Arduino har STM32 -pins flere funktioner. Den enkleste måde at vælge det ene eller andet på er ved hjælp af pinMode () -sætning.

Arduino har kun 3 tilstande tilgængelige, INPUT, OUTPUT eller INPUT_PULLUP.

STM32 har på den anden side mange varianter af pinMode (). De er:

OUTPUT -Grundlæggende digital udgang: når stiften er HØJ, holdes spændingen ved +3,3v (Vcc), og når den er LAV, trækkes den ned til jorden

OUTPUT_OPEN_DRAIN -I åben afløbstilstand angiver tappen "lav" ved at acceptere strømmen til jorden og "høj" ved at give øget impedans

INPUT_ANALOG -Dette er en speciel tilstand, når stiften skal bruges til analoge (ikke digitale) læsninger. Gør det muligt at udføre ADC -konvertering på spændingen ved stiften

INPUT_PULLUP -Stiftens tilstand i denne tilstand rapporteres på samme måde som med INPUT, men stiftspændingen "trækkes forsigtigt op" mod +3.3v

INPUT_PULLDOWN -Stiftens tilstand i denne tilstand rapporteres på samme måde som med INPUT, men stiftspændingen "trækkes forsigtigt ned" mod 0v

INPUT_FLOATING -Synonym for INPUT

PWM -Dette er en speciel tilstand til, hvornår stiften skal bruges til PWM -output (et specielt tilfælde af digital output)

PWM_OPEN_DRAIN -Ligesom PWM, bortset fra at i stedet for vekslende cykler med LOW og HIGH, består spændingen på stiften af vekslende cyklusser med LOW og flydende (afbrudt)

(bemærkning: hentet fra

Jeg åbner bare denne parentes, for når du begynder at oprette din egen kode, skal du være omhyggelig med at bruge den korrekte pinMode () til dit behov.

Trin 4: AnalogWrite () Versus PwmWrite () … Analog output i 2 varianter

AnalogWrite () Versus PwmWrite () … Analog output i 2 varianter
AnalogWrite () Versus PwmWrite () … Analog output i 2 varianter
AnalogWrite () Versus PwmWrite () … Analog output i 2 varianter
AnalogWrite () Versus PwmWrite () … Analog output i 2 varianter

Inden GPIO -ben "Blue Pill" bruges, er det nødvendigt at deklarere dens adfærd, dvs. hvordan det fungerer. Det er præcis, hvad pinMode () -funktionen gør.

Så lad os nu fokusere på, hvordan korrekt indstilling af et analogt output. Det kan erklæres enten som OUTPUT -tilstand eller PWM -tilstand.

På samme måde kan analoge værdier tilskrives GPIO på 2 måder: analogWrite () eller pwmWrite (), MEN, analogWrite () VIL kun fungere, hvis pinMode () = OUTPUT. På den anden side fungerer pwmWrite () kun, hvis pinMode () = PWM.

Lad os tage PA0, for eksempel: det er en analog/pwm output kandidat.

analogWrite (): dette erklærer denne måde:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <nummer>);

……"

hvor tallet skal være mellem 0 og 255, ligesom Arduino. Faktisk er det bagudkompatibelt med Arduino.

pwmWrite (): erklær på denne måde:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

Hvor tallet skal være mellem 0 ~ 65535, en opløsning meget højere end Arduino.

I billeder er det muligt at sammenligne mellem 2 koder. Du kan også se den originale kode.

Trin 5: STM32 seriel kommunikation

STM32 seriel kommunikation
STM32 seriel kommunikation

Lad os se, hvordan USART -grænseflader er arrangeret i STM32. Ja, grænseflader i flertal ….

"Blue Pill" har 3 USART'er (RX/ TX 1 ~ 3), og hvis du bruger en bootloader, der tillader dig at bruge USB, er den ikke forbundet til noget af dengang.

Afhængigt af om du bruger USB eller ej, skal du deklarere seriel port på en eller anden måde i din kode.

Sag 1: Brug af USB:

På denne måde downloades skitser direkte via USB. Ingen grund til at flytte BOOT0 -jumperen til 1 position og tilbage til 0.

I dette tilfælde betyder det, at når du erklærer "Serial" uden indeks, kommunikation via USB.

Så Serial1 betyder TX/ RX 1 (stifter PA9 og PA10); Serial2, betyder TX/ RX 2 (ben PA2 og PA3) og Serial 3 betyder TX/ RX 3 (ben PA10 og PA11).

Det er den måde, vi arbejder med. Jeg vil præsentere ændringer i eksempler for denne måde at kode på.

En anden ting: "Seriel USB" behøver ikke at initialiseres. Med andre ord, "… Serial.begin (15200);" er ikke nødvendig.

Det er muligt at kalde enhver seriel funktion (Serial.read (), Serial.write () osv.) Uden initialisering.

Hvis det af en eller anden grund er til stede i kode, ignorerer kompilatoren det.

Sag 2: Brug af TTL seria til USB -adapter:

På denne måde understøtter bootloader ikke native STM32 USB -kommunikation, så du har brug for en USB til seriel adapter tilsluttet TX/ RX 1 (pin PA9 og PA10) for at uploade sketches.

I dette tilfælde betyder enhver tid "Seriel" uden indeks kode, hvilket betyder TX/ RX1 (port, der bruges til at uploade koden). Så videre refererer Serial1 til TX/ RX 2 (ben PA2 og PA3) og Serial2 henviser til TX/ RX 3 (ben PA10 og PA11). Ingen Serial3 tilgængelig.

Trin 6: Overførsel af en værdi til mikrokontroller

Overførsel af en værdi til mikrokontroller
Overførsel af en værdi til mikrokontroller

Dimmer -eksempel er en enkel måde at vise, hvordan en værdi overføres til mikrokontroller.

Det formodes at videregive en værdi fra 0 til 255 for at styre LED -lysstyrken.

Det fungerer IKKE som forventet i Blue Pill på grund af:

  1. For at bruge pwmWrite () -funktionen SKAL pinMode () erklæres som PWM -tilstand.
  2. Du får aldrig hele 3 cifre nummer. Funktionen Serial.read () fanger bare bufferindhold, som er en "BYTE". hvis du skriver "100" og trykker på "enter", vil kun sidste "0" blive fanget fra buffer. Og dens værdi vil være "48" (decimal ASCII -værdi for "0"). Hvis du vil udstede værdi "100", er det nødvendigt at skrive "d". Så det er korrekt at sige, at det vil konvertere en ASCII -symbol decimalværdi i LED -lysstyrke, ikke?…. Jamen, en slags …
  3. Problem, kortværdier direkte fra Serial.read () -funktionen er en trick -handling. Det er næsten sikkert at få uventede værdier. Bedre tilgang er lagringsbufferindhold i en midlertidig variabel, og END kortlægge det.

Som jeg forklarede før i punkt 2, vil kode, jeg introducerer ændringer, tillade indtastning af et ASCII -symbol, og dette vil styre LED -lysstyrken baseret på dens ASCII -decimalværdi … for eksempel er "mellemrum" værdi 32 (faktisk er det laveste udskrivbare tegn, du kan indtaste) og "}" er muligvis den højeste (værdi 126). Andre karakterer kan ikke udskrives, så terminalen forstår ikke, eller de er mulige en sammensætning af tegn (som "~" er en dødtast på mit tastatur og fungerer ikke korrekt). Dette betyder, at denne sammensatte karakter, når den indtastes i terminal, sender karakteren selv og noget andet. Normalt en, der ikke kan udskrives. Og er denne sidste en kode vil fange. Husk også på, at din Terminal i dette tilfælde IKKE skal sende hverken "vognretur" eller "liniefeed". Du skal være opmærksom på dette for at kode fungerer korrekt.

Hvis du faldt er det lidt forvirrende, det bliver værst ….

Trin 7: Og hvis jeg gerne vil skrive tre cifre …. eller endnu mere ??

Og hvis jeg gerne vil skrive tre cifre…. eller endnu mere ??
Og hvis jeg gerne vil skrive tre cifre…. eller endnu mere ??

Modtagelse af flere tegn fra en seriel kommunikation er ikke en simpel opgave.

Seriel buffer er FIFO byte bunke af tegn. Når som helst Serial.read () -funktionen ringer, fjernes den første forkaldelse, der sendes fra bunken, og gemmes andre steder. Normalt en char -variabel i kode. Bemærk, afhængig af hardware, normalt er der en timeout for, hvordan logbuffer kan opbevare oplysninger.

Hvis du har til hensigt at indtaste mere end ét ciffer via serienummer, skal du "komponere" en streng tegn for tegn, når de kommer ind i UART -buffer.

Det betyder, at cykling læser hver buffer char, gemmer i en temp variabel, indlæser den i første position i et string array, går til næste position og starter forfra, indtil … godt, afhænger af applikation. Der er 2 måder at afslutte cyklussen på:

  1. Brug af et "slutmærke" -tegn, f.eks. "Vognretur" eller "Line Feed". Så snart "end Mark" char er fundet, ender loop.
  2. Alternativt kan antallet af tegn i strengkæden begrænses, det samme gør antallet af interaktive cyklusser. Når den når grænsen, lad os sige, 4, erhverve rutinemæssige finish af sig selv.

Lad os tage et kig i et enkelt eksempel på, hvordan du gør dette:

  • Indstil en "slut" -tegning, f.eks. '\ N' (dette betyder ASCII -tegn til linjeindføring).
  • looping i mellemtiden er Serial.available () sand
  • lagring af Serial.read () resulterer i en midlertidig char -variabel. Husk: så snart Serial.read () faktisk "læser" buffer, er den ren, og næste tegn indlæses i den.
  • øge en strengvariabel med denne karakter
  • Hvis sidste tegn er "ende", skal du afslutte sløjfen.

Normalt ligner rutinen for get seriel karakter array et billede.

Det var baseret på en omfattende tilpasning af David A. Mellis originale kode.

Fik fri til at bruge og teste det. Husk: værdier SKAL indtastes i 3 cifre format.

Dette er det for nu. Jeg vil ikke udvide mig med yderligere serielle kommunikationsdetaljer. Det er for komplekst at dække her, og det fortjener det eget Intructables.

Jeg håber, det hjælper dig med at bruge eksempler i Blue Pill og giver dig en vis oplysning om, hvordan korrekt kode til dette lille bord.

Vi ses rundt i andre instruerbare.

Anbefalede: