Stăpânirea rapidă a microcontrolerelor STM32. Începem să studiem Cortex-M folosind exemplul STM32 Cum funcționează interfața programatorului în stm32

De fapt, poți spune: „De ce am nevoie de el când există Discovery”. Într-un fel, da... Dar. Prima piatră din grădină. Am asamblat un circuit pe Discovery1 pentru a funcționa cu 1 MB de RAM paralelă. 40 de fire. Am depanat, depanat și bam, trebuie să încărc un alt controler. Yo-yo-yo al meu. Dezasamblați totul și reasamblați după fulger. Din fericire, există și Discovery4. Dar aceeași problemă. A doua piatră. Placă goală Discovery. Cumva, în timp ce sculptam o altă capodoperă cu 60 de fire, am dat peste ceva undeva și bum. Am întrerupt-o complet pe Discover. Am început să-mi dau seama. Pe scurt, cel scurt a ajuns la puterea de intrare de pe USB. Mulțumesc lui Dumnezeu, sau mai degrabă inginerului ST, pentru instalarea diodei. A preluat totul și portul nu a ars. Totul ar fi bine, dar inscripția 60 de pe diodă nu mi-a spus nimic. Am intrat pe site-ul ST, am găsit un număr de telefon de asistență și am sunat. Ale spun, trebuie să numesc un dieod. Și ca răspuns, nu-ți face griji, dă-mi e-mailul tău. Dau adresa si bam imi trimit documentatie pentru Discovery. Scheme, panouri, descriere. Ei bine, doar un basm. Am găsit imediat o diodă, am lipit-o și iată, totul a funcționat. După această întâmplare, pentru a nu repeta ceea ce făcusem, am decis să cumpăr un programator de la ST. Cred că toată lumea l-a văzut, un astfel de ou alb cu o emblemă. Dar nu l-am cumpărat niciodată. Pret, ce pret. La acest preț puteți cumpăra 3 Discovery și aveți trei programatori deodată. După ce m-am gândit puțin, mi-am adus aminte de diagrama care mi-a fost trimisă. Este același acolo... Am deschis fișierul și l-am verificat. Hmm, dar în prima eșarfă există ST-LINK și o mustață, dar mă întreb ce este în Discovery4. Am luat tabla și am văzut inscripția de pe ea. www.st.com/stm32f4-discovery. Așa că... am urmat linkul, o grămadă de fișiere și iată, o arhivă cu documentație și o diagramă. Cu speranță, am decis să merg pe pagina programatorului meu nativ. Da. Acum... Deci ți-au dat diagrama. În general, am decis să mă mulțumesc cu schema de la Discovery4.
Iat-o.

Am studiat acest manuscris și mi-am dat seama că ceva lipsește aici. Am intrat online și am văzut că în toate spațiile deschise sunt doar două scheme. Unul este foarte confuz, celălalt este prea simplu (în prezent SWD). Nu cred că ar trebui să le trecem. Am stat, m-am gândit, am desenat și am creat un asemenea miracol.

Nu acordați atenție cablajului. Nu am lipit jumperul, dar l-am descoperit după ce am lipit conectorul. Deoarece jumperul era sub conector și nu am putut ajunge la el, am lipit firele. Dacă lipiți jumperul, atunci firul nu este necesar. După asamblare, trebuie să fie fulgerat. Ha. Aici intervine ștecherul. De unde pot obține firmware-ul pentru MK. După ce am navigat pe internet, am găsit un fel de firmware strâmb care nu funcționează, dar are un lucru important. Cu acest firmware, programatorul se conectează la driverul ST nativ și este trimis pentru actualizare cu firmware de la ST. Adică, după ce firmware-ul este actualizat, asta este. Și așa până la obiect. Dacă nu ați adunat încă tabla, atunci nu are rost să citiți mai departe. Pentru cei care au lipit, uită-te la statuia ta. Dacă te uiți la LED-uri, poți vedea doi pini lângă cel roșu. Înainte de a aplica puterea, trebuie să puneți un jumper pe ea.

În partea dreaptă a conectorului principal există încă trei pini, aceștia sunt Rx, Tx și GND. Trebuie să conectați un port COM la ele. Acesta, apropo, este un alt plus; acest programator nu are problema cu puiul și ouă. Pentru a-și programa MK, aveți nevoie doar de un port COM. Pe care îl folosești depinde de tine. Am folosit unul fizic cu un adaptor la TTL. Alimentarea trebuie să fie furnizată la 3,3 V la 1 pin al conectorului principal. Dacă plasați programatorul cu LED-urile în sus, atunci pe conectorul principal acest pin va fi în colțul din stânga jos. Personal, nu m-am deranjat și l-am alimentat de la USB. Am un hub USB cu capacitatea de a conecta o alimentare externă, așa că l-am alimentat prin el. Adică, alimentarea a sosit de la USB, dar pinii de date nu sunt activi.

După conectarea la alimentare, dacă totul este lipit normal și fără erori, MK-ul ar trebui să fie gata pentru a clipi. În continuare lansăm programul.Apropo, iată o arhivă cu tot ce ai nevoie. Despachetați la rădăcina discului.

Faceți clic pe Următorul. Vedem cum decurge comunicarea cu MK.

Când totul se calmează, faceți clic din nou pe Următorul.

În această fereastră trebuie să specificați fișierul de descărcat. Selectați fișierul STLinkV2.J16.S4 din arhivă și faceți clic pe Următorul. După încărcare, fereastra va arăta astfel.

Acum scoateți jumperul și deconectați portul COM. Următorul pas este instalarea driverului st-link_v2_usbdriver. La momentul scrierii acestui articol, șoferul este cel mai recent. Dacă a trecut mult timp, puteți descărca un driver mai recent de pe site-ul web ST. După instalarea driverului, conectați programatorul la USB. Dacă totul până în acest moment a fost făcut corect, Windows va vedea dispozitivul și va instala un driver pentru acesta.

Dacă totul a fost instalat cu succes, atunci rulați programul ST-LinkUpgrade cu un fluture. Va apărea o fereastră cu o mătușă care are aspectul „Nu vă spun unde caut”. Mă întreb cine a găsit asta. La urma urmei, aceasta este fața companiei. Ei bine, nu asta e ideea.

Faceți clic pe Conectare dispozitiv. Dacă programul vede programatorul și acest lucru ar trebui să se întâmple, atunci butonul este activat.

Faceți clic pe butonul Da >>>> și așteptați până când apare o notificare despre o actualizare reușită.

Asta e tot. Programatorul lucrează. Tot ce rămâne este să tăiați găurile din corp și să imprimați eticheta. Iată ce am primit.

STM32 are o interfață foarte convenabilă pentru depanare și intermitent MK - Serial Wire Debug, prescurtat S.W.D.. Comoditatea sa constă în faptul că pentru depanare trebuie să conectați doar două ieșiri de informațiiși doi pini de alimentare. Schema de conectare este următoarea.

După ce pinii sunt conectați, trebuie să activați depanarea S.W.D.în mediul de programare, în KEIL se face asa.


De asemenea S.W.D. exista o concluzie S.W.O., nu este necesar să-l conectați, dar dacă îl conectați (trăgându-l la putere prin 10K), puteți afișa mesaje în timp real. Adică, în timpul execuției codului, MK ne poate trimite informații de depanare, de exemplu, ce secțiune a codului este în curs de executare, se dovedește ceva de genul usart cu un terminal.
Permiteți trimiterea informațiilor de depanare la ieșire S.W.O. Puteți utiliza fila de urmărire: permițând urmărirea, indicând frecvența la care funcționează MK și portul.


Mai jos este un exemplu care vă permite să afișați mesaje folosind S.W.O., într-o fereastră specială, fereastra în sine poate fi deschisă astfel: vizualizare->Serial windows->debug (printf) vizualizator.
#include „stm32f10x.h” #include #define ITM_Port8(n) (*((caracter nesemnat volatil *)(0xE0000000+4*n))) #define ITM_Port16(n) (*((scurt volatil nesemnat*)(0xE0000000+4*n))) #definire ITM_Port32(n) (*((volatil unsigned long *)(0xE0000000+4*n))) #define DEMCR (*((volatil unsigned long *)(0xE000EDFC))) #define TRCENA 0x01000000 struct _/_FILE (int handle; * Adăugați tot ce aveți nevoie aici */ ); FIȘIER __stdout; FIȘIER __stdin; int fputc(int ch, FILE *f) ( if (DEMCR & TRCENA) ( while (ITM_Port32(0) == 0); ITM_Port8(0) = ch; ) return(ch); ) int main(void) ( while (1) ( printf("Bună ziua de la stm32 printf!\r\n"); ) )
Așa arată, puteți mări imaginea făcând clic pe ea.

Ei bine, și cel mai important, de ce a fost intenționat acest articol, folosesc chineza ca depanator jlink, pinout-ul conectorului său este standard și poate fi găsit cu ușurință pe Internet, dar acest lucru nu mă împiedică să uit constant ce pini să conectez unde, așa că voi lăsa aici o fotografie cu ce pini sunt pe conector jlik destinate pentru S.W.D..

În ultimii ani, microcontrolerele pe 32 de biți (MCU) bazate pe procesoare ARM au cucerit rapid lumea electronicii. Această descoperire se datorează performanței ridicate, arhitecturii avansate, consumului redus de energie, costurilor reduse și instrumentelor avansate de programare.

POVESTE SCURTA
Numele ARM este un acronim pentru Advanced RISC Machines, unde RISC (Reduced Instruction Set Computer) reprezintă arhitectura redusă a procesorului setului de instrucțiuni. Numărul copleșitor de microcontrolere populare, precum familiile PIC și AVR, au și o arhitectură RISC, care a crescut performanța prin simplificarea decodării instrucțiunilor și accelerarea execuției acestora. Apariția microcontrolerelor ARM de 32 de biți avansate și productive ne permite să trecem la rezolvarea unor probleme mai complexe cărora MCU-urile pe 8 și 16 biți nu le mai pot face față. Arhitectura microprocesorului ARM cu un nucleu de 32 de biți și un set de instrucțiuni RISC a fost dezvoltată de compania britanică ARM Ltd, care dezvoltă exclusiv nuclee, compilatoare și instrumente de depanare. Compania nu produce MK-uri, ci vinde licențe pentru producția acestora. MK ARM este unul dintre segmentele cu cea mai rapidă creștere de pe piața MK. Aceste dispozitive folosesc tehnologii de economisire a energiei, astfel încât sunt utilizate pe scară largă în sistemele încorporate și domină piața dispozitivelor mobile pentru care este important un consum redus de energie. În plus, microcontrolerele ARM sunt utilizate în mod activ în comunicații, dispozitive portabile și încorporate unde este necesară o performanță ridicată. O caracteristică a arhitecturii ARM este nucleul de calcul al procesorului, care nu este echipat cu niciun element suplimentar. Fiecare dezvoltator de procesor trebuie să echipeze în mod independent acest nucleu cu blocurile necesare pentru sarcinile sale specifice. Această abordare a funcționat bine pentru marii producători de cipuri, deși inițial s-a concentrat pe soluții clasice de procesoare. Procesoarele ARM au trecut deja prin mai multe etape de dezvoltare și sunt bine cunoscute pentru familiile ARM7, ARM9, ARM11 și Cortex. Acesta din urmă este împărțit în subfamilii de procesoare clasice CortexA, procesoare în timp real CortexR și nuclee de microprocesoare CortexM. Miezurile CortexM au devenit baza pentru dezvoltarea unei clase mari de MCU-uri pe 32 de biți. Ele diferă de alte variante ale arhitecturii Cortex în primul rând prin utilizarea setului de instrucțiuni Thumb2 pe 16 biți. Acest set a combinat performanța și compactitatea instrucțiunilor „clasice” ARM și Thumb și a fost dezvoltat special pentru lucrul cu limbajele C și C++, ceea ce îmbunătățește semnificativ calitatea codului. Marele avantaj al microcontrolerelor construite pe nucleul CortexM este compatibilitatea lor cu software-ul, care teoretic permite utilizarea unui cod de program de limbaj de nivel înalt în modele de la diferiți producători. Pe lângă indicarea zonei de aplicare a nucleului, dezvoltatorii MK indică performanța nucleului CortexM pe o scară de zece puncte. Astăzi, cele mai populare opțiuni sunt CortexM3 și CortexM4. MCU-urile cu arhitectură ARM sunt produse de companii precum Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Milander , HiSilicon și altele.
Datorită arhitecturii optimizate, costul MCU-urilor bazate pe nucleul CortexM este în unele cazuri chiar mai mic decât cel al multor dispozitive pe 8 biți. Modelele „mai tinere” pot fi achiziționate în prezent pentru 30 de ruble. pentru corp, care creează concurență pentru generațiile anterioare de MK. MICROCONTROLLER STM32 Să luăm în considerare cel mai accesibil și mai răspândit MCU din familia STM32F100 de la STMicroelectronics, care este unul dintre cei mai importanți producători de MCU din lume. Compania a anunțat recent începerea producției unui MK pe 32 de biți care profită de industria industrială
Miezuri STM32 în aplicații cu costuri reduse. MCU-urile din familia STM32F100 Value Line sunt proiectate pentru dispozitive în care performanța MCU-urilor pe 16 biți nu este suficientă, iar funcționalitatea bogată a dispozitivelor „obișnuite” pe 32 de biți este redundantă. Linia de MCU STM32F100 se bazează pe un nucleu modern ARM CortexM3 cu periferice optimizate pentru utilizare în aplicații tipice în care au fost utilizate MCU-uri pe 16 biți. Performanța MCU STM32F100 la 24 MHz este superioară majorității MCU-urilor pe 16 biți. Această linie include dispozitive cu diferiți parametri:
● de la 16 la 128 kbytes de memorie flash de program;
● de la 4 la 8 kbytes de RAM;
● până la 80 de porturi de intrare/ieșire GPIO;
● până la nouă temporizatoare pe 16 biți cu funcții avansate;
● două cronometre watchdog;
● ADC de mare viteză pe 12 biți cu 16 canale;
● două DAC-uri pe 12 biți cu generatoare de semnal încorporate;
● până la trei interfețe UART care acceptă modurile IrDA, LIN și ISO7816;
● până la două interfețe SPI;
● până la două interfețe I2C care acceptă modurile SMBus și PMBus;
● Acces direct la memorie pe 7 canale (DMA);
● Interfata CEC (Consumer Electronics Control) inclusa in standardul HDMI;
● ceas în timp real (RTC);
● Controler de întrerupere imbricat NVIC.

Diagrama funcțională a STM32F100 este prezentată în Figura 1.

Orez. 1. Arhitectura liniei MK STM32F100

O comoditate suplimentară este compatibilitatea cu pini a dispozitivelor, care permite, dacă este necesar, utilizarea oricărui MK al familiei cu funcționalitate și memorie mai mari fără a relua placa de circuit imprimat. Linia de controlere STM32F100 este produsă în trei tipuri de pachete LQFP48, LQFP64 și LQFP100, având 48, 64 și, respectiv, 100 de pini. Atribuirea pinilor este prezentată în figurile 2, 3 și 4. Astfel de cazuri pot fi instalate pe plăci de circuite imprimate fără utilizarea de echipamente speciale, care este un factor semnificativ în producția la scară mică.


Orez. 2. MCU STM32 în pachet LQFP48 Fig. 3. MCU STM32 în pachet LQFP64


Orez. 4. MCU STM32 în pachet LQFP100

STM32F100 este un dispozitiv accesibil și optimizat bazat pe nucleul CortexM3, susținut de un mediu de dezvoltare avansat pentru familia de microcontrolere STM32, care conține
Biblioteci gratuite pentru toate perifericele, inclusiv controlul motorului și tastaturile tactile.

SCHEMA DE CONEXIUNE STM32F100C4
Să luăm în considerare utilizarea practică a MK folosind exemplul celui mai simplu dispozitiv STM32F100C4, care, totuși, conține toate blocurile principale ale liniei STM32F100. Schema circuitului electric a STM32F100C4 este prezentată în Figura 5.


Orez. 5. Schema de conectare pentru MK STM32F100C4

Condensatorul C1 asigură că MK este resetat la pornirea alimentării, iar condensatoarele C2-C6 filtrează tensiunea de alimentare. Rezistoarele R1 și R2 limitează curentul de semnal al pinii MK. Oscilatorul intern este folosit ca sursă de ceas, deci nu este nevoie să folosiți un cristal extern.


Intrările BOOT0 și BOOT1 vă permit să selectați metoda de încărcare a MK la pornirea alimentării în conformitate cu tabelul. Intrarea BOOT0 este conectată la magistrala potențial zero prin rezistența R2, care protejează pinul BOOT0 de un scurtcircuit atunci când este utilizat ca port de ieșire al PB2. Folosind conectorul J1 și un jumper, puteți modifica potențialul la intrarea BOOT0, determinând astfel modul în care este încărcat MK - din memoria flash sau din bootloader-ul încorporat. Dacă trebuie să încărcați MK din RAM, un conector similar cu un jumper poate fi conectat la intrarea BOOT1.
Programarea MK se realizează prin portul serial UART1 sau prin programatori speciali - depanatoarele JTAG sau STLink. Acesta din urmă face parte din popularul dispozitiv de depanare STM32VLDISCOVERY, prezentat în Figura 6. Pe placa STM32VLDIS COVERY, conectorul cu 4 pini al programatorului - STLink debugger - este desemnat SWD. Autorul articolului sugerează programarea MK prin portul serial UART1, deoarece este mult mai simplu, nu necesită echipamente speciale și nu este inferioară ca viteză față de JTAG sau ST Link. Orice computer personal (PC) care are un port serial COM sau un port USB cu un convertor USBRS232 poate fi folosit ca dispozitiv de control capabil să genereze comenzi și să afișeze rezultatele programului MK, precum și ca programator.

Pentru a interfața portul COM al unui PC cu un MK, este potrivit orice convertor de semnale RS232 în niveluri de semnal logic de la 0 la 3,3 V, de exemplu, microcircuitul ADM3232. Linia de transmisie TXD a portului serial al computerului, după convertorul de nivel, trebuie conectată la intrarea PA10 a microcontrolerului, iar linia receptorului RXD, printr-un convertor similar, la ieșirea PA9.

Dacă trebuie să utilizați un ceas MK nevolatil, ar trebui să conectați o baterie CR2032 cu o tensiune de 3 V și un rezonator cu quartz cu o frecvență de 32768 Hz. În acest scop, MK este echipat cu pini Vbat/GND și OSC32_IN/OSC32_OUT. Pinul Vbat trebuie mai întâi deconectat de la magistrala de alimentare de 3,3 V.

Terminalele libere rămase ale MK pot fi folosite după cum este necesar. Pentru a face acest lucru, ar trebui să fie conectați la conectorii care se află în jurul perimetrului plăcii de circuit imprimat pentru MK, prin analogie cu dispozitivele populare Arduino și placa de depanare STM32VLDISCOVERY.


Orez. 6. Depanați dispozitivul STM32VLDISCOVERY


Schema circuitului electric STM32VLDISCOVERY.

Astfel, în funcție de scopul și metoda de utilizare a MK, puteți conecta elementele necesare la acesta pentru a utiliza alte blocuri funcționale și porturi, de exemplu, ADC, DAC, SPI, I2C etc. În viitor, aceste dispozitive vor fi luate în considerare mai detaliat.

PROGRAMARE
Astăzi, multe companii oferă instrumente pentru crearea și depanarea programelor pentru microcontrolere STM32. Acestea includ Keil de la ARM Ltd, IAR Embedded Workbench pentru ARM, Atol lic TrueStudio, CooCox IDE, GCC și Eclipse IDE. Dezvoltatorul poate alege software-ul în funcție de preferințele sale. Mai jos vom descrie setul de instrumente Keil uVision 4 de la compania Keil, care acceptă un număr mare de tipuri de microcontrolere, are un sistem dezvoltat de instrumente de depanare și poate fi folosit gratuit cu restricții privind dimensiunea codului generat de 32 kbytes ( care, de fapt, este maximul pentru microcontrolerele luate în considerare).

Începe ușor și rapid cu CooCox CoIDE.

Asadar, haideti sa începem. Accesați site-ul oficial CooCox și descărcați cea mai recentă versiune a CooCox CoIDE. Pentru a descărca trebuie să vă înregistrați, înregistrarea este simplă și gratuită. Apoi instalați fișierul descărcat și rulați-l.

CooCox CoIDE- un mediu de dezvoltare bazat pe Eclipse, care, pe lângă STM32, suportă o grămadă de alte familii de microcontrolere: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro etc. Cu fiecare nouă versiune de CoIDE, lista de microcontrolere este actualizată constant. După instalarea cu succes a CoIDE, rulați:

Va apărea fereastra de pornire a pasului 1, în care trebuie să selectați producătorul microcontrolerului nostru. Apăsați ST și mergeți la Pasul 2 (selectarea unui microcontroler), în care trebuie să selectați un anumit model. Avem STM32F100RBT6B, așa că faceți clic pe modelul corespunzător:

În partea dreaptă, fereastra Ajutor afișează scurte caracteristici ale fiecărui cip. După selectarea microcontrolerului de care avem nevoie, trecem la al treilea pas, Pasul 3 - la selectarea bibliotecilor necesare pentru lucru:

Să creăm un proiect simplu pentru a clipi un LED, așa cum este obișnuit pentru microcontrolere de învățare.

Pentru a face acest lucru, avem nevoie de biblioteca GPIO, când este activată, CoIDE vă va cere să creați un nou proiect. Faceți clic pe Da pe această propunere, indicați folderul în care va fi stocat proiectul nostru și numele acestuia. În același timp, CoIDE se va conecta la proiect și alte 3 necesare pentru ca biblioteca să funcționeze și, de asemenea, va crea toată structura de proiect necesară:

Un alt lucru bun despre CoIDE este că are capacitatea de a încărca exemple direct în mediul de dezvoltare. În fila Componente puteți vedea că există exemple pentru aproape fiecare bibliotecă, faceți clic pe GPIO (cu 4 exemple) și le vedeți:

Puteți adăuga propriile exemple acolo. După cum puteți vedea în captura de ecran de mai sus, exemplele conțin deja cod pentru a clipi LED-ul GPIO_Blink. Puteți face clic pe butonul de adăugare și va fi adăugat la proiect, dar ca fișier inclus, așa că o vom face diferit și pur și simplu vom copia întregul exemplu de cod în fișierul main.c. Singurul lucru este să înlocuiți linia void GPIO_Blink(void) cu int main(void). Așadar, apăsați F7 (sau selectați Project->Build din meniu) pentru a compila proiectul și... nu există așa noroc!

Mediul are nevoie de un compilator GCC, dar noi nu avem unul. Prin urmare, accesați pagina Instrumente GNU pentru procesoarele ARM Embedded, selectați tipul dvs. de sistem de operare din dreapta și descărcați cea mai recentă versiune a lanțului de instrumente. Apoi rulăm fișierul și instalăm gcc toolchain. În continuare, în setările CoIDE vom indica calea corectă către lanțul de instrumente:

Apăsați din nou F7 (Proiect->Build) și vedeți că compilarea a avut succes:

Tot ce rămâne este să flashi microcontrolerul. Pentru a face acest lucru, conectăm placa noastră la computer folosind USB. Apoi, în setările depanatorului, trebuie să instalați ST-Link; pentru a face acest lucru, selectați Proiect->Configurare în meniu și deschideți fila Debugger. Selectați ST-Link din lista derulantă și închideți fereastra:

Să încercăm să flash MK. În meniu, selectați Flash->Program Download (sau faceți clic pe pictograma corespunzătoare din bara de instrumente) și vedeți că MK-ul a fost flashat cu succes:

Vedem un LED care clipește pe placă, cred că nu are sens să furnizăm un videoclip sau o fotografie, pentru că... toată lumea a văzut-o.

De asemenea, în CoIDE funcționează diverse moduri de depanare; pentru a face acest lucru, apăsați CTRL+F5 (sau în meniul Debug->Debug):

Asta e tot. După cum puteți vedea, configurarea și lucrul cu CoIDE este foarte simplu. Sper că acest articol vă va încuraja să studiați microcontrolere STM32 foarte promițătoare și ieftine.

Publicat 08.09.2016

Microcontrolere STM32 devin din ce în ce mai populare datorită puterii lor, perifericelor destul de diverse și flexibilității. Vom începe să studiem folosind o placă de testare bugetară, al cărei cost nu depășește 2 USD (de la chinezi). Vom avea nevoie și noi ST-Link programator, al cărui cost este de aproximativ 2,5 USD (de la chinezi). Astfel de sume de cheltuieli sunt accesibile atât pentru elevi, cât și pentru școlari, așa că îmi propun să începem cu această variantă bugetară.


Acest microcontroler nu este cel mai puternic dintre STM32, dar nici cel mai slab. Există diverse plăci cu STM32, inclusiv Descoperire care a costat aproximativ 20 de dolari. Pe astfel de plăci, aproape totul este la fel ca pe placa noastră, plus un programator. În cazul nostru, vom folosi programatorul separat.

Microcontroler STM32F103C8. Caracteristici

  • Miez ARM Cortex-M3 pe 32 de biți
  • Frecventa maxima 72MHz
  • Memorie flash de 64 KB pentru programe
  • memorie SRAM de 20 Kb
  • Alimentare 2,0 … 3,3 V
  • 2 x ADC pe 12 biți (0 ... 3,6 V)
  • Controler DMA
  • 37 intrări/ieșiri tolerante 5V
  • 4 temporizatoare pe 16 biți
  • 2 cronometre watchdog
  • I2C – 2 autobuze
  • USART – 3 autobuze
  • SPI – 2 autobuze
  • Interfață USB 2.0 de viteză maximă
  • RTC – ceas încorporat

Disponibil pe placa STM32F103C8

  • Porturi de ieșire A0-A12, B0-B1, B3-B15, C13-C15
  • Micro USB prin care poți alimenta placa. Placa are un stabilizator de tensiune de 3,3 V. Alimentarea de 3,3 V sau 5 V poate fi furnizată la pinii corespunzători de pe placă.
  • Buton Resetați
  • Doi săritori BOOT0Și BOOT1. Îl vom folosi în timpul flashing via UART.
  • Două cuarț 8 MHz și 32768 Hz. Microcontrolerul are un multiplicator de frecventa, asa ca cu un quartz de 8 MHz putem ajunge la frecventa maxima a controlerului de 72 MHz.
  • Două LED-uri. PWR– semnalează că este furnizată energie. PC13– conectat la ieșire C13.
  • Conector pentru programator ST-Link.

Deci, să începem prin a încerca să flashăm microcontrolerul. Acest lucru se poate face prin USART sau folosind un programator ST-Link.

Puteți descărca fișierul de testare pentru firmware. Programul clipește LED-ul de pe placă.

Firmware-ul STM32 folosind adaptorul USB-Uart pentru Windows

În memoria sistemului STM32 Există Bootloader. Bootloader-ul este înregistrat în etapa de producție și orice microcontroler STM32 poate fi programat prin interfață USART folosind un adaptor USART-USB. Astfel de adaptoare sunt cel mai adesea realizate pe baza microcircuitelor populare FT232RL. Mai întâi de toate, conectați adaptorul la computer și instalați driverele (dacă este necesar). Puteți descărca drivere de pe site-ul producătorului FT232RL– ftdichip.com. Trebuie să descărcați drivere VCP(port com virtual). După instalarea driverelor, pe computer ar trebui să apară un port serial virtual.


Conectare RXȘi TX ieșiri către pinii corespunzători USART1 microcontroler. RX conectați adaptorul la TX microcontroler (A9). TX conectați adaptorul la RX microcontroler (A10). Deoarece USART-USB are ieșiri de putere de 3,3 V, vom furniza energie plăcii de la acesta.

Pentru a pune microcontrolerul în modul de programare, trebuie să setați pinii BOOT0Și BOOT1 la starea dorită și reporniți-l cu butonul Resetați sau opriți și porniți alimentarea microcontrolerului. Pentru asta avem săritori. Combinații diferite forțează microcontrolerul în moduri diferite. Suntem interesați doar de un singur mod. Pentru a face acest lucru, microcontrolerul are BOOT0 ar trebui să existe unul logic și rezultatul BOOT1– zero logic. Pe placă, aceasta este următoarea poziție a jumperului:

După apăsarea butonului Resetați sau deconectarea și conectarea alimentării, microcontrolerul trebuie să intre în modul de programare.

Software-ul firmware

Dacă folosim un adaptor USB-UART, numele portului va fi cam așa /dev/ttyUSB0

Obțineți informații despre cip

Rezultat:

Citim de pe cip în fișierul dump.bin

sudo stm32flash -r dump.bin /dev/ttyUSB0

Scrieți pe cip

sudo stm32flash -w dump.bin -v -g 0x0 /dev/ttyUSB0

Rezultat:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Folosind Parser: Raw BINARY Interfață serial_posix: 57600 8E1 Versiune: 0x22 Opțiunea 1: 0x00 Opțiunea 2: 0x00 ID dispozitiv: 0x0410 (Medium-dens: 120Kid) bootloader) - Flash: 128KiB (dimensiunea sectorului: 4x1024) - Opțiune RAM: 16b - System RAM: 2KiB Scriere în memorie Stergerea memoriei Adresă scrisă și verificată 0x08012900 (100,00%) Gata. Începe execuția la adresa 0x08000000... gata.

Firmware-ul STM32 utilizând programatorul ST-Link pentru Windows

Când utilizați un programator ST-Link concluzii BOOT0Și BOOT1 nu sunt utilizate și trebuie să fie în poziția standard pentru funcționarea normală a controlerului.

(Carte în rusă)

marcaj STM32

Familia de dispozitiveTip produsSubfamilie de dispozitiveNumăr de pinDimensiunea memoriei flashPachetInterval de temperatură
STM32 =
Microcontroler pe 32 de biți bazat pe ARM
F = de uz general
L = Putere ultra-scăzută
TS = Ecran tactil
W = sistem wireless pe cip
60 = rezistiv multitouch
103 = linia de performanță
F = 20 pini
G = 28 de pini
K = 32 pini
T = 36 pini
H = 40 pini
C = 48/49 pini
R = 64 pini
O=90 pini
V = 100 pini
Z = 144 pini
I = 176 pini
B = 208 pini
N = 216 pini
4 = 16 Kbytes de memorie Flash
6 = 32 Kbytes de memorie Flash
8 = 64 Kbytes de memorie Flash
B = 128 Kbytes de memorie Flash
Z = 192 Kbytes de memorie Flash
C = 256 Kbytes de memorie Flash
D = 384 Kbytes de memorie Flash
E = 512 Kbytes de memorie Flash
F = 768 Kbytes de memorie Flash
G = 1024 Kbytes de memorie Flash
I = 2048 Kbytes de memorie Flash
H = UFBGA
N=TFBGA
P = TSSOP
T = LQFP
U = V/UFQFPN
Y = WLCSP
6 = Interval de temperatură industrial, –40…+85 °C.
7 = Interval de temperatură industrial, -40…+ 105 °C.
STM32F103 C8 T6

Cum se elimină protecția la scriere/citire?

Dacă ați primit o placă cu STM32F103, dar programatorul nu o vede, asta înseamnă că chinezii au protejat memoria Flash a microcontrolerului. Întrebarea „de ce?” hai sa il ignoram. Pentru a elimina blocarea, vom conecta un adaptor UART și vom programa prin el. Setăm jumperii pentru programare și pornim:

Voi face acest lucru de pe Ubuntu folosind utilitarul stm32flash.

1. Verificați dacă microcontrolerul este vizibil:

Sudo stm32flash /dev/ttyUSB0

Ar trebui să obțineți ceva de genul acesta:

Stm32flash 0.4 http://stm32flash.googlecode.com/ Interfață serial_posix: 57600 8E1 Versiune: 0x22 Opțiunea 1: 0x00 Opțiunea 2: 0x00 ID dispozitiv: 0x0410 (densitate medie) - Rezervat de către booter 20KiB: (RAM: 20KiB) 128 KiB (dimensiunea sectorului: 4x1024) - RAM opțiune: 16b - RAM de sistem: 2 KiB

2. Eliminați protecția la citire și apoi protecția la scriere:

Sudo stm32flash -k /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interfață serial_posix: 57600 8E1 Versiune: 0x22 Opțiunea 1: 0x00 Opțiunea 2: 0x00 ID dispozitiv: 0x0x00000000000 512b rezervat de bootloader) - Flash: 128KiB (dimensiunea sectorului: 4x1024) - Opțiune RAM: 16b - RAM de sistem: 2KiB Flash de dezactivare a citirii Terminat. sudo stm32flash -u /dev/ttyUSB0 stm32flash 0.4 http://stm32flash.googlecode.com/ Interfață serial_posix: 57600 8E1 Versiune: 0x22 Opțiunea 1: 0x00 Opțiunea 2: 0x00 ID dispozitiv: 0x000000000000 512b rezervat de bootloader) - Flash: 128KiB (dimensiunea sectorului: 4x1024) - Opțiune RAM: 16b - RAM de sistem: 2KiB Flash de deprotecție la scriere Terminat.

Acum puteți lucra normal cu microcontrolerul.

Pentru a crea un proiect minimal vom avea nevoie de: un controler stm32 (am un stm32f103), niște fire, un LED (pentru testare).
Nici macar nu vom atarna cuartul, pentru a nu complica procesul.
Este foarte convenabil să utilizați această placă adaptor cu LQFP:

Costă în jur de 1 USD. Dar nu este nevoie să otrăviți cărări mici.
Asamblam următorul circuit (pentru stm32f103 48 picioare):

Conectorul SWD contine 6 pini, deoarece pe STM32F4 discovery (pe care o folosesc) este 6, deși al 6-lea nu este folosit.
Atârnăm toate pământurile (GND) pe pământ, iar sursa de alimentare (VDD) pe sursa de alimentare (am răsucit totul împreună). Nu vom închide filtrele; oricum, fără cuarț nu putem vorbi despre nici un fel de precizie.
Pinout-ul stm32f103 arată astfel:

Alimentarea plăcii trebuie să fie separată (3,3V). Alimentarea de la SWD (1V) nu va fi suficientă.

Practic asta este. Introducem conectorul în placă, după ce au scos mai întâi jumperii de pe placă.
Rulăm st-util și vedem:

$ st-util 2012-09-10T15:14:05 INFO src/stlink-usb.c: -- exit_dfu_mode 2012-09-10T15:14:05 INFO src/stlink-common.c: Se încarcă parametrii dispozitivului.... 2012-09-10T15:14:05 INFO src/stlink-common.c: Dispozitivul conectat este: F1 Dispozitiv cu densitate medie, id 0x20036410 2012-09-10T15:14:05 INFO src/stlink-common.c: SRAM size : 0x5000 de octeți (20 KiB), Flash: 0x10000 de octeți (64 KiB) în pagini de 1024 de octeți ID-ul cipului este 00000410, ID-ul de bază este 1ba01477. KARL - ar trebui să citească înapoi ca 0x03, nu 60 02 00 00 init watchpoints Ascultare la *:4242...

Poți coase.

Iată un proiect pentru tine - o diodă intermitent pentru eclipsă. Descarca .
Dacă folosești IAR sau altceva, gesturile cu st-util nu sunt necesare.