Site-ul angel5a lpcxpresso Lecția 4

LPCXpresso Lecția 4. Systick. Utilizarea cronometrului pentru a conta în jos.

Vom continua să se dezvolte într-un mediu de LPC13xx CodeRed în curs. Introducere în ceasul sistemului. Aflați LED intermitent pe ceas.

întârziere numărătoarea inversă

rabat în mod natural în ciclul de numărare este cea mai ușoară și mai rapidă opțiune. Este foarte posibil să nu folosească „primul cuplu“, deoarece nu necesită cunoștințe aprofundate. Dar am spus deja că nu-mi place. Să facem funcția de întârziere un pic mai precis, presupun.

După cum probabil vă amintiți de prima lecție. pentru numărătoarea inversă a fost folosit un timer de 16 biți. Mă duc într-un mod ușor diferit. Voi lua ca bază pentru temporizator sistem, alias SYSTICK.

timer sistem

De obicei, timer-ul de sistem este poziționat ca un serviciu pentru sistemele de operare. Potrivit acestuia, există o schimbare de context pentru sistemele multi-threaded, acesta este actualizat pe ceas. De fapt, pe ea pentru a efectua diverse funcții de service. În fișa tehnică LPC13xx pe diagrama bloc timer-ul nu este verificat, iar textul a fost scris despre cantitatea de informații uimitoare: 7.15 System timer tick
ARM Cortex-M3 include un temporizator sistem de căpușă (SYSTICK), care este destinat să genereze
o excepție SYSTICK dedicat, la un interval de timp fix, în mod normal, setat la 10 ms.

Se spune SYSTICK vă permite să genereze o întrerupere la fiecare 10ms. Întrebați: „Ce alunecăm în spatele rahat.“

Și lucru este că timer-ul este de fapt prezent chiar și în diagrama bloc. Si nu oriunde, ci în elementul ARM Cortex-M3. Faptul că timer-ul de sistem este un „standard“ pentru nucleul Cortex. Nu poate fi ARM Cortex-controler de la miez, dar fără a timer-ul de sistem. Deci, puteți fi sigur că va fi rahat pentru fiecare controler.

Și dacă deschideți Manualul de utilizare pentru LPC13xx, veți găsi o întreagă secțiune dedicată acestui temporizator. Și dacă în mod specific, UM10375 capitolul 16. De fapt, se spune că este de numărare numărătoare inversă de 24 de biți, cu pornire sau este cronometrat de către generatorul de sistem (ceasul CPU), sau pe cont propriu. un vector de întrerupere separat este alocat cronometrul sistemului.

de fapt, timer-ul nu neapărat produce intervale de 10 milisecunde, acesta poate fi setat la un alt interval de timp (ceea ce folosim).

Instrumente pentru lucrul cu timer-ul sistemului

CMSIS bibliotecă ne oferă mijloacele de a lucra cu cronometrul.

În bibliotecă, în fișierul core_cm3.h are următoarea definiție: esența ei este simplu. Pentru a începe verificarea admisibilității perioadei solicitate de timp, iar dacă el nu va permite indicarea erorii de întoarcere. Registrul de sarcină este stocat valoare de întârziere. Apoi, setați cea mai mică prioritate de întrerupere pentru întreruperile controler. Reseta contorul, contorul de timp și permite funcționarea sistemului generatorului.

Personalizabil Controler CNIV întrerupe vectori merită o poveste separată, nu vom face cu acest drept acum. Doar considera ca un mijloc prin care să se determine care dintre orice întrerupere ar trebui să fie servit imediat, dar unele pot fi amânată până la finalizarea prelucrării altor întreruperi.

Ce este o întrerupere? Bob este prietenul tău te-a chemat să bea bere în timp ce au fost implicați în studiul acestui curs. Ai fost în bucla principală a programului - studiul lecție. Dar Vasya „cerut“ de la voi întrerupe din această activitate și du-te la o bere cu el - du-te la întreruperea tratamentului. La finalizarea băutură, vă va reveni la studiul materialului din locul unde v-ați oprit înainte de a se alătura Vasey - a revenit la programul principal. Da, un exemplu puțin realist, dar aproape).

În conformitate cu modelul propus CNIV poate acționa ca mintea ta, dacă te brusc în afară de Vasey vă trece mai mult și Wick. În conformitate cu prioritățile în afară te duci să bei bere sau Vasya, sau du-te cu Vika.

În cadrul proiectului următoarele linii sunt prezente în fișierul cr_startup_lpc13.c

Ei bine, înregistrarea în matrice întrerupe vectori, alias g_pfnVectors. Linia de jos este la fel de ușor: vectorul temporizator sistem de întrerupere este pus funcția SysTick_Handler ca un handler, care este în prezent doar controlerul va conduce într-o buclă infinită. buclă infinită va permite să determine apariția brute pe care le atârnă controlerul (este convenabil sau nu, nu vom lua în considerare acum) întrerup.

Dar. Este necesar de menționat prezența în definiția cuvântului SLAB. Acest „cuplaj slab.“ În esență, aceasta înseamnă că această funcție poate fi „strict“ redefinit oriunde în altă parte în proiect, și este redefinit, mai stricte, funcția ar trebui să fie folosit în loc de „slab“. De „strict“ este definiție simplă a funcțiilor, fără cuvinte cheie suplimentare.

cadrane

Deci, în fișierul delay_ms main.c înlocui funcția cu următorul cod:

Aici am definit milisecunde contra. Această variabilă va fi incrementat numai în Stivuitoare eveniment de timer-ul sistemului. Funcția delay_ms așteaptă în buclă până când se modifică valoarea contorului la ms parametru transmise. Este necesar de menționat prezența cuvântului cheie volatile în definirea numărătorului timpului necesar, că optimizator sau modificat într-o buclă de așteptare fără sfârșit.

Funcția principală a LED-ului, după setările de port, adăugați un cod de configurare temporizator:

Aici, SystemCoreClock variabilă definită în CMSIS și conținând frecvență oscilator sistemic. Împărțindu-l în 1000, am calculat cât de multe cicluri de ceas, este necesar să se întârzie în 1ms. Asta este de fapt tot cronometrul este setat și să fie difuzate.

Am act de faptul că această metodă de întârzieri în implementare, de asemenea, nu este exactă. În general, întârzierea se poate dovedi la 1 milisecundă și mai puțin solicitate, în cazul în care funcția de apel a fost pe intervalul milisecundă limită. Dacă în ultimul ciclu <заменить на <= то задержка будет гарантированно не меньше запрошенной, но может быть и на 1 миллисекунду больше. Обычно используется именно последний вариант.

Punerea în practică a proiectului

Totul este ca de obicei. Asamblate, am început depanare, și admira realizările. Deși este măsurat cu un cronometru.

breakpoints

Vreau să vă spun despre o astfel de facilitate ca un punct de întrerupere debugger - Breakpoint.

În aceste cazuri, să ne ajute și să vină breakpointy. Pentru a instala și scoateți-l făcând clic pe mouse-ul pe stânga (în numerele de linie) din linia ne interesează. Este afișat în același loc, un cerc albastru (cerc în cazul în care nu albastru, atunci ceva este greșit):

Când regulatorul este într-un mod de depanare ajunge la un anumit rând, dar se va opri înainte de executarea programului și mediul de a schimba în mod corespunzător aspectul său, prin poziționarea cursorului pe acea linie:

După aceea puteți continua depanarea, pas cu pas, sau de a începe executarea pe.

Uneori, progresul cunoașterii nu este suficient, dar este nevoie de mai mult și să analizeze de ce programul a intrat în această direcție. Pentru a face acest lucru, trebuie să știm ce valoare a avut acest lucru sau acea variabilă. Pentru a face acest lucru, avem nevoie doar pentru a întrerupe cursorul mouse-ul pentru variabila de interes, iar valoarea sa este afișată în tooltip:

Desigur, există și alte mijloace, dar noi încă nu deranja și le pune deoparte.

statistică

Versiunea depanare.START_BREAKAdăugați 3376 bytes.
Versiunea de lansare a luat 2560 bytes.

Da, ATtiny2113 acest cod nu se va potrivi, dar cui îi pasă, am 32kBayta cod cronometrat la aproape 4 ori mai mare decât prețul și doar de 2 ori. Și apoi, ne doar o să se ocupe cu LED-uri clipește?

Comentarii despre proiectul din arhiva

Eu prezint ca „bonus“ facilitate getUptime. Este pur și simplu returnează numărul de milisecunde de la pornirea sistemului (sau ultima resetare). Noi nu-l folosesc chiar acum sau în cazul în care, dar le lasă situată în jurul valorii.

Apoi, am adăugat un apel NVIC_SetPriority. Se poate și arunca. Acest temporizator sistem de redirecționare a întrerupe cea mai mare prioritate. Doar că am avut un caz în care a fost continuată momentul în timpul procesării altor întreruperi. Și în bibliotecă, așa cum a fost menționat mai devreme, întreruperea sistemului timer a ridicat cea mai mică prioritate, care nu i-au permis să se deplaseze alte stivuitoare de întrerupere. Am lăsat această linie, ceea ce ar demonstra fezabilitatea unei astfel de soluții.

Ei bine, ultima ramură a condițiilor în acest exemplu poate fi, de asemenea, eliminate. Șirul nevoie într-un moment de oscilator intern. Și de ce, puteți citi în Utilizatorul Manual'e. Și în bibliotecă, după cum ne amintim, calendarul se întâmplă timer-ul de sistem.

Doar delay_ms funcția se uită la mine ca se presupune că, în cazul overflow contra, care are loc în aproximativ 49 de zile și 17 ore. Diferența nu este critică, dar pentru a elimina din proiect are nevoie de mai mult timp, dar nu merită, atât de rău.

Categorie de navigare