Ce piese sunt necesare pentru un PC. Asamblarea unui PC de jocuri cu propriile mâini

Mediul IAR Workbench este proprietar și necesită licență (dacă codul dvs. depășește 32 KB), dar este destul de suficient pentru uz casnic.

Direct mediul de dezvoltare, care include compilatorul. După instalarea IAR, va trebui să-l înregistrați completând un formular pe site-ul companiei. Vă rugăm să indicați real cutie poştală, vă vor trimite o cheie de licență pentru aceasta.

Va trebui să descărcați arhiva de pe site-ul web ST Microelectronics - aceasta conține:

  • CMSIS(Cortex Microcontroller Software Interface Standard) - o bibliotecă care definește funcționarea nucleului, același Cortex M3 (vom vorbi despre asta mai târziu);
  • SPL(Standart Peripheral Library) - o bibliotecă de periferice standard care vă va economisi mult efort în configurarea unui anumit periferic;
  • Exemple- dacă trebuie să aflați cum funcționează un nou periferic pentru dvs., atunci acest folder conține multe exemple pentru toate ocaziile.

Odată ce IAR rulează, creați un spațiu de lucru FişierNouSpațiul de lucru. Următorul proiect nou, meniu ProiectCreați un nou proiect...

Programul poate fi scris în asamblator, C sau C++. Vom folosi limbajul de programare C.

Proiectul creat trebuie configurat pentru a face acest lucru, deschideți meniul ProiectOpțiuni. În fila Opțiuni generale selectați microcontrolerul țintă - STM32F100x4.


În plus, în Configurarea bibliotecii pune o căpușă Utilizați CMSIS. Mediul IAR include deja această bibliotecă și nu este necesar să o adăugați la proiect, totuși versiunile noi pot emite un avertisment precum:

Atenție: Eticheta „xxxxx” este definită pubweak într-o secțiune declarată implicit rădăcină

Problema este rezolvată prin înlocuirea unor linii din biblioteca CMSIS încorporată: unde este menționat CODE:REORDER, adăugați NOROOT(1) . De exemplu:

PUBWEAK NMI_Handler
SECȚIUNEA .text:CODE:REORDER:NOROOT(1)
NMI_Handler

Apoi, adăugați calea în care vor fi stocate fișierele *.c și *.h - pentru a face acest lucru, accesați fila Compilare C/C++ r ⇒ Preprocesorși adăugați &PROJDIR& (o variabilă care conține calea către folderul proiectului).


În secțiunea Depanator, selectați ca depanator ST-LINK. Bifați casetele Folosiți încărcătorul flashŞi Verificaîn filă Descărcați.

FAQ. Compilatorul IAR C pentru Microcontrolere AVR Atmel

V. Poletaev

Întrebări frecvente
răspunsurile la întrebările frecvente despre compilatorul IAR C pentru microcontrolerele Atmel AVR sunt date de V. Poletaev ( [email protected])

Compilator IAR C pentru microcontrolere Atmel AVR

Există mai multe versiuni ale compilatorului - 1.40, 1.41, 1.50, dar din anumite motive versiunea 1.40c este cea mai răspândită în Rusia. Versiunea compilatorului poate fi găsită în fișierul ewa90d.txt - a nu fi confundat cu versiunea shell.

Întrebare: Am instalat IAR Embedded Workbench și „patch-uri” pentru el. Ce altceva am nevoie?

Răspuns: Versiunea 1.40 vine cu fișiere .xcl care nu sunt complet corecte pentru linker. În plus, descrierile registrelor de microcontroler din acesta sunt incomplete. Pentru o funcționare normală, este logic să luați fie un set de fișiere .xcl și h din mai multe noua versiune compilator sau de pe site-ul web Atmel (ftp://www.atmel.com/pub/atmel/avr030.zip; ftp://www.atmel.com/pub/atmel/io_def.zip).

Fișierele din aceste arhive ar trebui rescrise în directoarele adecvate în loc de cele furnizate împreună cu compilatorul.

Când lucrați în atelierul Embedded, numele corect al fișierului .xcl trebuie specificat separat pentru fiecare țintă în Proiect|Opțiuni|XLINK|Include|Nume fișier XCL, permițând Suprascrierea implicită.

Întrebare: De unde să încep?

În plus, se recomandă să vizitați secțiunea http://www.atmel.com/atmel/products/prod201.htm de pe site-ul web Atmel și să descărcați o serie de documente de acolo:

  • AVR030: Noțiuni introductive cu C pentru AVR (http://www.atmel.com/atmel/acrobat/doc1483.pdf). Bun exemplu pentru a începe rapid. Ca anexă, vine cu ftp://www.atmel.com/pub/atmel/avr030.zip - o colecție de fișiere .xcl corecte pentru diferite configurații de microcontroler.
  • AVR032: Fișiere de comandă pentru linker pentru Compilatorul IAR ICCA90 (http://www.atmel.com/atmel/acrobat/doc1079.pdf). Acesta descrie cum se compune fișiere .xcl. Doar o repovestire a documentației de la IAR. Ca aplicație există un alt exemplu cu fișiere .xcl, dar mai devreme. Este mai bine să utilizați opțiunea din Noțiuni introductive.

În această secțiune există o serie de documente dedicate lucrului cu C și demne de citit cu atenție, dintre care remarc în special AVR035: Efficient C Coding for AVR (http://www.atmel.com/atmel/acrobat/doc1497.pdf ).

Pentru munca eficienta De asemenea, ar trebui să luați de la http://www.atmel.com/atmel/products/prod200.htm cea mai recentă ediție a fișei de date și erratele pentru microcontrolerul selectat și să le studiați cu atenție, în special erata.

Întrebare: Este IAR C diferit de standardul ANSI C?

Răspuns: Da. IAR C include diverse extensii legate de implementarea unui compilator pentru un microprocesor cu arhitectură Harvard (două spații de adrese - pentru cod și date) și pentru o funcționare mai eficientă în condițiile limitate ale microcontrolerelor. Pentru mai multe detalii, consultați Ajutorul de programare a compilatorului AT90S C, secțiunea Extensii de limbaj.

Sistemului de rulare (biblioteca) îi lipsesc funcțiile legate de apeluri sistem de operare(operații cu fișiere etc.).

Întrebare: Este posibil să pun tabele (rânduri etc.) în ROM?

Răspuns: Da. Există o extensie de limbă pentru aceasta - cuvântul rezervat flash. O variabilă descrisă folosind acest cuvânt este situată în spațiul de adrese al codului și este doar pentru citire.

Flash char aaa = „aaa”; flash char bbb = „bbb”; flash char ccc = „ccc”; flash char flash *xxx = (aaa, bbb, ccc, 0);

Dacă se utilizează mai mult de un nivel de imbricare, ca în exemplul de mai sus (o matrice de pointeri către linii), atunci flash-ul trebuie să fie prezent pentru fiecare nivel.

Întrebare: Cum se transmite un șir char flash * unei funcții? Scrierea directă a unui șir în parametrii funcției nu funcționează: printf_P(„String\n”);

Răspuns: Opțiunea 1.

Descrieți-l separat:

( static char str = „Șir\n”; printf_P(str); )

Opțiunea 2. Utilizați conversia de tip explicită:

Printf_P((char flash *)(int)“Șir\n”);

Puteți scurta ușor intrarea folosind #define:

#define F (char flash *)(int) printf_P(F“String\n”);

În această opțiune, linia va fi plasată în segmentul CSTR. În mod implicit, acest segment este situat în spațiul de adrese de date, așa că pentru ca acesta să funcționeze corect, trebuie să remediați fișierul XCL. Trebuie să eliminăm mențiunea CSTR din linia:

Z(DATE)CSTR,CONST=9000-FFFF

(dacă această linie este prezentă în fișierul XCL sursă) și inserați-o în linie:

Z(COD)INTVEC,RCODE,CDATA0, CDATA1,CCSTR,SWITCH, FLASH,CODE=0-1FFFF

Opțiunea 3. Folosiți comutatorul –E.

Această opțiune este posibilă numai atunci când lucrați cu un compilator de la linie de comandă. După specificarea acestei chei, compilatorul plasează date șir în segmentul CSTR și date const în CONST și consideră că aceste segmente sunt situate în spațiul de adrese de cod.

Această opțiune necesită, de asemenea, repararea fișierului XCL pentru a muta CSTR și CONST la linia -Z(CODE).

În plus, această opțiune poate cauza probleme cu utilizarea unei biblioteci traduse fără comutatorul –E.

Și în cele din urmă, în această versiune compilatorul emite un mesaj de avertizare Configurație periculoasă, care poate fi dezactivată doar împreună cu toate avertismentele, ceea ce este incomod.

În opinia mea, cele mai acceptabile sunt prima și a doua opțiune.

Întrebare: Cum se transformă un char * pointer în char flash *?

Răspuns: Utilizați intermediu int:

Char *s; char flash *p; p = (char flash *)(int)s;

Întrebare: Unde sunt situate variabilele const?

Răspuns: Depinde de opțiunile compilatorului instalate. Implicit (dacă nu este specificată nici una dintre opțiunile -y sau -E), aceste variabile sunt plasate în segmentul CONST, care este considerat a fi în spațiul de adrese de date. Acest mod a fost realizat cu așteptarea utilizării memoriei externe de date nevolatile și nu este utilizat în majoritatea cazurilor. În plus, în acest mod, linkerul plasează aceste variabile în regiunea codului la aceleași adrese, ceea ce poate cauza probleme serioase.

Dacă modul –y – „Constante și șiruri de caractere inscriptibile” este setat, atunci compilatorul construiește codul în deplină conformitate cu standardul ANSI, plasând constante și șiruri în spațiul de date de adresă. Valorile lor inițiale sunt stocate în spațiul de adrese de cod în segmentele CDATA0 sau CDATA1 pentru constante și CCSTR pentru șiruri, iar în momentul pornirii sunt rescrise în RAM în segmentele IDATA0/IDATA1 și, respectiv, ECSTR. Principalul dezavantaj al acestui mod este utilizarea neproductivă a memoriei RAM.

Opțiunea cu tasta –E a fost discutată mai sus. Nu este posibil să utilizați comutatoarele –y și –E în același timp.

Pentru a scrie versiunea optimă a programului, este mai bine să nu folosiți const, ci să descrieți datele imuabile ca flash, ceea ce va duce la plasarea lor explicită în memoria programului fără consum inutil de RAM.

Întrebare: Care este cel mai convenabil mod de a lucra cu biți în registrele dispozitivelor externe?

Răspuns: Mai întâi, descrieți o macrocomandă utilă:

#define Bit(n) (1<< (n)) Для установки бита n в порту p: p |= Bit(n); Для сброса бита: p &= ~Bit(n); Для проверки бита: if ((p & Bit(n)) != 0) ...

O listă completă a tuturor biților este disponibilă pe site-ul web Atmel în secțiunea de software, fișierul io_def.zip. Ar trebui să plasați aceste fișiere .h din această arhivă în directorul C:\IAR\EW22DEMO\A90\INC\ în locul celor existente.

Întrebare: printf nu merge la mine. Ce ar trebui să fac pentru a trimite corect informațiile către portul serial?

Răspuns: În primul rând, includeți o funcție putchar separată în programul dvs.:

Int putchar(int c) ( în timp ce ((USR & (1<< UDRE)) == 0); UDR = c; return c; }

Puchar-ul standard din bibliotecă reprezintă o singură instrucțiune RET și nu efectuează nicio ieșire.

Pentru a accesa numele de biți de registru denumit, luați fișierul .h corect din io_def.zip.

Această funcție ar trebui să fie activată numai la compilarea sub target=release, altfel fereastra Terminal I/O poate refuza să funcționeze sub depanator. Cel mai simplu mod de a face acest lucru este să definiți simbolul DEBUG pentru target=debug (Project|Options|ICCA90|#define, enter symbol) și să înconjurați definiția putchar cu directive de compilare condiționată (de exemplu, #ifndef DEBUG ... #endif).

În al doilea rând, ar trebui să introduceți o procedură pentru setarea vitezei de transmisie a portului serial la începutul programului. De exemplu, pentru quartz 5,53 MHz și baud rate 115200, trebuie să setați:

UBRR = 2; UCR = 0x18;

În al treilea rând, printf obișnuit va funcționa numai cu modul –y – „Constante și șiruri de caractere inscriptibile” activat.

În al patrulea rând, trebuie să alegeți versiunea corectă a funcției printf. Pentru detalii, consultați Ajutor de programare a compilatorului AT90S C, configurare, intrare și ieșire.

Funcția standard printf necesită cel puțin 134 de octeți de stivă RAM pentru a funcționa. Aceasta este o risipă groaznică, așa că există versiuni scurtate de printf care au capacități de formatare semnificativ mai puține (în special, nu acceptă setarea câmpului lățimii de ieșire), dar nu necesită atât de mult RAM pentru a funcționa.

Ca o soluție finală a problemei, aș recomanda să faceți următoarele:

Luați ca bază fișierul C:\IAR\\EW22DEMO\A90\ETC\intwri.c și faceți următoarele modificări în el:

  • adăugați linia #include „pgmspace.h”;
  • înlocuiți descrierea funcției cu int printf_P (const char flash *format, ...);
  • schimbați tipul matricei hexadecimale de la const la flash: static flash char hex = „0123456789ABCDEF”.

După aceasta, nu uitați să faceți modificările necesare fișierului XCL (mutați CSTR-ul în secțiunea COD).

Desigur, trebuie să inserați putchar și inițializarea portului.

După aceea, uită de existența printf și folosește numai printf_P.

Întrebare: Nu am suficientă RAM. Ce să fac?

Pe scurt, activați optimizarea dimensiunii. Dacă este posibil, utilizați variabile octet (car). Nu supraîncărcați stiva cu variabile locale mari. Încercați să faceți funcții de dimensiuni mari (moderate!) - în acest fel compilatorul va distribui numărul maxim de variabile în registre. Este mai bine să judeci eficacitatea listând cu modul de inserare mnemonic activat. Este mai bine să treceți nu mai mult de 2 variabile de intrare la funcții - în acest fel acestea vor intra în registre. Plasați constante în ROM cu cuvântul cheie flash.

Studiați cu atenție fișierul .xcl folosit - este inclus în livrare doar ca exemplu și este ineficient în unele locuri. Setați limita inferioară a tuturor segmentelor de DATE (RSTACK, CSTACK, IDATA1, UDATA1, ECSTR) la 60 - acest lucru va asigura utilizarea deplină a RAM, fără găuri. Specificați dimensiunile stivelor hardware (RSTACK) și software (CSTACK).

Întrebare: Portul meu A nu funcționează.

Răspuns: Portul A este folosit ca magistrală de adresă-date atunci când lucrați cu RAM externă. Dacă nu este folosit, atunci în fișierul .xcl ar trebui să comentați linia -e?RSTACK_IN_EXTERNAL_RAM=? C_STARTUP.

Întrebare: Este posibil să creați fișierul de ieșire în formă binară?

Răspuns: Da. Pentru a face acest lucru, specificați mpds ca format de ieșire. Fișierul rezultat cu extensia .tsk va fi imaginea ROM.

Întrebare: Cum să înlocuiți un modul de bibliotecă cu al dvs.?

Răspuns: Cel mai simplu mod este să plasați fișierul sursă cu acesta în directorul de lucru al proiectului și să-l conectați la fișierul de proiect. Apoi shell-ul în sine își va da seama de tipul său (.c sau .s90) și va avea grijă să-l andocheze înaintea celui din bibliotecă.

Întrebare: Care este cel mai bun mod de a depana un program?

Răspuns: Dacă trebuie să depanați un algoritm care este independent de funcționarea perifericului, puteți utiliza C-SPY. Avantajul este depanarea la nivel de text sursă (dar puteți vizualiza și textul de asamblare), dezavantajul este că practic nu există periferie.

Dacă trebuie să lucrați cu periferice standard, puteți utiliza Atmel AVR studio 3.0, care emulează destul de precis comportamentul cristalelor. Pentru a transfera un fișier în el, trebuie să specificați tipul de depanare a formatului de ieșire la xlink. Dacă caracterele din fereastra de text sursă din Astudio sunt distorsionate, atunci ar trebui să instalați un font monospace adecvat (de exemplu, terminal pentru codificarea DOS a literelor rusești sau Courier pentru Windows) în meniul Editare|Fonturi... ATENȚIE! IAR abordează memoria programului octet cu octet, în timp ce Atmel se adresează memoriei programului cu cuvânt. Prin urmare, dacă în fișierul hartă de la linker subrutina are adresa 1234h, atunci în astudio trebuie să specificați adresa 1234h/2=091Ah.

Întrebare: EWA90 funcționează numai pe Windows?

Răspuns: Shell - da. Cu toate acestea, există versiuni de linie de comandă ale compilatorului, asamblatorului și linkerului care funcționează bine sub MS-DOS, folosind extensia DOS încorporată de la Phar Lap Software, Inc.

Principala dificultate atunci când lucrați cu ei este numărul mare de taste. Vă recomand să lucrați mai întâi într-un shell Windows și apoi să luați lista de chei din antetul listării și să o plasați în fișierul make.

Întrebare: Periodic, la compilarea unui fișier complet corect, este aruncată o eroare de sistem. Ce să fac?

Răspuns: Repetați compilarea. Acesta este un fel de eroare de compilator care apare uneori.

Răspuns: Pe site-ul rusesc al Atmel există o selecție de recomandări practice: http://www.atmel.ru/AVR/AVR.htm și http://www.atmel.ru/Spec/Spec.htm.

Răspunsurile la întrebările despre AVR puse de vizitatorii site-ului ATMEL pot fi găsite la http://www.atmel.ru/FAQ/FAQ.htm.

Puteți adresa întrebări reprezentanților ruși ai Atmel - compania EFO prin conferința Atmel pe site-ul http://www.efo.ru.

Un număr mare de specialiști AVR comunică în mod regulat în cadrul conferinței de microcontrolere de pe site-ul Telesystems -

Vizualizări