Strapping stm32 descriere și instrucțiuni de programare. Conectarea microcontrolerului

Într-o zi, am decis să-mi actualizez linia de plăci de dezvoltare. În acest moment, nu simt nicio nevoie specială să lucrez cu controlere noi, așa că s-a decis să fac o depanare fundamental diferită. În el am vrut să implementez următoarele caracteristici:

Posibilitate de funcționare autonomă. Uneori chiar vrei să iei un dispozitiv cu tine „la plimbare” sau la muncă, dar plăcile anterioare necesitau alimentare externă. As dori ca sursa de alimentare sa fie pe placa in sine.

Utilizați un cip suficient de puternic. Deoarece mi-am folosit depanarea pe stm32f100 pentru o lungă perioadă de timp, pe măsură ce proiectele progresau, mi-am dat seama că vreau să folosesc cipurile la maximum. Deoarece capacitățile acestuia din urmă nu mi-au fost suficiente (puține picioare și o frecvență scăzută de 24 MHz), am decis să trec la un cip puțin mai mare: STM32F103, pe care aveam deja o depanare reușită, dar care nu era foarte utilizat pe scară largă. .

Folosește baterii 18650, pe care le iubesc atât de mult pentru raportul capacitate/preț.

Utilizați controlerul de alimentare mini-usb încorporat pe MCP73833. Am vrut să încerc să fac o placă din fabrică cu o bună îndepărtare a căldurii de pe cip și să văd cum ar fi să overclockez acest controler de încărcare fără un radiator extern.

Utilizați TPS63000-ul meu preferat pentru a crea o linie de 3,3 V. Nu este un controler de putere foarte eficient în ceea ce privește curentul inactiv, dar funcționează ca un convertor boost/buck, permițând ca toată puterea bateriei să fie utilizată în timp ce scoate un curent mare (unități de amperi).

Marcați toți pinii de semnal ai plăcii.

Ei bine, lucrurile mici:

Quartz 5032 (nici o singură defecțiune în timpul întregii operațiuni)

Smd0603+conders 0805 pe cele mai mici amprente.

Separarea legăturilor analogice și digitale în dispozitiv

Conectori cu pas de 2,54 tip femela (PBS20) pentru a putea instala in placile mele facute cu prada conectorii pe care ii am in cantitati mari de acelasi tip, dar mascul (iese mai ieftin).

Lipire complet unilaterală (cu excepția conectorilor bateriei).

Testarea convertorului DC-DC.

După aceea am început să testez. În acest scop, am cumpărat special un rezistor SQP5-4R7 pentru a testa controlerul DC-DC pentru un curent de ~1A. Ca urmare a testelor, rezistorul s-a încălzit până la 110 * C (recunoscut de pirometru), ceea ce a dus la o scădere a rezistenței și la o creștere a curentului la 1A.

Drept urmare, s-a constatat că nu a existat niciun zgomot suplimentar, iar întregul sistem a funcționat ca un ceas. În acest caz, temperatura convertorului DC-DC este în intervalul 35-40*C la o temperatură externă de +27*C. Desigur, înțeleg că, pe măsură ce sarcina crește, și pulsațiile vor crește, dar cred că atunci când există o sarcină de putere suficientă care funcționează de la linia de alimentare a microcontrolerului, atunci nu va fi necesară o precizie specială a părții analogice.

Testarea incarcatorului.

Sincer, aceasta este prima dată când am decis să fac o placă produsă comercial cu MCP73833. Ultima dată m-am uitat la modul în care acest controler se încarcă și funcționează în general + m-am familiarizat în practică cu algoritmul de funcționare a acestuia. În acest caz, din moment ce absolvirea mea se apropia și îmi doream foarte mult să o încerc, pur și simplu am demontat placa anterioară și am transferat cu grijă toate componentele pe cea nouă. Drept urmare, la încărcarea bateriei după testul anterior, am înregistrat că, cu un curent de încărcare de 375 mA, temperatura controlerului de încărcare nici măcar nu a ajuns la 45 * C. Acest lucru sugerează că puteți relua în siguranță rezistorul de control al încărcării pentru a crește curentul de încărcare. O voi ridica la 500mA, dar nu voi merge mai departe. Acest lucru nu se datorează căldurii care va fi generată pe microcircuit, ci faptului că nu toate sursele mele de alimentare de cinci volți pentru telefoanele mobile produc mai mult de 500mA. Nu exista protectii speciale in cele la care m-am uitat, iar asta poate duce la probleme in reteaua electrica.

Dezavantajele plăcii dezvoltate.

După ce am efectuat aceste teste, precum și mi-am imaginat cum voi lucra în viitor cu această placă, au devenit clari o serie de factori pe care nu i-am luat în considerare în acest proiect:

Nu aveam suficientă experiență în urmărire pentru a instala un comutator pornit/oprit pe baterie pe această placă de circuit imprimat. Desigur, pot face acest lucru foarte bine trăgând 18650 din conector sau instalând o placă specială din plastic. Dar aceasta este o cârjă, prieteni. Ar fi bine să termin schimbarea.

Nu există BMS pentru baterie pe placă, deși este necesar. Din punct de vedere pur tehnic, TPS63000 funcționează în intervalul de tensiune de intrare de 1,8-6V. Acest lucru este posibil dacă bateria este descărcată profund și va duce la deteriorarea acesteia. Această problemă poate fi rezolvată printr-o modificare a bateriei în sine și instalarea unui bms ieftin direct pe baterie cu împingerea/tăierea unuia dintre contacte. Din nou, nu critic, dar cu cârje.

Nu este nimic conectat la conectorul USB prin linii digitale. Acest controler are o interfață USB încorporată, dar nu l-am conectat la conector. Acest lucru se datorează faptului că în proiectele curente acest lucru nu este necesar și nu am avut niciodată ocazia să instalez o interfață usb normală pe placă (cu diode de protecție și un cip de potrivire a nivelului).

Nu există LED PowerGood pe placă. Când cipul funcționează, nu spune nimic despre el. Acest lucru a fost făcut în mod intenționat pentru a prelungi durata de viață a bateriei, dar uneori nu este convenabil. În viitor, mă gândesc să fac un LED pe un pin puțin folosit și să ofer un link către codul pentru a porni LED-ul când controlerul funcționează

Compactitate insuficientă a plăcii. Dimensiunile actuale ale plăcii sunt de 34x80 mm. Întotdeauna vrei o soluție mai compactă. Poate va merge. Deși, pe de altă parte, nu există mult spațiu pe partea din spate a plăcii de circuit imprimat.

Unii oameni consideră că conectorul de programare și butonul de resetare nu sunt foarte convenabile. Este dificil să ajungi la el când placa este înăuntru, dar din nou poți folosi o șurubelniță (cârje).

Pretul aparatului este destul de mare. Am făcut producție de prototip într-un panou, așa că prețul este redus, dar diavolul este departe de un arduino/stmka chinezesc pentru 200 de ruble.

Oricine își dorește așa ceva.

În prezent există 2 astfel de plăci, așa că oricine le poate cumpăra pentru 1.700 de ruble fără transport și o baterie 18650 De ce nu trimit bateria? – este o chestiune de Russian Post. M-as bucura daca ar trimite bateriile, desi voi incerca sa trimit o cutie de 18650 cu aparatul gratuit primei persoane care comanda.

Ma puteti contacta prin posta: [email protected]

Din punctul meu de vedere despre preț: acum la acești bani poți cumpăra un Arduino original sau descoperire din China. Dar nu poți lua nici unul, nici celălalt cu tine toată ziua fără un kit de corp extern și baterii. Și aici obțineți un lucru gata făcut în care puteți introduce placa și obține o structură foarte rigidă pe care o puteți purta cu dvs. în siguranță, fără să vă faceți griji că lipirea se va desprinde undeva sau dispozitivul va experimenta un scurtcircuit.

Figura 1. Schema circuitului STM32F103RC_board

Un oarecare rafinament. Versiunea 1.0.

S-a întâmplat că, în timp ce pregăteam placa pentru prima vânzare (nu eșantionul meu lipit de mai sus), am decis să îi adaug o serie de caracteristici pentru consumator.

La prima vedere ies în evidență următoarele lucruri:

Nu există „pieptene” PBS-30 pentru inserarea în PCB. Din păcate, aici lucrează 2 factori (am rămas fără ei și clientul a cerut să nu-i instaleze.

Conectorul de programare este realizat cu diferiți pini unghiulari. Data trecută am vrut să folosesc și eu astfel de ace, dar magazinul la care am avut la dispoziție nu le avea. Drept urmare, am fost adus din greșeală pe una dintre piețele de radio din Moscova, unde am găsit cea mai largă selecție a acestor conectori și i-am cumpărat pe cei de care aveam nevoie.

LED-urile sunt puțin diferite. Spre regretul meu, iau LED-uri SMD dintr-o grămadă mare și nu știu întotdeauna ce culoare sunt. De data aceasta sunt două LED-uri verzi și unul alb.

Dar diavolul este adesea în detalii și așa se dovedește aici. Pe această placă am încercat diferite rezistențe pentru a controla curentul de încărcare. Drept urmare, a fost dezvăluit că microcircuitul MCP73833 de pe această placă menține în mod normal un curent de 800 mA și, atunci când este încărcat cu baterii Li-Ion de 2,5 V, se încălzește până la 65-70 * C. Desigur, conform fișei de date, funcționează cu curenți de până la 2A, dar sincer încă nu îmi pot imagina cum să le implementez pe carcasa msop-10. Poate că în următorul caz, în care această problemă este rezolvată mai bine, va fi posibil să scoateți 2A.

Un mic detaliu suplimentar pe care puțini măcar îl vor observa este instalarea inductorului Murata și nu fratele său geamăn chinez cu nume necunoscut. Arată asemănător, doar că acesta este mai bine protejat.

Precauție.

În timp ce efectuam un test complet de diagnosticare, am ars unul STM32F103RCT6. Cum am facut:

Am luat un multimetru obișnuit și l-am băgat în rezistorul de feedback. În acest caz, TPS63000 vede o scădere de tensiune în feedback și începe să crească rapid tensiunea la ieșire. Ca rezultat, conform testului efectuat cu un controler sigilat: tensiunea în impuls a crescut la 7V. În acest caz, controlerul a suferit o supratensiune și a murit.

Un lucru amuzant s-a întâmplat mai târziu: la intrarea de 3,6V, controlerul a început să consume 0,6A. Acest lucru se datorează faptului că TPS63000 are o protecție de curent de 2A încorporată. Acesta a fost curentul care a trecut prin microcontrolerul mort. În același timp, funcționalitatea întregului circuit rămas a fost menținută.

Este ușor să diagnosticați această problemă: trebuie doar să conectați un termometru de măsurare individual (degetul) la controler, iar dacă începe să se încălzească, înseamnă că este mort.

Ambalarea plăcii trimise

Când i-am trimis această tablă colegului meu, am decis să o împachetez mai bine pentru ca R. Post să nu spargă totul. Până la urmă a ieșit așa:





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 (diferiți producători produc astăzi 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 noastră cu controlere 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ă semnalul 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 programul 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ă pentru lucrul cu portul 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.
Introducem în linia de comandă
~$ dmesg | grep tty
pentru a vedea toate porturile seriale ale PC-ului.
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 marcajele 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

Am decis să scriu o carte...
... despre dezvoltarea efectivă a dispozitivelor pe stm32. Prin urmare, cred că dacă există actualizări, acestea vor fi neregulate și mai ales sub formă de piese din carte.
Pentru a nu fi plictisitor, iată o piesă minusculă pentru tine, s-ar putea spune o versiune beta despre rezonatoare de cuarț și frecvențe în general.

Microcontrolerele în sine nu pot funcționa. Au nevoie de tot felul de elemente însoțitoare. De exemplu, STM32L05 poate funcționa cu USB fără rezonatoare externe de cuarț, dar STM32L152 nu. Dacă intenționăm să folosim timp mai mult sau mai puțin precis în proiectele noastre, atunci avem nevoie vitală de un rezonator cu ceas cu cuarț extern. Fără ea, pierderea de timp de 5-10 minute pe zi va deveni complet normală. Și, mai mult, nu va fi constant și depinde de temperatură, tensiune de alimentare și o grămadă de alte lucruri.

Dar nu are rost să citești fișe de date chiar așa, pentru că nimic nu ți se lipește în cap. De obicei încep să desenez circuitul, consultând fișele de date pentru niveluri și alte lucruri și cubul pentru scopul posibil al picioarelor și configurația generală a cristalului. Apropo de configurare.

Ceasuri, cronometre și anvelope

Unul dintre cele mai comune motive pentru care ceva nu funcționează este configurarea incorectă a frecvențelor și a tot ceea ce este legat de aceasta. A sosit momentul să deschidem o altă filă în cub - Configurare ceas. Am deschis un nou proiect, am luat microcontrolerul selectat și am pornit rtc, usb și o pereche de uart. Doar de exemplu. Deschide fila și vezi ceva de genul acesta:

În stânga sunt „sursele” semnalelor de ceas, iar în dreapta sunt „receptoarele”. În timp ce semnalul ajunge de la un capăt la altul, el poate trece prin multiplicatori și divizoare, sau poate direct. Pentru comoditate, ceea ce cubul consideră incorect este evidențiat cu roșu. Nu, puteți face clic pe butonul „genera cod”, compilați rezultatul și încărcați-l (programatorul are întotdeauna dreptate!), dar controlerul nu va funcționa.

Să începem din stânga. Stm32 poate avea surse de ceas înalte (HS) și joase (LS). Ele pot fi interne (I) sau externe (E). Cele care lucrează în prezent sunt evidențiate cu albastru. De exemplu, acum sunt utilizate două surse - 37 kiloherți și 16 megaherți.

Acum sarcina ta este să treci prin labirint, punând totul în pozițiile potrivite. Sarcina este complicată de faptul că puteți seta totul la „verde”, dar apoi descoperiți că frecvența uart nu poate fi ridicată peste 300 baud. În general, programatorii ST au venit cu un fel de jucărie pentru adulți. Acum imaginați-vă că anterior toate acestea trebuiau calculate manual, după ce citiți în mod repetat documentația și aflați dacă ar funcționa ar putea fi făcut doar experimental.

În cazul nostru, totul este simplu: schimbând câțiva parametri în PLL (multiplicatorul programabil), am făcut ușor „roșul” să dispară. Aproape.

Cu acest punct roșu, autorii cubului ne trimit la documentație, care spune clar că fără un rezonator extern de cuarț nu vom vedea USB ca urechile noastre. Oscilatorul intern „plutește” prea mult, iar acest microcontroler nu știe cum să folosească tactarea din partea USB.

Ok, să mergem la prima filă și lângă RCC vedem această imagine

Dezactivare - acest lucru este de înțeles, dezactivat. Bypass-ul este recepția unui semnal de ceas de la o sursă externă. La urma urmei, cu stm puteți face o grămadă de microcontrolere să funcționeze în același ritm, deoarece acest lucru simplifică foarte mult problemele de interacțiune între cipuri. De exemplu, acest lucru se face pe toate plăcile de descoperire pe care le-am văzut. Acolo, în partea de „programare”, există un rezonator de cuarț care „alimentează” cipul de programare, care, la rândul său, trimite un semnal de ceas la cipul de pe placă. Și ei bine, ultimul punct este propriul tău, ca să spunem așa, rezonatorul personal de cuarț.

Deoarece avem un proiect de testare „pentru distracție”, le pornim pe amândoi la „rezonator” și vedem ce se întâmplă.

După cum puteți vedea, nu avem voie să schimbăm frecvența rezonatorului „ceas”, dar nu avem voie să schimbăm frecvența celui „rapid” - atât cât ne place. Din nou va trebui să mergem la magazin și să vedem ce au, cât dau și dacă ni se potrivesc.

Deschidem fișa de date (eu am pus-o în 02_switch pentru orice eventualitate) și căutăm cerințele pentru cuarț. Pe lângă frecvență, rezonatoarele de cuarț au încă doi parametri - capacitatea și frecvența de atingere. Capacitatea în pF este necesară pentru a calcula condensatorii de „pornire”, dar cu ppm este puțin mai complicat

Abrevierea ppm înseamnă părți pe milion sau numărul de milionsimi din frecvența fundamentală. Cu alte cuvinte, o eroare de 100 ppm pentru 100 MHz înseamnă o schimbare de frecvență de 100/1000000 de 100 MHz. Astfel, frecvența poate merge cu 100000000 * 100 / 1000000 = 10000 Hz (10 kHz, sau 0,01 MHz), adică frecvența finală poate fi orice în intervalul 99,99 ... 100,01 MHz. Sau, cu alte cuvinte, cu cât ppm este mai mic, cu atât mai bine.

Deci, ne uităm la fișa de date și găsim următoarea placă

Potrivit acestuia, cuarțul nostru „de mare viteză” poate fi de la 0 la 32 megaherți. Kub crede că este posibil doar până la 24 (și în alte locuri se vorbește și despre o frecvență maximă de 24 de megaherți). Dar recomand din tot sufletul să folosiți parametrii din coloana Typ(ical) sau „tipic”. După cum arată practica mea, acestea sunt numerele cele mai fără probleme.

Vorbind despre cuarț, puteți juca cu frecvențe „învecinate” în puteri de doi. Adică, uită-te la 2, 4, 8 și 16 megaherți. Efectuăm căutarea folosind metoda deja descrisă: mai ieftin, mai bun și poate fi lipit manual.

După cum puteți vedea, acestea sunt necesare cu o capacitate de încărcare de 20pF. Dar am dat peste 16 sau 32. Ce să fac? Ca de obicei, citiți fișa de date și uitați-vă la linia „AN2867 „Ghid de proiectare a oscilatorului pentru microcontrolere ST”” (o puteți lua în același loc cu celelalte fișiere suplimentare pentru carte).

Pe scurt, există următoarea diagramă

și iată o formulă atât de complexă

Folosind cunoștințele de matematică din clasa a V-a de gimnaziu (deși aș putea greși), să rezolvăm această ecuație cea mai complexă:
16 = (X*X)/(X+X)+3
16-3=X*X/2*X
13=X/2
X=26
Deci, răspunsul este că condensatorii CL1/2 ar trebui să fie de 26pf. Nu există astfel de lucruri în natură, dar există 27pF, care este mai mult decât potrivit pentru noi.
Acum trebuie să calculăm dacă generatorul va porni. Există o formulă puțin mai jos

Noi numărăm
G=4*60*(2*3,14*(8*(10^6))^2*((7+16)*10^(-12))^2)
Am desemnat exponentiația ca ^, care este folosită și de Excel.
Este foarte ușor să fii confuz, așa că am făcut un tabel simplu de numărare în Excel (fișierul se numește rezonator)

Înlocuim valorile găsite acolo și ne uităm la valoarea din celula Câștig. Conform documentației, ar trebui să fie mai mare de 5. Și cu cât mai mult, cu atât mai bine. Am primit-o aici. Deși dacă luați un rezonator cu o sarcină de 32pF, acesta va fi mai puțin.

O procedură similară va trebui făcută cu cuarțul „ora”.

Ne întoarcem la cub și setăm valorile, răsturnând simultan comutatoarele, astfel încât să nu fie roșu nicăieri.

După cum puteți vedea, totul a devenit bine peste tot și microcontrolerul va funcționa la frecvența maximă - 32 megaherți.

Ce zici de verificare?

Dar mă întreb dacă am numărat totul corect. Trebuie să fim verificați. Primesc descrierea stm32l-discovery și deschid diagrama acolo. Găsesc partea cu rezonatorul

Și, în general, luând în considerare circuitele altor persoane, garantate să funcționeze și destinate circulațiilor uriașe de plăci, pot face progrese mari în rezolvarea întrebărilor „cum se face”.

De continuat...

Adică, pentru a picta un pixel la coordona X=1 Y=5, va trebui să notăm întreaga prima coloană a paginii zero X=1 Y=0-7. Pentru a face acest lucru, trebuie fie să stocați tamponul video în controler; sau înainte de a scrie, citiți blocul, apoi modificați-l și abia apoi scrieți-l; sau aveți o idee bună despre structura ecranului și luați în considerare atunci când afișați inscripții, grafice, desene... În cea mai simplă versiune - text - de lucru cu astfel de afișaje, este suficient să utilizați un font care este un multiplu. de 8 puncte în înălțime (1 pagină) și afișați-l în multipli de 8 puncte: 0,7 ,15...

Firmware/bibliotecă

O bibliotecă pentru lucrul cu afișaje pe controlerul ST7565R prin interfața paralelă 8080 în modul text a fost scrisă pe baza foii de date și a codului sursă care a venit cu un afișaj similar de la alt producător. Comenzile și au fost preluate și adaptate din proiectele mele anterioare de afișare de la și. Biblioteca este potrivită pentru afișaje bazate pe controlerul ST7565R. Când îl utilizați, trebuie să țineți cont de caracteristicile fiecărui afișaj individual, de exemplu, ce linii de control ale afișajului sunt inversate și care nu. Este scris și sub
familia de controlere stm32f1xx, atunci când îl utilizați pe alte controlere, trebuie să schimbați funcția de inițializare a pinii și să definiți responsabilii pentru controlul pinii.

Biblioteca conține următoarele funcții:

lcd_init_pins(); Inițializarea pinii de afișare
lcd_delay(nesemnat lung p); Întârziere
lcd_write_data(caracter nesemnat dat); trimiterea datelor pentru afișare
lcd_write_cmd(caracter nesemnat cmd); Trimiterea comenzilor
lcd_Initial_Dispay_Line(caracter nesemnat linia); Adresa primei linii a afișajului
lcd_Set_Page_Address(caracter nesemnat adăuga); Set șir (înlocuit lcd_gotoxy)
lcd_Set_Column_Address(caracter nesemnat adăuga); Setați coloana (înlocuit lcd_gotoxy)
lcd_Power_Control(caracter nesemnat vol); Gestionarea energiei
lcd_Regulor_Resistor_Select(caracter nesemnat r);
lcd_Set_Contrast_Control_Register(caracter nesemnat mod); Setarea contrastului afișajului
lcd_init(nud); Inițializarea afișajului
lcd_clear(nud); Curățarea afișajului
lcd_gotoxy(caracter nesemnat x,car nesemnat y); Setarea cursorului de text
x-coloana, y- linie (pagina)
nesemnat char lcd_symbol_decode(caracter nesemnat c); Decodificarea unui tabel ASCII comprimat
c— cod de caractere în ASCII
lcd_putch(caracter nesemnat c); Afișarea unui simbol
c- simbol
lcd_putch_inv(caracter nesemnat c); Ieșirea unui caracter inversat (umbrit).
c- simbol
lcd_puts(car *s); Ieșire de linie
s- linie
lcd_puts_inv(car *s); Ieșirea șirului inversat
s- linie
void lcd_test(nud); Testați umplerea afișajului cu caractere consecutive
lcd_putch_big_prototype(caracter nesemnat col,car nesemnat rând,car c, caracter nesemnat inv); Ieșire caractere x2 x4 x8 dimensiune
col- latime
rând- înălțime
c- simbol
inv- inversare 0 - oprit, 1 - pornit
lcd_putch_big(car c); Ieșire cu dimensiunea simbolului x2
c- simbol
lcd_puts_big(car *s); Ieșire de linie x2
s- linie
lcd_puts_int2(caracter nesemnat v); Imprimarea unui număr din două cifre (funcție simplă)
v- un număr de la 0 la 99
lcd_puts_int(int v); Ieșiți numărul.
v— un număr de la -32768 la 32767
lcd_puts_long(nesemnat lung v); Ieșiți un număr lung de 4 octeți (atenție! funcția necesită multă memorie)
v— număr de la -2147483648 la 2147483647

Inițializarea pinilor afișajului se face prin setarea următoarelor definiții în fișierul ST7565R.h, pentru controlerele stm32f1xx.

#define INVERT_MODE 1 // răsturnează afișajul #define lcd_port_data GPIOB // portul de linie de date #define lcd_port_data_rcc RCC_APB2Periph_GPIOB // tactarea portului de linie de date #define lcd_port_data_offest 0 // offset dacă pindata inițială nu este 0_IO_PIN_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

// liniile de date trebuie să ruleze consecutiv în ordine crescătoare #define lcd_port_control GPIOB // portul de linie de comandă #define lcd_port_control_rcc RCC_APB2Periph_GPIOB // tactarea portului de linie de comandă #define lcd_pin_RS GPIO_Pin_14 // linia de selecție de comandă/date #define lcd_WR/Line de selecție de date #define lcd_WR/1_GP_IO_RW #define lcd_pin_E_RD GPIO_Pin_12 // activare linie, permisiuni #define lcd_pin_CS1 GPIO_Pin_11 // cristal/linie de selecție afișare #define lcd_pin_RST GPIO_Pin_15 // resetare linie

Dacă familia controlerului este diferită, atunci va trebui să ajustați setările pinii MK, funcția din fișierul ST7565R.c: lcd_init_pins, funcțiile de ieșire a datelor și a comenzii - lcd_write_data, lcd_write_cmd, precum și definirea liniilor de control în ST7565R.h.

Un exemplu de program, al cărui rezultat este prezentat în primele fotografii.

Cred că nu este nevoie să comentezi nimic suplimentar, comentariile din cod sunt suficiente.

Articol actualizat 23.04.2016

18 comentarii la „Conectarea unui afișaj LCD COG la controlerul ST7565R”

    Bună ziua
    Îți vizitez periodic site-ul și urmăresc noile actualizări, deoarece... Am început cu poze și în prezent lucrez cu stm32.
    Un alt articol bun! Păcat că nu a ieșit puțin mai devreme)
    Acum câteva luni, a trebuit să mă ocup și de controlerul ST7565 de pe ecranul w012864C2-TFH de la WINSTAR și să scriu propria bibliotecă pentru fonturi rusești de diferite dimensiuni și stiluri (conexiune prin spi).
    Acest articol a fost foarte util:
    http://edeca.net/wp/electronics/the-st7565-display-controller/
    și un program pentru generarea fonturilor pe pagina autorului.
    Poate vei fi și tu interesat.

    Mult succes si succes in toate.

    Din păcate, scrierea acestui articol mi-a luat mult timp, l-am început în decembrie anul trecut.
    Am vrut să scriu totul mai detaliat (partea de software), dar până la urmă ieri l-am completat la minimum necesar și l-am postat. Poate că în viitorul apropiat voi adăuga puțin la ea.
    Lucrez cu aceste afișaje cu plăcere de mai bine de 2 ani.

    În articolele tale postezi doar codul de bază pentru lansarea și înțelegerea funcționării modulului. Mă întreb cum organizezi ieșirea caracterelor rusești :)
    Această întrebare a apărut când am folosit biblioteca pe un afișaj 1602, am luat-o ca exemplu pentru proiectul meu.
    Folosesc Keil și pentru mine în ambele cazuri dificultatea a fost asociată cu corelarea codului literei rusești din tabelul de afișare cu codul din depanator)
    Mă întreb ce mediu de dezvoltare folosești și ce soluție ai folosit =)

    Salutări, Yuri

    Acum folosesc CooCox, nu are probleme cu alfabetul chirilic. În Keil, la început am scris biblioteca pentru lucrul cu afișajul și toate mesajele în rusă în notepad++. Apoi, cumva întâmplător, fișierul a fost transferat, se pare, la Unicode, iar de acolo a devenit posibil să se lucreze cu alfabetul chirilic în Keil. Nu pot să explic mai precis, pentru că... Am uitat deja, în opinia mea, la această întrebare s-a răspuns de mai multe ori în comentariile la afișajele de caractere descrise anterior pentru stm32.
    Când am terminat de studiat și am trecut la proiectul la care încă lucrez, mi-am dat imediat seama că voi trece de limita de 32KB și voi trece la alt IDE.

    Am adaugat putin la articol.

    Vladimir scrie 20.10.2016 la 20:15

    Se întâmplă să aveți un convertor de imagine 128*64 pentru a obține o matrice de ieșire, ca în programul dvs. Generator de imagini pentru un afișaj 84*48 de la Nokia.

    Din câte îmi amintesc, am 2 programe generatoare de imagini pe site-ul meu. Primul generează pentru Nokia, i.e. 84x48, aceasta este prima versiune a programului și acel articol este marcat ca depășit. A doua versiune generează până la 320x240.

    Este puțin probabil să existe ceva lipit mai ieftin decât afișajul de la Nokia 1202
    la pretul de 70! r.

    Nu despre asta este articolul. Citiți cu atenție prefața.
    Dacă vrei să-l folosești în design-urile tale, atunci folosește display-uri de pe telefoanele mobile, am făcut asta o dată, apropo, am mai multe articole despre display-uri de la Nokia. Folosesc acest afișaj într-un dispozitiv serial și am trecut la el și în designul meu.

    Alexey scrie 19.02.2017 la 00:40 Cablarea unor astfel de afișaje este aproximativ aceeași, dar pinii pot fi amplasați diferit, numele pinilor sunt aceleași. Schema de conectare poate varia ușor.
    Prin urmare, în orice caz, este necesară o foaie de date pentru afișarea selectată. Schemele de cablare pentru toate afișajele le-am luat din documentația oficială special pentru anumite mărci.
    Articolul prezintă 4 afișaje diferite, 3 (pe eșarfa verde) au același circuit de conectare și pinout și diferă de GG1286456FFWJ-A-R.

    Multumesc! foarte util

    Alexander D scrie 25.02.2018 la 18:34

    Bună ziua
    Dispozitivul meu a folosit un modul de afișare COG destul de rar cu o matrice de 132x64 pe un controler Solomon SSD1815BZ. Din păcate, în prezent nu se găsește nimic similar pe internet. Cel mai apropiat lucru este 132x64 pe controlerul ST7567, am citit undeva că au același sistem de comandă. Cu toate acestea, conform pinout-ului, nu toate contactele au o corespondență directă. Poți să ajuți cumva în această problemă? Aceste. Este posibil să înlocuiți unul cu celălalt? Și ce se întâmplă dacă instalați un afișaj pe un controler SSD1815BZ, dar cu o matrice de 128x64 - va funcționa deloc?

    Aceste display-uri vin cu diferite interfețe SPI, i2c, 8080. Unele suportă mai multe, alegerea se face prin pinii corespunzători.
    Pentru afișaje cu interes 8080: există 8 linii de date și 5 linii de control, care au nume diferite în surse diferite, chiar și pe site-ul meu pe schema de circuit există un singur nume, dar pe PCB, care a fost dezvoltat mult mai devreme, este diferite (fișe de date diferite au fost utilizate pe afișaje diferite, dar controalele sunt aceleași); Comanda mea este aceeași, căutați o analogie folosind aceste două imagini.
    CS - selecția cristalului
    Resetare (RST) - resetare
    RS - selecție comandă/date
    E (A0) - rezoluție
    RW/RD - scriere/citire
    Când conectați astfel de afișaje, trebuie să acordați atenție și liniilor de conectare ale multiplicatorului condensatorului: CAP+- V1... Aici aveți nevoie de o fișă de date. Dar puteți încerca să selectați prin analogie, o anumită dependență este vizibilă din nume, dar astfel de afișaje au mai multe circuite pentru conectarea condensatoarelor de multiplicare.
    Cu permisiunea:
    diferența de rezoluție și offset nu este mare lucru poate fi ajustată fie în timpul inițializării (dacă există comenzi adecvate), fie compensată la afișarea datelor.
    Inițializarea are, de asemenea, propriile sale nuanțe:
    Alegerea tensiunii multiplicatorului și a circuitului de conectare a condensatoarelor multiplicatoare, contrastul, începutul ieșirii (unghiul), orientarea orizontală/verticală, scanarea (intercalată, secvențială...)... Aceasta va depinde de tipul afișajului . Aici doar primele puncte pot fi critice, restul pot fi selectate fără documente în timpul lucrului.

    Alexander D scrie 27.02.2018 la 18:54

    Multumesc pentru raspuns!
    În general, situația este de așa natură încât capacitatea de a face orice modificări de program în cod este sever limitată. În mod convențional, avem o „cutie neagră” cu o ieșire cu 18 pini și un anod/catod pentru iluminare. Acest conector conținea un afișaj care trebuie înlocuit. Fișele tehnice, pinouts sunt disponibile. Nu există nimic similar pe piață... Cel mai potrivit afișaj disponibil pe ST6757 cu aproape același pinout (ordinea pinurilor este aceeași, dar inversată). Nu există un amplificator (multiplicator) pe noul afișaj. Întrebări privind corespondența pinilor 1..5 ai SSD1815BZ și, respectiv, 10..12 ai ST6757. Este posibil să conectați pur și simplu un alt afișaj la conector prin intermediul unui adaptor și ce să furnizați pinii 10-12? Dacă aveți timp și oportunitatea de a ajuta cu sfaturi, scrieți la e-mail...

    Afișare pe SSD1815BZ
    1.V6 (Acest pin este cea mai negativă tensiune de conducere LCD)
    2.V5
    3.V4
    4.V3
    5.V2 (V2-V5 — Acestea sunt nivelurile de tensiune de comandă LCD)
    6.C2P
    7.C2N
    8.C1N
    9.C1P
    10.C3N
    11.VEE
    12.VSS
    13.VDD
    14.SDA
    15.SCK
    16.D/C
    17./RES
    18./CS
    K
    O

    Afișare pe ST6757
    1.A
    2.K
    3./CS
    4./RES
    5. A0 (D/S)
    6.SCK
    7.SDA
    8.VDD
    9.VSS
    10.V0 (tensiune de alimentare pozitivă a driverului LCD)
    11.XV0 (tensiune negativă de alimentare a driverului LCD)
    12.VG (tensiune de conducere LCD pentru segmente)

Recent, pe Habré au apărut multe articole despre STM32 (). Comentariile menționează în mod repetat complexitatea STM32 în comparație cu AVR. Acest subiect îi afectează în special pe începătorii care doresc să înceapă să învețe microcontrolere și, văzând această opinie, alegeți AVR pentru a studia. Să vedem dacă fiara asta - STM32 - este atât de complicată?

Pentru a face acest lucru, vom alege o versiune ieftină a plăcii și vom scrie firmware-ul pe o duzină sau doi octeți (da, clipirea unui LED de 2 kilobyte este asemănător cu „Hello world” în sute de kilobytes x86 pentru incompetenți). De asemenea, vom învăța cum să scriem programe în orice limbaj de programare pentru STM32.

Introducere

Ce tip de microcontrolere ar trebui să studiez? Această întrebare, în opinia mea, este similară cu întrebări precum „Ce limbaj de programare ar trebui să învăț?”, „Ce limbă străină ar trebui să învăț?” IMHO, trebuie să-l studiezi pe cel care este cel mai necesar la un moment dat, pentru o anumită sarcină. Când știi un lucru, învățarea celui de al doilea va fi mult mai ușor și nici măcar nu te vei gândi la al treilea.

Deci, care este dificultatea STM32? Cea mai comună părere este că programarea perifericelor sale este dificilă. Numărul și tipul de periferice STM32 și AVR sunt aproximativ aceleași. Configurația sa nu este, de asemenea, foarte diferită. Deci care este dificultatea? În microcontrolerele STM32, toate perifericele trebuie mai întâi pornite. Asta e toată dificultatea.

Compar AVR-ul cu clădirile publice: toate ușile sunt larg deschise, peste tot monitoarele strălucesc de reclamă și luminile sunt aprinse, iar STM32 cu o casă privată: dacă vrei să te uiți la televizor, pornește-l mai întâi, apoi schimbă canale. , dacă doriți să faceți pipi, deschideți ușa și aprindeți luminile, spălați-vă pe mâini - deschideți apa și așa mai departe. Nu mă crezi? Să ne asigurăm împreună.

Prezentare generală a consiliului

Am ales cea mai ieftină placă oferită pe aliexpress (poza de mai sus). Puțin mai scump 2, 180 de ruble în decembrie 2015. La bord există echipamente minime: două rezonatoare de cuarț - de înaltă frecvență la 8 MHz și ceas la 32,768 Hz, un buton de resetare, două jumperi pentru selectarea modului de pornire, o pereche de LED-uri - pentru alimentare și pe piciorul PC13 și un set de conectori: microUSB, depanare, doi piepteni pentru toți pinii microcontrolerului.

Este mai ieftin să cumpărați toate piesele, să faceți singur placa și să o lipiți. Cum să coaseți și să depanați? Dacă aveți ST-LINK, atunci este mai bine pentru ei, nu, nu contează, există mai multe opțiuni, de exemplu, prin intermediul unui adaptor USB-USART, nu există așa ceva - puteți direct prin USB, deși trebuie să scrieți singur un șofer pentru acest caz, nimeni nu s-a deranjat încă. ST-LINK este destul de ieftin și este inclus în toate plăcile din seria DISCOVERY. Așa că l-am folosit pe acesta.

Conectăm alimentarea, LED-ul clipește vesel, placa funcționează. Descărcați și instalați programul de programare (ulei-ulei) „STM32 ST-LINK Utility” (luăm toate programele și documentele de pe site-ul producătorului). Încercăm să citim firmware-ul... Programul este protejat la citire. Aparent, nu degeaba toată lumea vorbește despre dificultatea de a scrie programe pentru STM32, chiar și chinezii au protejat acest program extrem de complex de hacking. Sau există un marcaj de virus ascuns acolo? Nu ne vom da seama, eliminăm protecția și obținem un microcontroler STM32F103C8T6 impecabil.

Primul program

Să clipim și LED-ul și să facem, ca să spunem așa, inginerie inversă în mintea firmware-ului nativ. Cum? Pentru a nu crea controverse cu privire la alegerea mediului de dezvoltare, voi face acest lucru în comunitatea mea natală Visual Studio. Mi se pare că nu există Windows mai bun pentru un bărbat.

Cum este programul intermitent pentru Arduino? Configuram piciorul de ieșire și îl comutăm într-un ciclu de la zero la unu și înapoi.
Cum va arăta pentru STM32? Mult mai dificil. Mai întâi, să aprindem lumina în camera de configurare a pinului microcontrolerului, apoi „Configuram piciorul pentru ieșire și îl comutăm într-un ciclu de la zero la unu și înapoi”. Înțeleg că este dificil... Dar ne putem descurca.

În documentul „RM0008. Manual de referință" pe microcontrolerul nostru, să ne uităm la harta memoriei pentru registrele de care avem nevoie.

- Să mergem într-un mod simplu și logic.
- Hai să mergem împreună.

1. Activați sincronizarea portului C (LED-ul nostru se agăță de pinul 13 al portului C). Să ne uităm la document. Registrul de care avem nevoie este RCC_ABP2ENR (traducem: registrul de resetare și ceas este a doua magistrală periferică de viteză redusă). Adresa portului este 0x40021018, bitul IOPCE necesar (portul I/O C - bit de activare) al patrulea este 0x00000010.

Retragere

Microcontrolerele au totul ca procesoare pentru adulți. Există o anvelopă de mare viteză AHB, numită „Northbridge” și un APB de viteză mică, numită „Southbridge”. Procesorul microcontrolerului însuși poate face totul pentru a accelera munca: are preîncărcarea comenzilor și o conductă de execuție a comenzii. Nu există cache, dar procesorul nu este cu mult mai rapid decât memoria, iar citirea și scrierea în memorie pot fi finalizate într-un singur ciclu de ceas. Deci, putem spune că întreaga memorie a microcontrolerului este un cache mare. Bine, bine, nici unul și nici unul mare. Două cache mici.
Toate perifericele sunt mapate la spațiul de adrese. În comparație cu x86, nu există comenzi de intrare-ieșire, dar Intel le-a lăsat doar pentru compatibilitate, acum practic nu sunt folosite.


2. Configurați pinul pentru ieșire. Să ne uităm la document. Registrul de care avem nevoie este GPIOC_CRH (traducem: registrul portului I/O C este registrul de configurare pentru jumătatea mai veche a picioarelor). Adresa portului este 0x40011004, 4 biți sunt responsabili pentru configurația fiecărui segment, valoarea pentru comutarea unui segment la o ieșire este 0001b, pentru pinul 13 valoarea este 0x00100000.

3. Cum să comutați o valoare booleană pe un pin. Să ne uităm la document. Registrul de care avem nevoie este GPIOC_ODR (traducem: I/O port register C - data output register). Adresa portului este 0x4001100C, valoarea sa este transmisă direct la pinii microcontrolerului, pentru pinul 13 valoarea este 0x00002000. Totul este gata pentru a scrie programul (nu uitați să postați proiectul pe github):

Int main(void) ( *((int*)0x40021018) = 0x00000010; // RCC_APB2ENR = RCC_APB2ENR_IOPCEN *((int*)0x40011004) = 0x00100000; // GPIOC_APB2ENR = RCC_APB2ENR_IOPCEN *((int*)0x40011004) = 0x00100000; // GPIOCER*(int*_PUT)() 0x4001100C) ^= 0x00002000 // GPIOC_ODR ^= BIT_13 int i for (i=1000000; i>0; i--) ) extern int _eram; __attribute__ ((section(".isr_vector"))) int g_pfnVectors = ( (int)&_eram, // valoarea inițială a stivei (int)main // Reset Handler );
Cu vectori de întrerupere, sper că totul este clar? Folosim doar două dintre ele, așa că nu este nevoie să pierdem memoria cu manechine. Toate celelalte întreruperi sunt activate de software dacă nu sunt activate, înseamnă că nu vor funcționa niciodată. Excepția este al treilea vector HardFault, dacă se întâmplă - microcontrolerul este defect sau funcționează defectuos, pentru proiecte simple (nu aviație spațială, nu medicină) nu poate fi procesat.

Acesta este un proiect educațional, desigur, toate adresele ar trebui formate ca constante simbolice într-un fișier h separat cu un număr mare de definiții, așa cum se face în CMSIS. Le poți lua și le poți adapta nevoilor tale. Pentru compilare folosesc gcc, firmware folosind „STM32 ST-LINK Utility”. Firmware-ul a avut 56 de octeți (bună ziua, asamblator).

O altă retragere

O altă afirmație despre complexitatea STM32 este că există puțină documentație în limba rusă. Discutabil. Sunt necesare doar două documente - Fișă de date și Manual de referință pentru microcontrolerul dorit. Limba în care este scrisă cu greu poate fi numită engleză. Am studiat limba folosind jucării netraduse, nivelul meu de engleză a rămas la același nivel, dar am citit fără probleme fișele tehnice, termenii necunoscuti sunt clari din context.



Se pare că s-au întâmplat multe, atunci asta e tot pentru astăzi.

În a doua jumătate voi vorbi despre programarea STM32 în orice limbaj de programare.

Etichete: STM32, microcontrolere-sunt-ușoare, arduino-nu-necesar