Programarea stm32 în C. BRAŢ

Acest articol, care este un alt „început rapid” în stăpânirea controlerelor ARM, vă va ajuta probabil să faceți primii pași în stăpânirea controlerelor ARM pe 32 de biți bazate pe nucleul Cortex-M3 - seria STM32F1xxx. Poate că acest articol (care apare pe această temă ca ciupercile după ploaie) va fi util cuiva.

Introducere

De ce ARM?
1. Există o mulțime din care să alegeți ( de diferiți producători Astăzi sunt produse peste 240 de controlere ARM)
2. Preț scăzut(de exemplu, pentru 1 USD puteți obține 37xI/O, 16K Flash, 4K RAM, 2xUART, 10x12bitADC, 6x16bitPWM).

Să începem munca cu controlerele de la ST Microelectronics. Controlerele bazate pe nucleul ARM Cortex-M3 se caracterizează printr-o gamă largă de periferice, un nivel ridicat de caracteristici de performanță și un preț scăzut
P.S. La început, se pare că ARM-urile sunt un fel de creaturi teribile (în lipire, cablare, programare), dar asta este doar la prima vedere :) și veți vedea acest lucru singur.

Deci, vom studia ARM-urile folosind exemplul controlerelor STM32F1. În același timp, această serie are mai multe rânduri:

  • Linia valorii STM32F100 - CPU 24 MHz, control motor, CEC.
  • Linie de acces STM32F101 - CPU 36 MHz, până la 1 MB Flash
  • Linie de acces USB STM32F102 - CPU 48 MHz cu USB FS
  • Linie de performanță STM32F103 - 72 MHz, până la 1 MB Flash, control motor, USB, CAN
  • Linie de conectivitate STM32F105/107 - CPU 72 MHz, Ethernet MAC, CAN, USB 2.0 OTG

Există, de asemenea, următoarea clasificare:

Controlerele STM32 pot fi forțate să pornească din 3 zone de memorie (în funcție de starea pinilor BOOT0 și BOOT1 când pornește controlerul sau după ce este resetat). Puteți scrie un program în memoria controlerului în următoarele moduri:

1 cale:
Folosind bootloader-ul (este deja scris în memoria sistemului) și USART1(USART2 remapat): Utilizează semnal intern de ceas de 8 MHz. Pentru a lansa bootloader-ul încorporat cablat în controler de către producător, trebuie doar să aruncați un semnal de la convertorul RS232-3.3V (de exemplu, bazat pe FT232RL) pe labele controlerului TX1, RX1 și înainte de acel set. BOOT0 = 1 și BOOT1 = 0, apăsați RESET și putem coase programul în controler. Și este cusută înăuntru Program flash Loader Demonstartor de la STM (pentru Windows).

PS. Dacă rulați LINUX și nu aveți o placă de depanare de tip discovery, puteți încărca firmware-ul în controler prin intermediul rs-232 preferat al tuturor (de fapt, prin convertorul rs-232-3.3V). Pentru a face acest lucru, trebuie să utilizați un script python (Ivan A-R) (pentru LINUX sau MACOSX).
Pentru a începe, trebuie să aveți instalat Python 2.6 și o bibliotecă cu care să lucrați port serial- Biblioteca PySerial.
Acum, pentru a rula scriptul stmloader.py (din terminal, bineînțeles), trebuie să îl modificați puțin pentru a se potrivi computerului dvs.: deschideți-l într-un editor de text.
Recrutare la Linie de comanda
~$ dmesg | grep tty
sa vezi totul porturi seriale PC.
si dupa ce ai tastat...
~$ setserial -g /dev/ttyS
aflăm calea către al 232-lea port al nostru. Dacă sistemul se plânge de setserial, instalați-l
~$ sudo apt-get install setserial
aflăm calea către portul nostru fizic (de exemplu, al meu este /dev/ttyS0). Acum trebuie să scrieți această cale în fișierul script stm32loader.py în loc de „/dev/tty.usbserial-...”. Introduceți terminalul
~$ python stm32loader.py -h
...pentru a solicita ajutor și a încărca firmware-ul în controlerul nostru.

Metoda 2:
Prin USB OTG, folosind modul DFU, necesită un quartz extern la 8 MHz, 14,7456 MHz sau 25 MHz (nu toate controlerele cu USB OTG au acest bootloader; trebuie să vă uitați cu atenție la etichetarea controlerului dvs.)

3 moduri:
JTAG/SWD. Ei bine, pentru cei care au o placă demo de tip Discovery sau un programator JTAG/SWD de casă, puteți încărca codul și deja depanați microcontrolerul în acest fel. Pentru JTAG, microcontrolerul are 6 picioare (TRST, TDI, TMS, TCK, TDO, RST) + 2 pentru putere. SWD folosește 4 semnale (SWDIO, SWCLK SWO, RESET) și 2 pentru alimentare.

PS. În mediul EAGLE, am schițat mai multe circuite goale pentru controlere cu 48, 64 și 100 de picioare (dosarul Eagle), iar stm32loader conține scriptul stm32loader.py

Cel mai bine este să începeți să vă familiarizați cu orice lucru cu instrucțiuni. În unele cazuri, totul este clar și așadar, în altele - „hmm, nimic nu funcționează, se pare că mai trebuie să citiți instrucțiunile”. Microcontrolerele sunt dispozitive destul de complexe și cu siguranță nu poți face nimic util cu ele fără să citești documentația, deși...

După unele AVR, este posibil să aveți un șoc ușor la numărul de PDF-uri diferite pentru microcontrolere STM32. Unde să te uiți mai întâi? Cum să-l folosească? ce se mai intampla?? La prima vedere, nimic nu este clar. Prin urmare, am decis să fac o mică privire de ansamblu asupra lumii documentației pentru aceste minunate microcontrolere. Voi pune un accent deosebit pe STM32F103C8T6, deoarece intenționez să scriu mai multe lecții despre utilizarea acestei pietre.

Principalele documente pentru STM-uri sunt următoarele:

  1. Fișa cu date
  2. Manual de referință
  3. Manual de programare
  4. Foaia de Errata

Fișa cu date

Fișa de date conține informații despre prezența anumitor periferice într-un anumit MK, pinout, caracteristicile electrice și marcajele cipurilor pentru STM32F103x8 și STM32F103xB, adică pentru acestea, care sunt încercuite într-un dreptunghi roșu:

Pur și simplu, o fișă de date pentru 8 microcontrolere.

Bazele fișei de date

În primul rând, trebuie să acordați atenție secțiunii 7.Schema de informații de comandă, în care este indicat, apoi reprezintă fiecare caracter din marcaj. De exemplu, pentru STM32F103C8T6: pachet LQFP-48, flash de 64 Kb, interval de temperatură –40 până la 85 °C.

Principala diferență între microcontrolerele din coloane diferite este numărul de picioare și volumul blițului, totul este același. O mică excepție este prima coloană versiune Tx: Aceste microcontrolere au mai puține module SPI, I2C și USART. Numerotarea periferică începe de la unu: adică dacă în STM32F103 Cx avem 2 SPI-uri, apoi au numele SPI1 și SPI2, iar în STM32F103 Tx Avem doar SPI1. Deoarece avem o fișă de date pentru microcontrolerele STM32F103x8 și STM32F103xB, acest tabel este valabil numai pentru aceste modele. De exemplu STM32F103 C8 sau STM32F103 C.B. corespund acestui tabel și STM32F103 C6 nu, există o fișă tehnică separată pentru el.

În capitolul 2.2 Compatibilitate deplină în întreaga familie se spune că dispozitivele STM32F103xx sunt software, funcționale și compatibile pin-to-pin (pentru aceleași cazuri).

În manualul de referință există o împărțire în următoarele „tipuri” de microcontrolere: STM32F103x4 și STM32F103x6 sunt desemnate ca dispozitive de joasă densitate , STM32F103x8 și STM32F103xB ca dispozitive de densitate medie , STM32F103xC, STM32F103xD și STM32F103xE ca dispozitive de mare densitate . Dispozitivele cu densitate scăzută au mai puține memorie Flash și RAM, temporizatoare și periferice. Dispozitivele de înaltă densitate au mai multă memorie Flash și RAM și au, de asemenea, periferice suplimentare precum SDIO, FSMC, I2S și DAC, rămânând în același timp pe deplin compatibile cu alți membri ai familiei STM32F103xx. Adică, dacă la un anumit stadiu de dezvoltare a devenit clar că microcontrolerul selectat nu este suficient pentru a implementa toate capacitățile, atunci puteți alege în siguranță o piatră mai sofisticată fără a fi nevoie să rescrieți tot software-ul existent și dacă noua piatră este în în același caz, atunci nu este nevoie să reconectați placa de circuit imprimat.

Manual de referință

Sa trecem peste. Manualul de referință conține descriere detaliata toate perifericele, registrele, offset-urile și așa mai departe. Acesta este documentul principal care este utilizat la crearea firmware-ului pentru un microcontroler. Manualul de referință este compilat pentru un grup mare de microcontrolere, în cazul nostru pentru toate STM32F10xxx, și anume STM32F101xx, STM32F102xx, STM32F103xx și STM32F105xx/STM32F107xx. Dar STM32F100xx nu sunt incluse în acest RM, există unul pentru ei.

Principalul lucru în manualul de referință

După cum sa menționat mai sus, în manualul de referință există o împărțire în următoarele „tipuri” de microcontrolere: densitate scăzută, medie, densitate mare și conectivitate
linia. ÎN 2.3 Glosar a explicat cine este cine:

  • Dispozitive cu densitate redusă Acestea sunt microcontrolere STM32F101xx, STM32F102xx și STM32F103xx cu dimensiuni de memorie Flash între 16 și 32 Kbytes.
  • Dispozitive de densitate medie acestea sunt STM32F101xx, STM32F102xx și STM32F103xx, cu dimensiuni ale memoriei flash între 64 și 128 Kbytes.
  • Dispozitive de mare densitate acestea sunt STM32F101xx și STM32F103xx, cu dimensiuni ale memoriei flash între 256 și 512 Kbytes.
  • Dispozitive cu densitate XL acestea sunt STM32F101xx și STM32F103xx, cu dimensiuni ale memoriei flash între 768 Kbytes și 1 Mbyte.
  • Dispozitive de linie de conectivitate Acestea sunt microcontrolerele STM32F105xx și STM32F107xx.

STM32F103C8T6 nostru este un dispozitiv cu densitate medie. Acest lucru va fi util de știut atunci când studiați periferice, de exemplu, există secțiuni separate despre RCC pentru dispozitive cu densitate joasă, medie, mare și XL și dispozitive de linie de conectivitate.

Manual de programare

Manualul de programare nu este un document esențial la începutul cunoașterii STM-urilor, dar este foarte important atunci când studiem aceste microcontrolere în profunzime. Conține informații despre nucleul procesorului, setul de instrucțiuni și perifericele de bază. Mai mult, aceasta nu este aceeași periferie care este descrisă în manualul de referință. Include:

  • Cronometru de sistem - cronometru de sistem
  • Controler de întrerupere cu vector imbricat - controler de întrerupere prioritar
  • Bloc de control al sistemului
  • Unitate de protecție a memoriei

Odată ce începem să ne familiarizăm cu întreruperile din STM32, vom avea nevoie de o secțiune 4.3 Controler de întrerupere cu vector imbricat (NVIC). Ei bine, temporizatorul de sistem este un lucru foarte tare care va fi util în unele RTOS sau pentru crearea de temporizatoare software.

Foaia de Errata

Errata Sheet este o colecție de toate erorile hardware cunoscute și blocurile de microcontrolere și sfaturi despre cum să le ocoliți. Un document destul de distractiv 🙂 Înainte de a folosi orice periferice, vă sfătuiesc să aruncați o privire. Acest lucru poate ajuta la reducerea numărului de celule nervoase pierdute atunci când vă depanați firmware-ul miraculos, care pur și simplu nu vrea să funcționeze :)

Recent, un coleg m-a atras de ideea de a crea o casă inteligentă și chiar am reușit să comand zeci de senzori diferiți pentru mine. A apărut întrebarea despre alegere Microcontroler(denumite în continuare MK) sau panouri. După câteva căutări am găsit mai multe opțiuni. Printre ei au fost Arduino(inclusiv clonele lui, dintre care una mi-am comandat-o doar pentru a mă distra) și Platforma de lansare, dar toate acestea sunt redundante și greoaie (deși în ceea ce privește programarea este mult mai simplu, dar nu voi ridica subiectul holivarurilor, fiecare are gusturile lui). În cele din urmă, am decis să nu mă decid asupra unei plăci gata făcute, ci să iau doar MK-ul și să fac totul de la zero. Până la urmă am ales între Atmel ATtiny (2313), Atmel ATmega(am decis să refuz pentru că nu l-am putut găsi pentru bani adecvați), STM32(Cortex pe miez BRAŢ). Mă jucasem deja cu adolescentul, așa că am luat-o pentru mine STM32VL-Descoperire. Aceasta poate fi numită o introducere la o serie de articole despre STM32. Permiteți-mi să fac o rezervare imediat: nu voi fi autorul majorității acestor articole, pentru că... Doar o învăț eu, aici le public în primul rând pentru mine, astfel încât să fie mai ușor să caut dacă uit ceva. Și deci hai să mergem!

Informații generale

Microcontrolere familii STM32 conține până la șapte porturi I/O pe 16 biți cu nume de la PORTA la PORTG. ÎN model specific microcontroler Fără excepție, sunt disponibili toți pinii portului, al căror număr total depinde de tipul carcasei și este specificat în fișa de date pentru subfamilia corespunzătoare.

Pentru a activa portul x, trebuie mai întâi să îl conectați la magistrala APB2 setând bitul IOPxEN corespunzător în registrul de activare a ceasului periferic RCC_APB2ENR:

RCC->APB2ENR |= RCC_APB2ENR_IOPxEN; // Activează ceasul PORTx.

Managementul portului STM32 realizat folosind seturi de șapte registre de 32 de biți:

  • GPIOx_CRL, GPIOx_CRH– setați modurile de funcționare ale fiecăruia dintre biții de port ca intrare sau ieșire, determinați configurația etapelor de intrare și ieșire.
  • GPIOx_IDR– registru de date de intrare pentru citirea stării fizice a portului x pini.
  • GPIOx_ODR– registrul de ieșire scrie datele direct pe port.
  • GPIOx_BSRR– resetare atomică și registru de setare a biților de port.
  • GPIOx_BSR– registru de resetare a bitului de port.
  • GPIOx_LCKR– registru de blocare a configurației pin.

Moduri de operare a pinului GPIO

Modurile de funcționare ale pinii individuali sunt determinate de o combinație de biți MODEyȘi CNFy registre GPIOx_CRLȘi GPIOx_CRH(în continuare: x este numele portului, y este numărul de bit al portului).

GPIOx_CRL- registru de configurare pin 0...7 porturi X:

Structura registrului GPIOx_CRH structură similară GPIOx_CRLși este conceput pentru a controla modurile de operare ale pinilor superiori ai portului (biții 8...15).

Biții MODEy ai registrelor specificate determină direcția de ieșire și limita vitezei de comutare în modul de ieșire:

  • MODEy = 00: Mod de intrare (stare după resetare);
  • MODEy = 01: Mod de ieșire viteza maxima– 10 MHz;
  • MODEy = 10: Mod de iesire, viteza maxima – 2 MHz;
  • MODEy = 11: Mod de ieșire, viteza maximă – 50 MHz.

Biții CNF specifică configurația etajelor de ieșire ale pinilor corespunzători:

în modul de conectare:

  • CNFy = 00: Intrare analogică;
  • CNFy = 01: Intrare în stare a treia (stare după resetare);
  • CNFy = 10: Intrare cu rezistență pull-up (dacă PxODR=1) sau pull-down (dacă PxODR=0);
  • CNFy = 11: Rezervat.

în modul de ieșire:

  • CNFy = 00: Ieșire push-pull scop general;
  • CNFy = 01: Ieșire de scurgere deschisă de uz general;
  • CNFy = 10: Ieșire push-pull cu funcție alternativă;
  • CNFy = 11: Ieșire de scurgere deschisă cu funcție alternativă.

Pentru a crește imunitatea la zgomot, toate tampoanele de intrare conțin declanșatoare Schmidt. O parte din concluzii STM32, echipate cu diode de protecție conectate la magistrala comună și la magistrala de alimentare, sunt marcate în fișa de date ca FT (tolerant 5V) - compatibil cu o tensiune de 5 volți.

Protejarea biților de configurare GPIO

Pentru a proteja biții din registrele de configurare împotriva scrierii neautorizate în STM32 este furnizat un registru de blocare a setărilor GPIOx_LCKR
GPIOx_LCKR- registru de blocare a setărilor de ieșire portului:

Pentru a proteja setările unui pin de port individual, trebuie setat bitul LCKy corespunzător. Apoi efectuați înregistrarea secvențială în categorie LCKK valorile „1” - „0” - „1” și două operații de citire a registrului LCKR, care în caz de blocare reușită va da pentru bit LCKK valorile „0” și „1”. Protecția biților de setare va rămâne în vigoare până la următoarea repornire a microcontrolerului.

Fișier de definiție periferică microcontrolere STM32 stm32f10x.h definește grupuri separate de registre unite printr-un scop funcțional comun (inclusiv GPIO), ca structuri ale limbajului C, iar registrele în sine ca elemente ale acestei structuri. De exemplu:

GPIOC->BSRR– Setarea/resetarea registrului portului GPIOC BSRR.
Să folosim definițiile din fișierul stm32f10x.h pentru a ilustra modul de lucru cu registrele I/O ale microcontrolerului STM32F100RB instalat în trusa de pornire STM32VLDESCOPERIRE:

#include „stm32F10x.h” u32 tmp; int main (void) ( RCC->APB2ENR |= RCC_APB2ENR_IOPCEN; // Activați sincronizarea PORTC. GPIOC->CRH |= GPIO_CRH_MODE8; // Ieșire LED4 PC8 la ieșire. GPIOC->CRH &=~GPIO_CRH_CNF8; // Push-pull ieșire pe PC8. GPIOC->CRH |= GPIO_CRH_MODE9; // Ieșire LED3 PC9 la ieșire. GPIOC->CRH &=~GPIO_CRH_CNF9; // Ieșire push-pull pe PC9. GPIOA->CRL&=~GPIO_CRL_MODE0; // „USER butonul " PA0 - la intrare. // Blocați setările de pin PC8, PC9. GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCK9| GPIO_LCKR_LCKK; GPIOC->LCKR = GPIO_LCKR_LCK8|GPIO_LCKR_LCKR = GPIO_LCKR_LCKLC_8|GPIO_LCKR_LCKLC_8|GPIO_LCKR_LCK9; K9|GPIO_LCKR_LCKK;tmp= GPIOC-> LCKR; tmp=GPIOC->LCKR; )

Scrieți și citiți GPIO

Porturile de intrare sunt destinate scrierii și citirii GPIOx_IDRși zi liberă GPIOx_ODR registre de date.

Scrieți în registrul de ieșire ODR port configurat pentru ieșire, setează nivelurile de ieșire ale tuturor biților portului în conformitate cu valoarea înregistrată. Dacă un pin este configurat ca intrare pull-up, starea bitului de registru corespunzător ODR activează tragerea ieșirii către magistrala de alimentare (pull-up, ODR=1) sau magistrala generală a microcontrolerului (pull-down, ODR=0).

Citiți registrul IDR returnează valoarea de stare a pinii microcontrolerului configurați ca intrări:

// Dacă butonul este apăsat (PA0=1), setați biții portului C, altfel resetați. dacă (GPIOA->IDR & GPIO_IDR_IDR0) GPIOC->ODR=0xFFFF; altfel GPIOC->ODR=0x0000;

Resetarea și setarea biților de port

Pentru resetarea atomică și setarea biților GPIOîn microcontrolere STM32 registrul este destinat GPIOx_BSRR. Tradițional pentru arhitectură BRAŢ o metodă de gestionare a biților de registru care nu necesită utilizarea unei operații de tip "citire-modificare-scriere" vă permite să setați și să resetați biții de port prin simpla scriere a unuia în biții setați BS (Set de biți) și resetați BR (BitReset) Inregistreaza-te BSRR. În acest caz, scrierea de biți zero în registru nu afectează starea pinilor corespunzători.

GPIOx_BSRR- Înregistrați-vă pentru resetarea și setarea biților de port:

GPIOC->BSRR=GPIO_BSRR_BS8|GPIO_BSRR_BR9; // Aprinde LED4 (PC8), stinge LED3. GPIOC->BSRR=GPIO_BSRR_BS9|GPIO_BSRR_BR8; // Aprinde LED3 (PC9), stinge LED4.

Funcții alternative GPIOși reatribuirea acestora (remapare)
Aproape toate circuitele externe motiv special STM32(inclusiv cabluri pentru conectarea rezonatoarelor de cuarț, JTAG/SWDși așa mai departe) pot fi activate pe pinii corespunzători ai microcontrolerului sau dezactivate de la aceștia pentru a permite utilizarea lor ca pini de uz general. Selectarea unei funcții alternative de ieșire se realizează folosind registre cu prefix „AFIO”_.
În plus, registrele AFIO _ vă permit să alegeți mai multe opțiuni de aspect funcții speciale pe pinii microcontrolerului. Acest lucru se aplică în special la ieșirile interfețelor de comunicație, temporizatoarelor (registre AFIO_MAPR), pini de întrerupere externi (registri AFIO_EXTICR) etc.

Salut pe site-ul nostru tuturor iubitorilor de programare, microcontrolere și electronice în general! În acest articol vă voi spune puțin despre ceea ce vom face aici, și anume despre cursul de instruire pe microcontrolere ARM.

Deci, mai întâi, să ne dăm seama ce trebuie să știți și să puteți face pentru a începe să învățați ARM-urile. Dar, în principiu, nimic super complicat și încântător 😉 Desigur, oamenii trec de obicei la controlere ARM după ce s-au jucat deja suficient cu PIC-uri și AVR-uri, adică cei mai mulți dintre ei sunt dezvoltatori cu experiență. Voi încerca însă să descriu cât mai detaliat și cât mai clar tot ceea ce vom analiza, pentru ca cei care au decis să își încerce pentru prima dată mâna la programarea microcontrolerelor să poată înțelege cu ușurință materialul. Apropo, dacă aveți întrebări sau dacă ceva pur și simplu nu funcționează conform intenționării, scrieți în comentarii, voi încerca să-l dau seama și să vă ajut.

Acum să trecem la probleme tehnice) Am menționat deja de mai multe ori numele „Curs de formare ARM”, dar, în general, acest lucru nu este în întregime adevărat. Nu există un microcontroler ARM. Există un controler cu un nucleu ARM(!), dar acesta, vedeți, nu este încă același lucru. Deci, astfel de dispozitive sunt produse de o serie de companii, printre care se remarcă STMicroelectronics și NXP Semiconductors. În consecință, produc controlere STM și LPC. Am optat pentru STM32, pur și simplu mi-au plăcut mai mult =) Este foarte captivant cu STM că odată ce ai de-a face cu orice MK din linia STM32F10x, nu vei mai avea probleme cu niciunul. O linie – o fișă de date. Apropo, există o cantitate mare atât plăci de dezvoltare scumpe, cât și nu atât de scumpe cu controlere STM32, ceea ce este foarte plăcut, deși la început ne vom depana programele într-un simulator pentru a evalua capacitățile controlerului înainte de a cumpăra hardware. Aici, pentru orice eventualitate, este site-ul oficial al STMicroelectronics -.

Cumva, am trecut fără probleme la subiectul compilatorului, așa că voi spune câteva cuvinte despre asta. Fără să mă gândesc de două ori, am ales Keil, nu în ultimul rând datorită puternicului simulator încorporat. Puteți să vă uitați la UART acolo și la orice registru și chiar și un analizor logic este disponibil. Într-un cuvânt, Keil mi-a lăsat în mare parte doar impresii plăcute, deși există unele dezavantaje, desigur, dar nu catastrofale. Deci, puteți descărca în siguranță Keil uvision4 de la dezactivat. site(). Adevărat, există un DAR - IDE-ul este plătit, dar este disponibil un mod demo cu o limită de cod de 32 kB, ceea ce este mai mult decât suficient pentru noi deocamdată. Pentru cine nu este suficient, există un număr mare de crack-uri pentru Keil 😉 Totul este instalat fără probleme - aruncăm mai departe de câteva ori și totul se instalează perfect și funcționează fără dansuri suplimentare cu o tamburină.

De fapt, asta este tot ce am vrut să vă spun aici, este timpul să trecem de la cuvinte la acțiune, dar asta este în următorul articol. Vom învăța să programăm microcontrolere STM32 de la zero!

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 disponibile atât pentru elevi, cât și pentru școlari, deci este din aceasta varianta bugetara Vă propun să începem.


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 memorie de sistem 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. Diverse combinații conduc microcontrolerul în diverse moduri. 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 Versiunea: 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.

Acțiune