Innholdsfortegnelse:

Så, du laster STM32duino Bootloader i din "blå pille" Så hva nå ?: 7 trinn
Så, du laster STM32duino Bootloader i din "blå pille" Så hva nå ?: 7 trinn

Video: Så, du laster STM32duino Bootloader i din "blå pille" Så hva nå ?: 7 trinn

Video: Så, du laster STM32duino Bootloader i din
Video: Så övervinner du dina laster 2024, November
Anonim
Så du laster STM32duino Bootloader i din
Så du laster STM32duino Bootloader i din
Så du laster STM32duino Bootloader i din
Så du laster STM32duino Bootloader i din

Hvis du allerede har lest instruksjonene mine som forklarer hvordan laste STM32duino bootloader eller annen lignende dokumentasjon, kan du prøve å laste inn eksempelkode og …. Det kan hende ingenting skjer i det hele tatt.

Problemet er at mange, om ikke alle eksempler for "Generisk" STM32 ikke vil fungere ut av esken. Det vil være nødvendige mindre endringer for å få arbeidet i STM32 "Blue Pill" -kortet.

Jeg vil velge 4 kodeeksempler for å forklare hva som må endres og hvorfor. Kodene er: "BlinkWithoutDelay", "Fading", "Dimmer" og "AnalogInSerial".

Merk at jeg IKKE har kodet noe. Jeg utsteder bare mindre endringer i koder som er opprettet av:

David A. Mellis og sent modifisert av Tom Igoe, Marti Bolivar og noen saker av Scott Fitzgerald

Tom Igoe og sent modifisert av Bryan Newbold

Så, jeg foretrekker å beholde forfatternavnene selv i koder jeg endrer, og beholde opprettelseskreditten.

Trinn 1: Pins og Pins…. Hvorfor fungerer ikke koden?

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

La oss ta en titt i STM32 "Blue Pill" pin out. Merk at pins er identifisert som PA1 eller PC2 …. noe slikt.

Hvis du tar en titt i for eksempel "BlinkWithoutDelay" kodeksempel, deklareres pin som "33" …. Hvorfor?

Jeg mistenker at det er fordi Mr. Marti Bolivar portet denne koden for MAPLE -bord.

Jeg tror det ikke var hans hensikt å la kode være kompatibel med "Blue Pill" -tavler.

Maple og Maple mini board pins er numerisk deklarert, som Arduino, selv om de bruker tall som 33, 24 og noen som dette.

Jeg sa at koden ikke fungerte? Min feil. Kodekompilering uten feil og last opp riktig til "Blue Pill", så det er min oppfatning at det virkelig fungerer, men vi forventer ikke å bruke en GPIO -utgang. Kanskje ikke engang tilgjengelig.

Så små endringer er nødvendige i koden for at den skal fungere som forventet.

Trinn 2: La oss "definere" noen pins …

La oss
La oss

Det er en god kode praksis erklære ressurser som enkle identifisere eller betyr variabler eller konstant. Det lar deg kode enklere å forstå og feilsøke.

Jeg brukte Declare Arduino pins slik:

const int ledPin = 13;

…"

Hvis du liker meg, spør du deg selv kanskje: "Hvordan kan jeg erklære pins med navn som PC13 ???"

Svaret er: Bruk "#define" C -setning.

Så, ifølge pinout draw, er PC13 pin vi har ombord LED i "BluePill". For å bruke det, vil jeg erklære slik, like etter biblioteksdefinisjonen (#inkludere …) og før alt annet:

#define LedPin PC13

…"

Vær oppmerksom på at det ikke er NO ";" linjeavslutning, NOR "=" oppgave.

Sammenlign begge kodene. Det ene er det originale eksemplet lastet fra IDE. For det andre er den jeg justerte litt for å jobbe med "BluePill".

Jeg anbefaler på det sterkeste å erklære alle pins du har tenkt å bruke i koden. Selv de har tenkt å bruke som ADC -inngang (mer om det senere).

Dette vil gjøre livet ditt enkelt.

Trinn 3: PinMode () … Hvordan du vil bruke pinnene dine …

La oss forstå PinMode () -funksjonen før du fortsetter.

I likhet med Arduino har STM32 -pinner flere funksjoner. Den enkleste måten å velge den ene eller den andre er ved å bruke pinMode () -setningen.

Arduino har bare tre tilgjengelige moduser, INPUT, OUTPUT eller INPUT_PULLUP.

STM32 har derimot mange smaker av pinMode (). De er:

UTGANG -Grunnleggende digital utgang: når pinnen er HØY, holdes spenningen på +3.3v (Vcc) og når den er LAV, trekkes den ned til bakken

OUTPUT_OPEN_DRAIN -I åpen dreneringsmodus indikerer pinnen "lav" ved å akseptere strømmen til bakken og "høy" ved å gi økt impedans

INPUT_ANALOG -Dette er en spesiell modus for når pinnen skal brukes til analoge (ikke digitale) avlesninger. Gjør det mulig å utføre ADC -konvertering på spenningen ved pinnen

INPUT_PULLUP -Pinnens tilstand i denne modusen rapporteres på samme måte som med INPUT, men pinnespenningen "trekkes forsiktig opp" mot +3.3v

INPUT_PULLDOWN -Pinnens tilstand i denne modusen rapporteres på samme måte som med INPUT, men pinnespenningen "trekkes forsiktig ned" mot 0v

INPUT_FLOATING -Synonym for INPUT

PWM -Dette er en spesiell modus for når pinnen skal brukes til PWM -utgang (et spesielt tilfelle med digital utgang)

PWM_OPEN_DRAIN -Som PWM, bortsett fra at i stedet for vekslende sykluser med LOW og HIGH, består spenningen på pinnen av alternerende sykluser av LOW og flytende (frakoblet)

(merk: hentet fra

Jeg åpner bare denne parentesen, for når du begynner å lage din egen kode, vær forsiktig med å bruke riktig pinMode () for ditt behov.

Trinn 4: AnalogWrite () Versus PwmWrite () … Analog utgang i 2 smaker

AnalogWrite () Versus PwmWrite () … Analog utgang i 2 smaker
AnalogWrite () Versus PwmWrite () … Analog utgang i 2 smaker
AnalogWrite () Versus PwmWrite () … Analog utgang i 2 smaker
AnalogWrite () Versus PwmWrite () … Analog utgang i 2 smaker

Før du bruker "Blue Pill" GPIO -pinner, er det nødvendig å erklære atferden, dvs. hvordan den vil fungere. Det er akkurat det pinMode () -funksjonen gjør.

Så, la oss fokusere nå på hvordan riktig innstilling av en analog utgang. Den kan deklareres enten som OUTPUT -modus eller PWM -modus.

På samme måte kan analoge verdier tilskrives GPIO på to måter: analogWrite () eller pwmWrite (), MEN, analogWrite () VIL bare fungere hvis pinMode () = OUTPUT. På den annen side fungerer pwmWrite () bare hvis pinMode () = PWM.

La oss ta PA0, for eksempel: det er en analog/pwm -utgangskandidat.

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

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <number>);

……"

hvor tallet må være mellom 0 og 255, som Arduino. Egentlig er den bakoverkompatibel med Arduino.

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

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

Hvor tallet må være mellom 0 ~ 65535, en oppløsning som er mye høyere enn Arduino.

I bilder er det mulig å sammenligne mellom 2 koder. Du kan også se den originale koden.

Trinn 5: STM32 seriell kommunikasjon

STM32 seriell kommunikasjon
STM32 seriell kommunikasjon

La oss se hvordan ordnet USART -grensesnitt i STM32. Ja, grensesnitt i flertall ….

"Blue Pill" har 3 USART (RX/ TX 1 ~ 3), og hvis du bruker en bootloader som lar deg bruke USB, er den ikke koblet til noen av da.

Avhengig av om du bruker USB eller ikke, må du deklarere serieport på en eller annen måte i koden din.

Sak 1: Bruke USB:

På denne måten lastes skisser ned direkte via USB. Du trenger ikke å flytte BOOT0 -genseren til 1 posisjon og tilbake til 0.

I dette tilfellet betyr kommunikasjon via USB hver gang du erklærer "Serial" uten indeks.

Så Serial1 betyr TX/ RX 1 (Pins PA9 og PA10); Serial2, betyr TX/ RX 2 (pins PA2 og PA3) og Serial 3 betyr TX/ RX 3 (pins PA10 og PA11).

Dette er måten vi jobber med. Jeg vil presentere endringer i eksempler for denne måten å kode på.

En annen ting: "Seriell USB" trenger ikke å initialiseres. Med andre ord, "… Serial.begin (15200);" det er ikke nødvendig.

Det er mulig å kalle hvilken som helst seriefunksjon (Serial.read (), Serial.write (), etc) uten initialisering.

Hvis den av en eller annen grunn er tilstede i koden, vil kompilatoren ignorere den.

Sak 2: Bruke TTL seria til USB -adapter:

På denne måten støtter ikke bootloader innfødt STM32 USB -kommunikasjon, så du trenger en USB til seriell adapter koblet til TX/ RX 1 (pin PA9 og PA10) for å laste opp skisser.

I dette tilfellet betyr "Serial" uten indeks kode, betyr TX/ RX1 (port som brukes til å laste opp koden). Så videre, Serial1 refererer til TX/ RX 2 (pins PA2 og PA3) og Serial2 refererer til TX/ RX 3 (pins PA10 og PA11). Ingen Serial3 tilgjengelig.

Trinn 6: Overføring av en verdi til mikrokontroller

Overføring av en verdi til mikrokontroller
Overføring av en verdi til mikrokontroller

Dimmer eksempel er enkel måte å vise hvordan overføre en verdi til mikrokontroller.

Den antar å passere en verdi fra 0 til 255 for å kontrollere LED -lysstyrken.

Det vil IKKE fungere som forventet i Blue Pill på grunn av:

  1. For å bruke pwmWrite () -funksjonen MÅ pinMode () deklareres som PWM -modus.
  2. Du vil aldri få hele 3 siffer tall. Serial.read () -funksjonen fanger opp bare bufferinnhold, som er en "BYTE". hvis du skriver "100" og trykker "enter", vil bare siste "0" bli fanget fra buffer. Og verdien vil være "48" (desimal ASCII -verdi for "0"). Hvis du har tenkt å utstede verdien "100", er det nødvendig å skrive "d". Så det er riktig å si at det vil konvertere en ASCII -symbol desimalverdi i LED -lysstyrke, ikke sant …… Vel, en slags …
  3. Problem, kartverdier direkte fra Serial.read () -funksjonen er en trikshandling. Det er nesten sikkert å få uventede verdier. Bedre tilnærming er lagringsbufferinnhold i en midlertidig variabel og EN tilordne det.

Som jeg forklarte før i punkt 2, vil kode jeg introduserer endringer tillate å skrive inn et ASCII -symbol, og dette vil kontrollere LED -lysstyrken basert på ASCII -desimalverdien … for eksempel er "mellomrom" verdi 32 (faktisk er det laveste utskrivbare tegnet du kan skrive inn) og "}" er mulig den høyeste (verdi 126). Andre karakterer kan ikke skrives ut, så terminalen forstår ikke, eller de er mulig en sammensatt karakter (som "~" er en dødtast på tastaturet mitt og fungerer ikke som det skal). Dette betyr at denne sammensatte karakteren, når den kommer inn i terminalen, sender karakteren selv og noe annet. Vanligvis en som ikke kan skrives ut. Og er denne siste koden vil fange opp. Husk også at terminalen din i dette tilfellet IKKE skal sende verken "vognretur" eller "linjefeed". Du må være oppmerksom på dette for at koden skal fungere korrekt.

Hvis du falt er det litt forvirrende, det blir verst ….

Trinn 7: Og hvis jeg vil skrive tre sifre…. eller enda mer ??

Og hvis jeg vil skrive tre sifre…. eller enda mer ??
Og hvis jeg vil skrive tre sifre…. eller enda mer ??

Motta flere tegn fra en seriell kommunikasjon er ikke en enkel oppgave.

Seriell buffer er FIFO bytehaug med røyker. Hver gang Serial.read () -funksjonen ringer, fjernes den første røyken som sendes fra haugen og lagres på andre steder. Vanligvis en char -variabel i kode. Merk, avhengig av maskinvare, vanligvis er det en timeout for hvordan loggbuffer kan beholde informasjon.

Hvis du har tenkt å skrive inn mer enn ett siffer via serienummer, må du "komponere" et strengtegn etter tegn, ettersom de kommer inn i UART -buffer.

Dette betyr at sykling leser hver buffer Char, lagrer i en temp variabel, laster den i første posisjon i en strengmatrise, går til neste posisjon og starter på nytt, til… vel, avhenger av applikasjonen. Det er 2 måter å avslutte syklusen på:

  1. Bruker et "sluttmerke" -tegn, for eksempel "vognretur" eller "Linjemating". Så snart "end Mark" røye er funnet, ender loop opp.
  2. Alternativt kan antall tegn i strengkjeden være begrenset, det samme gjør antallet interaktive sykluser. Når den når grensen, la oss si, 4, skaffe rutinemessige avslutninger av seg selv.

La oss ta en titt i et enkelt eksempel på hvordan du gjør dette:

  • Angi en "slutten" -tegning, for eksempel '\ n' (dette betyr ASCII -tegn for linjefôr).
  • looping i mellomtiden er Serial.available () sant
  • lagring av Serial.read () resulterer i en midlertidig char -variabel. Husk: så snart Serial.read () faktisk "leser" buffer, er den ren og neste tegn lastes inn.
  • øk en strengvariabel med denne røya
  • Hvis siste røye er "slutt", gå ut av sløyfen.

Vanligvis ser rutine for get serial character array ut som bilde.

Den var basert på en omfattende tilpasning av David A. Mellis originale kode.

Ble fri til å bruke og teste den. Husk: verdier MÅ skrives inn i tre siffer format.

Dette er det for nå. Jeg vil ikke forlenge meg selv i ytterligere seriell kommunikasjon detaljer. Den er for kompleks til å dekke her, og den fortjener sin egen Intructables.

Jeg håper det kan hjelpe deg med å bruke eksempler i Blue Pill og gi deg litt opplysning om riktig kode for dette lille brettet.

Se deg rundt i andre instruerbare.

Anbefalt: