Innehållsförteckning:

Så, du laddar STM32duino Bootloader i din "blå piller" Så vad nu ?: 7 steg
Så, du laddar STM32duino Bootloader i din "blå piller" Så vad nu ?: 7 steg

Video: Så, du laddar STM32duino Bootloader i din "blå piller" Så vad nu ?: 7 steg

Video: Så, du laddar STM32duino Bootloader i din
Video: Программирование STM32 Blue Pill с помощью релейной логики ПЛК LDmicro 2024, Juli
Anonim
Så du laddar STM32duino Bootloader i din
Så du laddar STM32duino Bootloader i din
Så du laddar STM32duino Bootloader i din
Så du laddar STM32duino Bootloader i din

Om du redan har läst mina instruktioner som förklarar hur man laddar STM32duino bootloader eller någon annan liknande dokumentation, försöker du ladda kodexempel och … det kan hända att ingenting händer alls.

Problemet är att många, om inte alla exempel för "Generisk" STM32 inte kommer att fungera ur lådan. Det kommer att krävas mindre ändringar för att sedan arbeta i ditt STM32 "Blue Pill" -kort.

Jag kommer att välja 4 kodexempel för att förklara vad som behöver ändras och varför. Koder är: "BlinkWithoutDelay", "Fading", "Dimmer" och "AnalogInSerial".

Observera att jag INTE kodade något. Jag utfärdar bara mindre ändringar i koder som skapats av:

David A. Mellis och sent modifierad av Tom Igoe, Marti Bolivar och några fall av Scott Fitzgerald

Tom Igoe och sent modifierad av Bryan Newbold

Så jag föredrar att behålla författarnamnen även i koder som jag ändrar, och behåller skapelsekrediterna.

Steg 1: Pins och Pins…. Varför fungerar inte koden?

Pins and Pins…. Varför fungerar inte koden?
Pins and Pins…. Varför fungerar inte koden?

Låt oss ta en titt i STM32 "Blue Pill" pin out. Anteckningsnålar kan identifieras som PA1 eller PC2 …. något sådant.

Om du tar en titt i till exempel "BlinkWithoutDelay" -kodsexempel, deklareras pin som "33" …. Varför?

Jag misstänker att det beror på att Mr Marti Bolivar överförde den här koden för MAPLE -kortet.

Jag tror att det inte var hans avsikt att låta kod vara kompatibel med "Blue Pill" -kort.

Maple och Maple mini board pins är numeriskt deklarerade, som Arduino, även om de använder siffror som 33, 24 och några liknande.

Jag sa att koden inte fungerade? Mitt fel. Kodkompilera utan några fel och ladda upp korrekt till "Blue Pill", så är min uppfattning att det verkligen fungerar, men med en GPIO -utgång förväntar vi oss inte. Kan inte ens vara tillgänglig.

Så små förändringar är nödvändiga i koden för att den ska fungera som förväntat.

Steg 2: Låt oss "definiera" några pins …

Låt oss
Låt oss

Det är en god kodpraxis att förklara resurser som enkla identifierings- eller meningsvariabler eller konstanta. Det låter dig koda lättare att förstå och felsöka.

Jag använde deklarera Arduino -stift så här:

const int ledPin = 13;

…"

Om du gillar mig kanske du frågar dig själv: "Hur kan jag deklarera stift med namn som PC13 ???"

Svaret är: Använd "#define" C -sats.

Så enligt pinout draw är PC13 stiftet vi har ombord LED i "BluePill". För att använda det skulle jag förklara så här, precis efter bibliotekets definition (#inkludera …) och före allt annat:

#define LedPin PC13

…"

Observera att det inte finns NO ";" radavslutning, NOR "=" tilldelning.

Jämför båda koder. Ett är det ursprungliga exemplet som laddades från IDE. För det andra är det jag justerade lite för att arbeta med "BluePill".

Jag rekommenderar starkt att deklarera alla stift som du tänker använda i koden. Även de tänker använda som ADC -ingång (mer om det senare).

Detta kommer att göra ditt liv lätt.

Steg 3: PinMode () … Hur du använder dina pins …

Innan vi fortsätter, låt oss förstå PinMode () -funktionen.

Precis som Arduino har STM32 -stift flera funktioner. Det enklaste sättet att välja ett eller annat är att använda pinMode () -uttalandet.

Arduino har endast tre lägen tillgängliga, INPUT, OUTPUT eller INPUT_PULLUP.

STM32 har däremot många smaker av pinMode (). Dom är:

UTGÅNG -Grundläggande digital utgång: när stiften är HÖG hålls spänningen på +3,3v (Vcc) och när den är LÅG dras den ner till marken

OUTPUT_OPEN_DRAIN -I öppet dräneringsläge indikerar tappen "låg" genom att acceptera strömflödet till marken och "högt" genom att ge ökad impedans

INPUT_ANALOG -Detta är ett speciellt läge för när stiftet ska användas för analoga (inte digitala) läsningar. Gör att ADC -konvertering kan utföras på spänningen vid stiftet

INPUT_PULLUP -Pinnets tillstånd i detta läge rapporteras på samma sätt som med INPUT, men stiftspänningen "dras försiktigt upp" mot +3,3v

INPUT_PULLDOWN -Pinnets tillstånd i detta läge rapporteras på samma sätt som med INPUT, men stiftspänningen "försiktigt" dras ner "mot 0v

INPUT_FLOATING -Synonym för INPUT

PWM -Detta är ett speciellt läge för när stiftet ska användas för PWM -utgång (ett specialfall med digital utgång)

PWM_OPEN_DRAIN -Liksom PWM, förutom att istället för alternerande cykler med LÅG och HÖG, består spänningen på stiftet av alternerande cykler av LÅG och flytande (frånkopplad)

(Obs: extraherat från

Jag öppnar bara den här parentesen eftersom när du börjar skapa din egen kod, var försiktig med att använda rätt pinMode () för ditt behov.

Steg 4: AnalogWrite () Versus PwmWrite () … Analog utmatning i 2 smaker

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

Innan du använder "Blue Pill" GPIO -stift är det nödvändigt att deklarera dess beteende, det vill säga hur det kommer att fungera. Det är precis vad pinMode () -funktionen gör.

Så, låt oss fokusera nu hur korrekt ställa in en analog utgång. Det kan deklareras antingen som OUTPUT -läge eller PWM -läge.

På samma sätt kan analoga värden tillskrivas GPIO på två sätt: analogWrite () eller pwmWrite (), MEN, analogWrite () KAN bara fungera om pinMode () = OUTPUT. Å andra sidan fungerar pwmWrite () bara om pinMode () = PWM.

Låt oss ta PA0, till exempel: det är en analog/pwm -utgångskandidat.

analogWrite (): detta deklarerar så här:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <nummer>);

……"

där antalet måste vara mellan 0 och 255, som Arduino. Egentligen är den bakåtkompatibel med Arduino.

pwmWrite (): deklarera så här:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <number.>);

…."

Där talet måste vara mellan 0 ~ 65535, en upplösning mycket högre än Arduino.

I bilder är det möjligt att jämföra mellan 2 koder. Du kan också se originalkoden.

Steg 5: STM32 seriell kommunikation

STM32 seriekommunikation
STM32 seriekommunikation

Låt oss se hur USART -gränssnitt är arrangerade i STM32. Ja, gränssnitt i plural ….

"Blue Pill" har 3 USART (RX/ TX 1 ~ 3), och om du använder en bootloader kan du använda USB, den är inte ansluten till någon av då.

Beroende på om du använder USB eller inte, måste du deklarera serieport på ett eller annat sätt i din kod.

Fall 1: Använda USB:

På så sätt laddas skisser ner direkt via USB. Inget behov av att flytta BOOT0 bygel till 1 position och tillbaka till 0.

I det här fallet innebär kommunikation via USB varje gång du förklarar "Serial" utan index.

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

Det är så vi arbetar med. Jag kommer att presentera förändringar i exempel för detta sätt att koda.

En annan sak: "Seriell USB" behöver inte initialiseras. Med andra ord, "… Serial.begin (15200);" är inte nödvändigt.

Det är möjligt att anropa någon seriell funktion (Serial.read (), Serial.write (), etc) utan någon initialisering.

Om den av någon anledning finns i koden kommer kompilatorn att ignorera den.

Fall 2: Använda TTL seria till USB -adapter:

På detta sätt stöder bootloader inte inbyggd STM32 USB -kommunikation, så du behöver en USB till seriell adapter ansluten till TX/ RX 1 (stift PA9 och PA10) för att ladda upp skisser.

I detta fall betyder "Serial" utan index kod, TX/ RX1 (port som används för att ladda upp koden). Så, Serial1 hänvisar till TX/ RX 2 (stift PA2 och PA3) och Serial2 hänvisar till TX/ RX 3 (stift PA10 och PA11). Ingen Serial3 tillgänglig.

Steg 6: Överföra ett värde till mikrokontroller

Överföra ett värde till mikrokontroller
Överföra ett värde till mikrokontroller

Dimmer exempel är ett enkelt sätt att visa hur överföra ett värde till mikrokontroller.

Det antar att passera ett värde från 0 till 255 för att styra LED -ljusstyrkan.

Det kommer INTE att fungera som förväntat i Blue Pill på grund av:

  1. För att använda pwmWrite () -funktionen MÅSTE pinMode () deklareras som PWM -läge.
  2. Du får aldrig hela tre siffror. Funktionen Serial.read () fångar bara buffertinnehåll, vilket är en "BYTE". om du skriver "100" och trycker på "enter", kommer bara sista "0" att fångas från buffert. Och dess värde kommer att vara "48" (decimal ASCII -värde för "0"). Om du tänker ge värdet "100" är det nödvändigt att skriva "d". Så det är korrekt att säga att det kommer att konvertera ett ASCII -symbol decimalvärde i LED -ljusstyrka, eller hur? …
  3. Problem, kartvärden direkt från Serial.read () -funktionen är en trickåtgärd. Det är nästan säkert att få oväntade värden. Bättre tillvägagångssätt är lagringsbuffertinnehåll i en tillfällig variabel och ÄN mappa det.

Som jag förklarade tidigare i punkt 2, kommer kod jag introducerar ändringar att tillåta att ange en ASCII -symbol och detta kommer att styra LED -ljusstyrkan baserat på dess ASCII -decimalvärde … till exempel är "mellanslag" värde 32 (faktiskt är det lägsta utskrivbara tecknet du kan skriva) och "}" är möjligen den högsta (värde 126). Andra tecken kan inte skrivas ut, så terminalen kommer inte att förstå eller de är möjliga en sammansättning av tecken (som "~" är en död tangent på mitt tangentbord och fungerar inte korrekt). Detta betyder att detta sammansatta tecken, när det går in i terminalen, kommer att skicka tecken själv och något annat. Vanligtvis en som inte kan skrivas ut. Och är detta den sista koden kommer att fånga. Tänk också på att din terminal, i det här fallet, INTE ska skicka varken "vagnretur" eller "radmatning". Du måste vara uppmärksam på detta för att koden ska fungera korrekt.

Om du föll är det lite förvirrande, det blir värst ….

Steg 7: Och om jag skulle vilja skriva tre siffror…. eller ännu mer ??

Och om jag skulle vilja skriva tre siffror…. eller ännu mer ??
Och om jag skulle vilja skriva tre siffror…. eller ännu mer ??

Ta emot flera tecken från en seriell kommunikation är inte en enkel uppgift.

Seriell buffert är FIFO byte hög med tecken. Varje gång Serial.read () -funktionen ringer, tas den första char som skickas bort från högen och lagras på någon annanstans. Vanligtvis en rödvariabel i kod. Observera, beroende på hårdvara, vanligtvis finns det en timeout för hur loggbuffert kan behålla information.

Om du tänker ange mer än en siffra via serie måste du "komponera" ett strängtecken efter tecken, eftersom de kommer in i UART -buffert.

Detta innebär att cykling läser varje buffertkärna, lagrar i en tempvariabel, laddar den i första positionen i en strängmatris, går till nästa position och börjar om, tills … ja, beror på applikation. Det finns två sätt att avsluta cykeln:

  1. Använda något "slutmärke" -tecken, som "vagnretur" eller "radmatning". Så snart "end Mark" char visas, slingan hamnar.
  2. Alternativt kan antalet tecken i strängkedjan begränsas, så gör också antalet interaktiva cykler. När den når gränsen, låt oss säga, 4, skaffa rutinmässiga avslut av sig själv.

Låt oss ta en titt i ett enkelt exempel på hur man gör detta:

  • Ställ in en "slut" -tecken, som '\ n' (detta betyder radmatning ASCII -tecken).
  • looping under tiden Serial.available () är sant
  • lagring av Serial.read () resulterar i en tillfällig char -variabel. Kom ihåg: så snart Serial.read () faktiskt "läser" bufferten är den ren och nästa tecken laddas i den.
  • öka en strängvariabel med denna karaktär
  • Om sista tecken är "slut" lämnar du öglan.

Vanligtvis ser rutinen för get serial character array ut som en bild.

Den baserades på en omfattande anpassning av David A. Mellis ursprungliga kod.

Blev fri att använda och testa den. Kom ihåg: värden MÅSTE anges i 3 -siffriga format.

Detta för nu. Jag kommer inte att förlänga mig i ytterligare seriekommunikationsdetaljer. Det är för komplext för att täcka här och det förtjänar det egna Intructables.

Jag hoppas att det hjälper dig att använda exempel i Blue Pill och ge dig lite upplysning hur korrekt kod för denna lilla tavla.

Vi ses i andra instruerbara.

Rekommenderad: