Internet Windows Android

Firmware stm32 prin UART. STM32 este foarte simplu Stm32 de unde să obțineți firmware gata făcut

Cel mai simplu și mai accesibil mod de a flash STM32- prin utilizarea bootloader, în acest articol vom analiza cum să faceți acest lucru folosind exemplul unei plăci miniSTM32F103V.

În primul rând, să înțelegem ce este bootloader sau cum se numește încărcător. Încărcător- este doar un program care este stocat într-o anumită secțiune de memorie și poate suprascrie microcontrolerul flash. Este cusut în timpul producției cipului și nu poate fi schimbat în niciun fel. Pentru ca microcontrolerul să intre în această secțiune de memorie, trebuie să ieșiți BOOT0 trageți până la putere și ieșire BOOT1 la pamant. Pe placă, acești doi pini se află lângă conectorul USB, iar tragerea se realizează folosind jumperi.
Mai jos este un tabel care determină din ce zonă de memorie va porni microcontrolerul după o resetare, în funcție de BOOT0Și BOOT1.


Să presupunem că am instalat jumperi, acum trebuie să transferăm fișierul hex cu firmware-ul la bootloader, îl vom transfera prin uart, pentru asta avem nevoie de un convertor uart usb.


Am un astfel de convertor realizat pe baza unui microcircuit FT232RL folosind un vârf subțire pentru o stație de lipit, lipirea este foarte simplă. Metoda de etanșare este următoarea, mai întâi trebuie să prindeți un picior din două unghiuri opuse, apoi când microcircuitul este fixat, lipiți restul picioarelor cu un fier de lipit sau un uscător de păr. Iar atingerea finală, încă o dată lipim picioarele, care au fost lipite mai întâi, pentru a elimina stresul mecanic de pe ele.

Conectam adaptorul uart usb la computer și în funcție de cip pe care este realizat CP2120 sau FT232, instalați driverele corespunzătoare. După aceea, ar trebui să fie definit în sistem ca COM_PORT.


Acum să conectăm adaptorul nostru la placă, să conectăm ieșirea RX a adaptorului la ieșire MCU_TxD, iar ieșirea lui TX cu ieșirea MCU_RхD. Topologia plăcii pe care a trimis-o vânzătorul este puțin diferită de cea din imaginea de sus, pinii pentru firmware sunt afișați separat și sunt marcați cu săgeți roșii.


În continuare, trebuie să descărcați un program cu care vom contacta bootloader-ul, acesta se numește FLASH LOADER DEMONSTRATOR.


După instalarea programului, selectați portul com sub care a fost definit adaptorul nostru uart usbși apăsați butonul NEXT, viteza va fi determinată automat. Dacă controlerul este protejat la citire, atunci protecția poate fi eliminată prin apăsarea butonului „Eliminați protecția”, în timp ce memoria flash va fi ștearsă și, în consecință, toate datele care sunt scrise în ea se vor pierde.


Dacă controlerul nu este protejat, va apărea fereastra prezentată mai jos, în care apăsăm butonul NEXT.


În următoarea fereastră, trebuie să alegeți ce vrem să facem: citiți / scrieți flash-ul microcontrolerului, ștergeți-l, interziceți citirea / scrierea, ne interesează să scriem, pentru aceasta selectăm fișierul pe care vrem să-l încărcăm și apăsăm URMĂTORUL.

Ei bine, aici am ajuns la una dintre cele mai interesante etape - cum să încărcăm firmware-ul finit pe controler și, în sfârșit, să ne reînvie piesa de fier.

De fapt, puteți flash controlere STM32 în moduri diferite, dar vom lua în considerare cea mai simplă opțiune de firmware - printr-o interfață serială folosind utilitarul proprietar Flash Loader Demonstrator. Acest utilitar este complet gratuit și poate fi descărcat atât din versiunea oficială, cât și din .

După cum am spus mai devreme, bootloader-ul este cusut în zona de memorie de sistem a controlerului. El este cel care vă permite să scrieți firmware-ul în memoria flash printr-o interfață serială.

Bootloader-ul este descris în detaliu în documentul AN2606 (CD00167594.pdf), iar protocolul pe care îl folosește este în documentul AN3155 (CD00264342.pdf). Aceasta este pentru cei care doresc informații cuprinzătoare, și vom analiza pe scurt procesul de firmware prin bootloader.

Mai întâi trebuie să descărcați și să instalați utilitarul Flash Loader Demonstrator pe computer.

Deci, piciorul Tx al controlerului trebuie să fie conectat la piciorul Rx al convertorului, iar piciorul Rx al controlerului la piciorul Tx al convertorului. În plus, controlerul trebuie să fie alimentat și să ofere nivelurile dorite pe picioarele BOOT0 (pin 44), BOOT1 (pin 20). Pentru a porni bootloader-ul, care se află în memoria sistemului, piciorul BOOT1 trebuie tras la „sol”, iar BOOT0 la „putere” (placa din dreapta).

Este mai bine să faceți un pull-up pentru BOOT0, BOOT1 nu greu, dar cu jumperi, astfel încât să puteți selecta cu ușurință modurile de pornire (de exemplu, trecând la modul de pornire flash după încărcarea programului, puteți testa imediat acest program) .

Schema de conectare este prezentată mai jos.

Paritatea și numărul de biți de date sunt deja configurate după cum este necesar, viteza poate fi modificată - controlerul se adaptează automat la viteza selectată în timpul inițializării schimbului, trebuie să selectați portul com care a fost creat la conectarea USB -to-COM convertor la computer (convertorul nostru se creează la conectarea unui com-port virtual, care imită complet unul hardware real). După ce totul este configurat, faceți clic pe „Următorul”.

Faptul că totul este în regulă și a fost posibilă conectarea la controler, vom fi informați de un semafor verde pe pagina următoare. Dacă conexiunea nu este stabilită, nu ne va fi permis să intrăm deloc pe această pagină, spunând că controlorul nu răspunde.

Când se stabilește o conexiune, programul va determina automat câtă memorie flash are controlerul și dacă această memorie este protejată la citire. Prin apăsarea butonului „Eliminați protecția”, protecția poate fi eliminată, dar conținutul blițului va fi șters (firmware-ul anterior scris acolo va fi distrus). Apăsăm „Următorul”.

În fereastra următoare, ni se solicită să selectăm tipul de piatră care urmează să fie programată (deși nu este clar de ce - oricum se determină automat), și afișează, de asemenea, PID-ul, cardul de memorie flash și versiunea de bootloader pentru piatra noastră. Doar faceți clic pe „Următorul”.

În fereastra următoare, trebuie să alegeți ce vrem să facem de fapt cu controlerul nostru. Următoarele opțiuni sunt posibile aici: Ștergere (ștergere), Descărcare pe dispozitiv (descărcare firmware pe controler), Încărcare de pe dispozitiv (citește firmware-ul de la controler), Activare / Dezactivare protecție Flash (activare / dezactivare protecție a memoriei flash), opțiunea Editare octeți (modificați octeții de opțiune). În consecință, dacă dorim să încărcăm firmware-ul, selectați Descărcare pe dispozitiv, apoi faceți clic pe pătratul cu trei puncte și selectați fișierul cu firmware-ul care urmează să fie încărcat în explorator, apoi faceți clic din nou pe „Următorul”.

Pe pagina următoare, în partea de jos va apărea o bară de progres, care va afișa progresul procedurii de descărcare. După ce tot firmware-ul a fost descărcat în controler, această bară de progres va deveni verde și va spune cu litere albe: „Operațiunea de descărcare s-a încheiat cu succes” (operația de descărcare a fost finalizată cu succes). După aceea, puteți face clic pe butonul „Închidere” și puteți închide Demonstratorul Flash Loader

Gata, acum pentru ca programul inundat să înceapă să se execute, trebuie doar să configuram controlerul să pornească de pe flash (BOOT0 = 0, BOOT1 - orice nivel) și să îl reporniți.

Această clonă Arduino oferă un bootloader special care vă permite să încărcați firmware prin USB, fără a utiliza componente externe precum ST-Link sau un adaptor USB-UART.

Astăzi trebuia să lucrez cu un controler gol de sub CooCox și fără stm32duino. Dar aici este problema. Nici măcar o simplă intermitent cu un bec turnat prin acest bootloader nu funcționează.

Să ne dăm seama. Poate că calculele mele vor părea banale cuiva. Dar abia încep să studiez controlerele STM32 și am ucis cel puțin jumătate de zi pentru a găsi o problemă. Dintr-o dată acest articol va reduce timpul de dezvoltare al cuiva.

Nu am nimic împotriva ST-Link și a altor depanatoare. Dar în dispozitivul meu finit nu va fi, dar cu siguranță va fi USB. De ce să nu stabiliți imediat capacitatea de a actualiza firmware-ul prin USB? Personal, mi se pare convenabilă această metodă. mai ales ca mai am un cablu conectat prin care se alimenteaza alimentare si USB Serial.

Să vedem cum funcționează bootloader-ul. Pentru început, pe exemplul controlerelor AVR. De ce mi-am adus aminte de el? Mă mutam de la Arduino și mă așteptam subconștient la același comportament. Dar în STM32 totul s-a dovedit diferit. Prin urmare, vreau să vorbesc despre diferența dintre aceste două microcontrolere.

Asa de. ÎN Microcontrolere AVR Bootloader-ul ATMega poate rezerva o anumită cantitate de memorie spre sfârșitul flash-ului. Folosind biți de siguranță, puteți controla de la ce adresă va porni programul. Dacă nu există încărcător de pornire, programul pornește de la adresa 0x0000. Dacă există un bootloader, acesta începe de la o altă adresă (de exemplu, în ATMega32 cu 0x3C00, dacă dimensiunea bootloader-ului este setată la 2k).

Când bootloader-ul și-a făcut treaba, acesta transferă controlul către programul principal de la adresa 0x0000. Acestea. programul începe întotdeauna la adresa 0x0000. Compilatorul și linkerul funcționează cu presupunerea că codul va fi localizat la începutul spațiului de adrese.

În microcontrolerele STM32, totul este diferit. Toate programele încep la adresa 0x0800000. Bootloader-ul nu este nimic special. Acesta este același program care pornește de la aceeași adresă de pornire. În timpul funcționării, bootloader-ul poate primi firmware (prin USB sau UART, citi de pe o unitate flash USB, primește de la un satelit, îl poate obține din subspațiu, orice ...) și îl poate scrie la adrese mai mari decât se află bootloader-ul în sine. Și, desigur, la sfârșitul activității, transferați controlul în programul principal.

Deci, atunci când compilați firmware-ul, trebuie să știți unde va scrie bootloader-ul și va ajusta adresele în consecință.

Asta e tot cu teorie. Să trecem la practică. De mai jos instrucțiuni pas cu pas cum să înșurubesc Bootloader USB la microcontrolere din seria STM32F1xx și poate și la unele altele.

Există, totuși, unele restricții privind circuitele. Aici, din păcate, nu sunt puternic. YTP are nevoie de un rezistor pull-up de 1,5k pentru portul PA12 (alias USB D+). Acest lucru permite bootloader-ului momente potrivite este timpul să vă conectați și să vă deconectați de la USB.

Instructiuni:

  • Descărcați github.com/rogerclarkmelbourne/STM32duino-bootloader. Directorul STM32F1binaries are deja un pachet de bootloadere compilate pentru diferite plăci. Indexul de la sfârșitul numelui fișierului indică locul unde este conectat LED-ul. În cazul în care LED-ul este conectat la pinul C13, am folosit fișierul generic_boot20_pc13.bin.
  • Să fulgerăm. Da, veți avea nevoie de un adaptor USB-UART, dar probabil că puteți utiliza un depanator
  • Acum microcontrolerul este gata pentru a fi flash prin intermediul bootloader-ului USB. Dar tot trebuie să remediați firmware-ul în sine. Și trebuie să faci 2 lucruri:
    • Specificați adresa de pornire a linkerului. În CooCox, acest lucru se face în setările proiectului, fila Link, secțiunea Zone de memorie, Adresa de pornire IROM1. Bootloader-ul ocupă primii 8 kilobytes, deci adresa de pornire a firmware-ului va fi 0x0800000 + 0x2000 = 0x08002000. Câmpul Dimensiune ar trebui probabil redus și cu 8k
    • Undeva la începutul programului, înainte de a inițializa periferia, faceți un apel la NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x2000);
  • Umplerea firmware-ului este posibilă. În directorul de instrumente, căutați un script numit maple_upload. Am folosit doar versiunea de Windows - maple_upload.bat
  • Alergați așa:
    „maple_upload.bat” COM20 2 1EAF:0003 „PathToFirmware.bin”

    În loc de COM20, trebuie să înlocuiți portul unde este atașat microcontrolerul.

    Umplutura este un lucru foarte delicat, nu-i plac traseele relative. deci calea către firmware trebuie specificată în întregime.

    1EAF:0003 este VID și PID

    2 este parametrul AltID, care indică faptul că firmware-ul ar trebui să fie încărcat la 0x08002000 (citește)

Încă câteva nuanțe. Înainte de a încărca firmware-ul, trebuie să rulați bootloader-ul. Cel mai simplu mod este să apăsați butonul de resetare. După aceea, bootloader-ul va porni și aștepta câteva secunde pentru firmware. Dacă nimeni nu rulează maple_upload în acest moment, încărcătorul va transmite controlul firmware-ului principal.

Acest lucru poate cauza neplăceri. Dacă microcontrolerul se oprește și se blochează, atunci nu mai ascultă portul. Prin urmare, nu poate auzi secvența de taste și nu poate reporni în bootloader-ul. Apoi resetați doar pentru a ajuta.

Asta e tot. Sper că articolul meu va face lumină asupra modului în care funcționează bootloader-ul în STM32 și cum puteți încărca firmware-ul prin port USB. Din păcate, pragul de intrare este încă mare, dar dintr-o dată articolul meu va ajuta pe cineva să-l depășească.

Să presupunem că ți-ai lansat dispozitivul pe piață și te temi că cineva va începe să-l copieze... Într-adevăr, este suficient să conectezi programatorul la dispozitivul nostru și să citești firmware-ul, de exemplu, prin utilitarul ST-Link ( ŢintăConectați).

Desigur, puteți doar să rupeți picioarele microcontrolerului... dar dezvoltatorii ST Microelectronics oferă o alternativă mai bună. Toate MK au un sistem de protecție pentru citire. Esența sa este extrem de simplă - dacă este setat un registru special (Option bytes). o anumită valoare- atunci capacitatea de depanare și citire a firmware-ului este dezactivată. În acest mod, veți pierde și capacitatea de a flash-ul MK. Desigur, această protecție poate fi dezactivată prin modificarea valorii din registrul Option bytes, dar în acest caz, memoria programului va fi suprascrisă, ceea ce înseamnă că nimeni nu o va putea copia.

Puteți modifica valoarea din registru folosind același utilitar ST-Link, ŢintăOcteți de opțiune...Citiți protecțiaPERMITE.


Dezactivarea, respectiv, poate fi într-un mod similar. Acest lucru nu este foarte convenabil dacă există o mulțime de dispozitive. Puteți activa protecția în mod programatic.

Pentru a implementa protecția, este convenabil de utilizat bibliotecă standard periferice, în special stm32f10x_flash.c conține funcția de care avem nevoie. Registrul în sine, precum și lucrul cu memoria flash, sunt descrise în document. Cu toate acestea, înainte de asta, să ne amintim cum este implementată protecția pentru includerea multiplă a fișierelor antet. Am folosit astfel de directive de preprocesor ca:

  • #define - directiva îi spune preprocesorului să înlocuiască linia din fișier, totuși, dacă argumentul (ce este la sfârșit) nu este specificat, identificatorul în sine (ce este la mijloc) rămâne în sistem și poate fi verificat prin alte directive (adică, puteți scrie o condiție, cu care se va executa un anumit cod sau invers);
  • #ifndef - directiva poate fi citită ca „dacă nu este definită”, dar un alt #ifdef - „dacă cu siguranță” este mai potrivit pentru noi;
  • #endif - o directivă care indică sfârșitul unei condiții.

Să creăm un identificator care va spune că acest ansamblu este final. Pa șir dat comentat - codul plasat între #ifdef și #endif nu va fi executat.

//#definiți RELEASE

La asamblarea finală, pur și simplu decomentați linia și flash dispozitivul.

#ifdef RELEASE // cod aici #endif

Și acum la obiect. Ne-am dat deja seama cum să lucrăm cu memoria flash internă a microcontrolerului. Înainte de a scrie biții de protecție, trebuie să deblocați accesul la memorie, apoi trebuie să efectuați operațiunile necesare și să blocați din nou accesul. Rezultă următoarele:

#ifdef RELEASE #warning "Protecția este PORNITĂ. Depanarea este DEZACTIVATĂ" dacă (FLASH_GetReadOutProtectionStatus() == RESET) ( FLASH_Unlock(); FLASH_ReadOutProtection(ENABLE); FLASH_Lock(); ) #endif

Unele dintre microcontrolerele stm32 acceptă protocolul USB DFU (lista lor poate fi găsită în nota aplicației AN3156), firmware-ul poate fi încărcat pe un astfel de MK prin USB normal, folosind de exemplu DFuSe demo de la ST sau open source dfu-util. Cu această opțiune, totul este clar și nu o voi descrie.

Pentru același MK (în special cel folosit în placa BluePill - STM32F103C8T6), care sunt lipsiți de suport DFU, într-un fel sau altul aveți nevoie de un programator, de exemplu ST-Link V2 Mini

Fixarea dispozitivului:

Conectarea la placă este simplă:

ST-Link STM32F103C8T6 3,3 V --- 3,3 V GND --- GND SWDIO --- DIO SWCLK --- DCLK

De asemenea, aveți nevoie de utilitarul ST-Link, îl puteți descărca de pe site-ul oficial st.com - link. Când vă conectați pentru prima dată, ar fi bine să actualizați firmware-ul programatorului însuși. Selectați ST-LINK -> actualizare firmware, dacă este disponibil un firmware mai recent, atunci va fi ceva de genul acesta:

Selectați Da >>>>, firmware-ul este actualizat.

Apoi, deschideți fișierul firmware în sine și selectați Țintă -> Conectare. Informațiile despre MK-ul dvs. vor apărea și în fereastra de stare a utilitarului - aceasta înseamnă că programatorul este conectat corect și utilitarul poate contacta MK. Exemplu:

Apoi trebuie să faceți o curățare completă a cipului, selectați Țintă -> Ștergeți cip

Dacă, de exemplu, firmware-ul meu de la postarea controlerului pedalei și butoanelor a fost deja încărcat și trebuie să fie actualizat sau reîncărcat, atunci programatorul nu se va putea conecta la placă atât de ușor (pentru că folosesc pini SWD ca GPIO-urile obișnuite) . În acest caz, există două opțiuni:

  1. rearanjați ambii săritori galbeni. În acest caz, placa va fi încărcată imediat în bootloader-ul intern
  2. puteți face așa-numita Conectare sub Resetare. Pentru el, secvența ar fi:
  • în utilitarul ST-Link, selectați Țintă -> Setări
  • în Modul Resetare, selectați Resetare hardware
  • apăsați și mențineți apăsat butonul Resetare de pe placă
  • faceți clic pe OK în utilitarul ST-Link
  • eliberați butonul de resetare de pe placă

PS. Dacă aveți o placă de dezvoltator SMT32F4Discovery, aceasta are deja un programator în ea și poate fi folosită și pentru a flash-o altă placă. În acest caz, trebuie să utilizați conectorul SWD pe STM32F4Discovery și să eliminați ambii jumperi CN3. Conectorul SWD are următorul pinout: