Cuprins:

Deci, încărcați încărcătorul de boot STM32duino în „pastila albastră” Deci, ce se întâmplă acum ?: 7 pași
Deci, încărcați încărcătorul de boot STM32duino în „pastila albastră” Deci, ce se întâmplă acum ?: 7 pași

Video: Deci, încărcați încărcătorul de boot STM32duino în „pastila albastră” Deci, ce se întâmplă acum ?: 7 pași

Video: Deci, încărcați încărcătorul de boot STM32duino în „pastila albastră” Deci, ce se întâmplă acum ?: 7 pași
Video: Ce se întâmplă dacă încarci un iPhone cu încărcător de iPad sau MacBook 2024, Noiembrie
Anonim
Deci, încărcați STM32duino Bootloader în
Deci, încărcați STM32duino Bootloader în
Deci, încărcați STM32duino Bootloader în
Deci, încărcați STM32duino Bootloader în

Dacă ați citit deja instrucțiunile mele explicând modul de încărcare a încărcătorului de încărcare STM32duino sau orice altă documentație similară, încercați să încărcați exemplul de cod și …. Poate că nu se întâmplă nimic.

Problema este că multe, dacă nu toate exemplele pentru "Generic" STM32 nu vor funcționa din cutie. Va fi necesar să faceți modificări minore pentru a lucra apoi pe placa dvs. STM32 „Blue Pill”.

Voi selecta 4 exemple de cod pentru a explica ce trebuie să se schimbe și de ce. Codurile sunt: „BlinkWithoutDelay”, „Fading”, „Dimmer” și „AnalogInSerial”.

Rețineți că NU am codat nimic. Tocmai emit modificări minore în codurile create de:

David A. Mellis și modificat târziu de Tom Igoe, Marti Bolivar și unele cazuri de Scott Fitzgerald

Tom Igoe și modificat târziu de Bryan Newbold

Așadar, prefer să păstrez numele autorilor chiar și în codurile pe care le modific, păstrând creditul de creație.

Pasul 1: Pinii și pinii …. De ce codul nu funcționează?

Știfturi … De ce codul nu funcționează?
Știfturi … De ce codul nu funcționează?

Să aruncăm o privire în pinul STM32 „Blue Pill”. Pinii de notă sunt identificați ca PA1 sau PC2 …. așa ceva.

Dacă aruncați o privire, de exemplu, în exemplul de cod „BlinkWithoutDelay”, pinul este declarat ca „33” …. De ce?

Bănuiesc că acest lucru se datorează faptului că domnul Marti Bolivar a portat acest cod pentru placa MAPLE.

Cred că nu a fost intenția sa să permită codul compatibil cu panourile „Blue Pill”.

Pinii Maple și Maple mini sunt declarați numeric, la fel ca Arduino, deși utilizează numere precum 33, 24 și unele ca acesta.

Am spus că codul nu funcționează? Greseala mea. Compilați codul fără nicio eroare și încărcați-l corect în „Blue Pill”, așadar, este părerea mea că într-adevăr funcționează, dar folosind o ieșire GPIO nu ne așteptăm. Poate că nici măcar nu este disponibil.

Deci, sunt necesare mici modificări în cod pentru a funcționa așa cum era de așteptat.

Pasul 2: Să „definim” niște pini…

Haideți
Haideți

Este o practică de cod bună, declară resursele ca fiind ușor de identificat sau semnificând variabile sau constante. Vă va permite codul mai ușor de înțeles și de depanare.

Am folosit declarați ace Arduino astfel:

const int ledPin = 13;

…"

Dacă îmi place mie, poate vă întrebați: „Cum pot declara ace cu nume precum PC13 ???”

Răspunsul este: Utilizați instrucțiunea "#define" C.

Deci, în funcție de extragerea pinout-ului, PC13 este pinul pe care îl avem la bord LED în „BluePill”. Pentru a-l folosi, aș declara așa, imediat după definirea bibliotecilor (# include …) și înainte de orice altceva:

#define LedPin PC13

…"

Rețineți că NU există „;” terminarea liniei, NOR "=" atribuire.

Comparați ambele coduri. Unul este exemplul original încărcat din IDE. Al doilea este cel pe care l-am adaptat pentru a lucra cu „BluePill”.

Vă recomand cu tărie să declarați toate codurile pe care intenționați să le utilizați în cod. Chiar și cei intenționează să utilizeze ca intrare ADC (mai multe despre aceasta mai târziu).

Acest lucru vă va ușura viața.

Pasul 3: PinMode () … Cum îți vei folosi pinii …

Înainte de a continua, să înțelegem funcția PinMode ().

La fel ca Arduino, pinii STM32 au mai multe funcții. Cel mai simplu mod de a selecta una sau alta este utilizarea instrucțiunii pinMode ().

Arduino are doar 3 moduri disponibile, INPUT, OUTPUT sau INPUT_PULLUP.

STM32, în schimb, are multe arome de pinMode (). Sunt:

IEȘIRE - Ieșire digitală de bază: când pinul este ÎNALT, tensiunea este menținută la + 3,3 v (Vcc) și când este scăzută, este trasă în jos la sol

OUTPUT_OPEN_DRAIN -În modul de scurgere deschis, știftul indică „scăzut” acceptând debitul curent la sol și „ridicat” oferind impedanță crescută

INPUT_ANALOG-Acesta este un mod special pentru momentul în care pinul va fi utilizat pentru citiri analogice (nu digitale). Permite efectuarea conversiei ADC la tensiunea de la pin

INPUT_PULLUP -Starea pinului în acest mod este raportată la fel ca la INPUT, dar tensiunea pinului este ușor „trasă în sus” spre + 3.3v

INPUT_PULLDOWN -Starea pinului în acest mod este raportată la fel ca la INPUT, dar tensiunea pinului este ușor „trasă în jos” către 0v

INPUT_FLOATING -Sinonim pentru INPUT

PWM - Acesta este un mod special pentru momentul în care pinul va fi utilizat pentru ieșirea PWM (un caz special de ieșire digitală)

PWM_OPEN_DRAIN -Ca PWM, cu excepția faptului că, în loc de cicluri alternative de LOW și HIGH, tensiunea pe pin constă din cicluri alternante de LOW și plutitoare (deconectat)

(notă: extras de pe

Deschid doar această paranteză pentru că atunci când începeți să creați propriul cod, aveți grijă să utilizați pinMode corect () pentru nevoile dvs.

Pasul 4: AnalogWrite () versus PwmWrite () … Ieșire analogică în 2 variante

AnalogWrite () Versus PwmWrite ()… Ieșire analogică în 2 arome
AnalogWrite () Versus PwmWrite ()… Ieșire analogică în 2 arome
AnalogWrite () Versus PwmWrite ()… Ieșire analogică în 2 arome
AnalogWrite () Versus PwmWrite ()… Ieșire analogică în 2 arome

Înainte de a utiliza pinii GPIO „Blue Pill” este necesar să-i declarați comportamentul, adică cum va funcționa. Exact asta face funcția pinMode ().

Deci, să ne concentrăm acum cât de corect este setarea unei ieșiri analogice. Poate fi declarat fie în modul OUTPUT, fie în modul PWM.

În același mod, valorile analogice pot fi atribuite GPIO în 2 moduri: analogWrite () sau pwmWrite (), DAR, analogWrite () FUNCȚIONEAZĂ doar dacă pinMode () = OUTPUT. Pe de altă parte, pwmWrite () va funcționa numai dacă pinMode () = PWM.

Să luăm PA0, de exemplu: este un candidat de ieșire analog / pwm.

analogWrite (): acest lucru se declară astfel:

….

#define ledPin PA0

pinMode (ledPin, OUTPUT);

analogWrite (ledPin, <număr>);

……"

unde numărul trebuie să fie între 0 și 255, la fel ca Arduino. De fapt, este compatibil cu Arduino.

pwmWrite (): declarați în acest fel:

#define ledPin PA0

pinMode (ledPin, PWM);

pwmWrite (ledPin, <număr.>);

…."

Unde numărul trebuie să fie între 0 ~ 65535, o rezoluție mult mai mare decât Arduino.

În imagini este posibil să se compare între 2 coduri. De asemenea, puteți vedea codul original.

Pasul 5: Comunicare în serie STM32

Comunicare în serie STM32
Comunicare în serie STM32

Să vedem cum este aranjat interfețele USART în STM32. Da, interfețe la plural …..

„Blue Pill” are 3 USART (RX / TX 1 ~ 3) și, dacă utilizați un bootloader, vă permite să utilizați USB, nu este conectat la niciunul dintre acestea.

În funcție de utilizarea sau nu a USB-ului, trebuie să declarați portul serial într-un mod sau altul în codul dvs.

Cazul 1: Utilizarea USB:

În acest fel, schițele sunt descărcate direct prin USB. Nu este nevoie să mutați jumperul BOOT0 în poziția 1 și înapoi la 0.

În acest caz, de fiecare dată când declarați „Serial” fără index, înseamnă comunicare prin USB.

Deci, Serial1, înseamnă TX / RX 1 (Pinii PA9 și PA10); Serial2, înseamnă TX / RX 2 (pinii PA2 și PA3) și Serial 3 înseamnă TX / RX 3 (pinii PA10 și PA11).

Acesta este modul în care lucrăm. Voi prezenta modificări în exemple pentru acest mod de codare.

Un alt lucru: „Serial USB” nu trebuie inițializat. Cu alte cuvinte, „… Serial.begin (15200);” nu este necesar.

Este posibil să apelați orice funcție Serial (Serial.read (), Serial.write () etc.) fără nicio inițializare.

Dacă, dintr-un anumit motiv, este prezent în cod, compilatorul îl va ignora.

Cazul 2: Utilizarea adaptorului TTL seria la USB:

În acest fel, bootloader-ul nu acceptă comunicarea USB STM32 nativă, deci aveți nevoie de un adaptor USB la serial conectat la TX / RX 1 (pin PA9 și PA10) pentru a încărca schițe.

În acest caz, oricând „Serial” fără index este cod, înseamnă TX / RX1 (portul folosit pentru încărcarea codului). Deci, Serial1 se referă la TX / RX 2 (pinii PA2 și PA3) și Serial2 se referă la TX / RX 3 (Pinii PA10 și PA11). Nu există Serial3 disponibil.

Pasul 6: Trecerea unei valori către microcontroler

Trecerea unei valori către microcontroler
Trecerea unei valori către microcontroler

Exemplul Dimmer este un mod simplu de a arăta cum treceți o valoare către microcontroler.

Se presupune că treceți o valoare de la 0 la 255 pentru a controla luminozitatea LED-ului.

NU va funcționa așa cum era de așteptat în Blue Pill datorită:

  1. Pentru a utiliza funcția pwmWrite (), pinMode () TREBUIE să fie declarat ca mod PWM.
  2. Nu veți primi niciodată un număr întreg de 3 cifre. Funcția Serial.read () captează doar conținut buffer, care este un „BYTE”. dacă tastați „100” și apăsați „enter”, doar ultimul „0” va fi capturat din buffer. Și valoarea acestuia va fi „48” (valoare ASCII zecimală pentru „0”). Dacă intenționați să emiteți valoarea "100", este necesar să tastați "d". Deci, este corect să spunem că va converti o valoare zecimală a simbolului ASCII în luminozitatea LED-urilor, nu ?? … Ei bine, un fel de …
  3. Problemă, harta valorilor direct din funcția Serial.read () este o acțiune truc. Este aproape sigur să obțineți valori neașteptate. O abordare mai bună este conținutul tampon de stocare într-o variabilă temporară și decât să-l mapeze.

Așa cum am explicat anterior în articolul 2, codul pe care îl introduc modificări va permite introducerea unui simbol ASCII și acest lucru va controla luminozitatea LED-ului în funcție de valoarea sa zecimală ASCII … de exemplu, „spațiu” este valoarea 32 (de fapt este cel mai mic caracter imprimabil pe care îl puteți introduce) iar „}” este posibil cel mai mare (valoarea 126). Alte caractere nu sunt tipărite, deci terminalul nu va înțelege sau este posibil un compus de caractere (cum ar fi „~” este o tastă moartă în tastatura mea și nu va funcționa corect). Aceasta înseamnă că acest caracter compus, atunci când introduceți în terminal, va trimite caracterul însuși și altceva. De obicei una care nu se poate printa. Și acesta este ultimul cod pe care îl va captura. De asemenea, rețineți că terminalul dvs., în acest caz, NU ar trebui să trimită nici „returnarea transportului”, nici „alimentarea liniei”. Trebuie să fiți atenți la acest lucru pentru ca codul să funcționeze corect.

Dacă ați căzut, este puțin confuz, devine mai rău …..

Pasul 7: Și dacă aș vrea să introduc trei cifre … sau chiar mai mult ??

Și dacă aș vrea să introduc trei cifre … sau chiar mai mult ??
Și dacă aș vrea să introduc trei cifre … sau chiar mai mult ??

Primirea mai multor caractere dintr-o comunicare în serie nu este o sarcină simplă.

Bufferul serial este o grămadă de caractere FIFO byte. De fiecare dată când funcția Serial.read () apelează, primul caracter trimis este eliminat din grămadă și stocat în alte locuri. De obicei, o variabilă char în cod. Rețineți, depindeți de hardware, de obicei există un timeout pentru modul în care bufferul de jurnal poate păstra informațiile.

Dacă intenționați să introduceți mai mult de o cifră prin serial, va trebui să „compuneți” un șir caracter cu caracter, pe măsură ce intră în buffer-ul UART.

Aceasta înseamnă că ciclismul citește fiecare caracter tampon, stochează într-o variabilă temp, încarcă-l în prima poziție a unei matrice de șiruri, trece la următoarea poziție și pornește de la început, până când … bine, depinde de aplicație. Există 2 moduri de a încheia ciclul:

  1. Folosind un caracter „semn final”, cum ar fi „Întoarcere cărucior” sau „Alimentare linie”. De îndată ce se găsește caracterul „end Mark”, bucla se termină.
  2. Alternativ, numărul de caractere din lanțul de șiruri poate fi limitat, la fel și numărul de cicluri interactive. Când atinge limita, să spunem, 4, să dobândim finisaje de rutină de la sine.

Să aruncăm o privire într-un exemplu simplu cum se face acest lucru:

  • Setați un caracter „de sfârșit”, cum ar fi „\ n” (acest lucru înseamnă linie ASCII char).
  • buclarea între timp Serial.available () este adevărată
  • stocarea Serial.read () are ca rezultat o variabilă temporară char. Amintiți-vă: imediat ce Serial.read () de fapt „citește” tamponul, acesta este curat și următorul caracter se încarcă în el.
  • creșteți o variabilă de șir cu acest caracter
  • Dacă ultimul caracter este „sfârșit”, ieși din buclă.

De obicei, rutina pentru a obține o serie de caractere în serie arată ca o imagine.

S-a bazat pe o adaptare extinsă a codului original al domnului David A. Mellis.

Folosiți-l gratuit și testați-l. Rețineți: valorile TREBUIE să fie introduse în format de 3 cifre.

Acesta este deocamdată. Nu mă voi extinde în detalii suplimentare de comunicare în serie. Este prea complex pentru a acoperi aici și merită propriile sale instrumente.

Sper că vă va ajuta să folosiți exemple în Blue Pill și să vă oferiți o iluminare cât de corect este codul pentru această mică placă.

Ne vedem în jur în alte instrumente instructabile.

Recomandat: