Lecții Lpcxpresso 4

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.
LPC13xx foaie de date pe diagrama bloc timer-ul nu este verificat, iar textul a fost scris despre cantitatea uimitoare de informații:
7.15 Sistem 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

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

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.
Codul de temporizator presetat este un pic mai complicat:

Aparent pentru a contracara cazul overflow, care apare la 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.

să spunem că ne-am creat o funcție de sistem temporizator SysTick_Config, folosit de câteva ori mai mare întârziere, iar apoi vom executa codul fără întârziere. dar întrerupe din SysTick se va întâmpla?

Da. În esență întrerupere timer în scopuri de formare continua o perioadă predeterminată și a fost destinat (necesar pentru diferite sisteme de operare). Dar nu ai nici o interzice să-l deconecteze.

Dacă aveți nevoie doar de 1-2 ori, în anumite locuri pentru a face o întârziere, puteți direct în acele locuri utiliza inițializarea cronometru și perioada de instalare pentru perioada necesară de întârziere, și după utilizare pentru interzicerea muncii.
Puteți întrerupe chiar refuza, ci doar într-o buclă se așteaptă să stabilească steagul corespunzător.
În esență, utilizați SysTick ca și alte cronometre (Kojima, se taie numai în jos pe funcționalitatea, este în principiu).

astfel încât să nu întrerupă microni zadalbyvat, am scris aici este: