9. naloga: Prekinitve in časovnik
Navodila za STM32H7:
Po posebej podanih navodilih dodajte podprogram za inicializacijo časovnika z zahtevo po prekinitvi po preteku 1ms (INIT_TC_PSP). Nato še napišite prekinitveno servisni program (PSP) za časovnik, ki naj v celoti opravi vse potrebno za periodični vklop/izklop LED diode (štetje milisekund, preklop LED diod, ...).
Po potrebi dodajte tudi ustrezne spremenljivke. Če kodo izvajate iz RAM pomnilnika, sporočite mikrokrmilniku spremenjen naslov vektorske tabele v programu, da se bodo prekinitve pravilno izvajale. Sprememba je potrebna samo pri izvedbi kode iz RAM pomnilnika.
Navodila za FRI-SMS:
Namesto čakanja v zanki na postavitev bita CPCS kot v podprogramu DELAY_TCO (8. naloga), izvedite merjenje časa s pomočjo prekinitev:
1. Napišite podprogram INIT_TC0_PSP, kjer nastavite TC0 tako, da bo CPCS predstavljal prekinitveno zahtevo.
2. Napišite podprogram INIT_AIC, v katerem ustrezno nastavite prekinitveni krmilnik AIC. Za nastavitev AIC je v grobem potrebno narediti naslednje:
• v AIC_SMR17 vpišite primerno prioriteto, npr. 4. (0 – najnižja, 7 – najvišja). ID številka za TC0 je 17.
• v AIC_SVR17 vpišite naslov vašega PSP.
• z vpisom 1 v bit 17 AIC_IECR omogočite prekinitve za TC0.
3. Napišite prekinitveni servisni program (PSP), ki šteje prekinitve in ko poteče pol sekunde, nastavi globalno spremenljivko MSEC_500 na 1. Pred izhodom iz PSP morate opraviti "slepo" pisanje v AIC_EOICR!
4. Napišite podprogram ENABLE_IRQ, v katerem je potrebno pobrisati bit I v CPSR.
5. Napišite glavni program, v katerem pokličete podprograme za ustrezne nastavitve: INIT_AIC, INIT_TCO_PSP, INIT_IO (za krmiljenje LED diode s signalom PC1 – 6. in 7. naloga), ENABLE IRQ. Nato naj glavni program čaka v neskončni zanki, da se vrednost globalne spremenljivke HALF_SEC spremeni na 1. Ko se to zgodi, naj glavni program spremenljivko MSEC_500 postavi na 0 in pokliče ustrezen podprogram, s katerim preklopi LED diodo.
Skupna navodila:
Pri reševanju poskusite biti karseda samostojni. Glejte prosojnice in tovarniško listino.
Opomba: Preklapljanje diode bi sicer lahko v celoti opravili tudi v PSP, vendar je običajno koristno, da v prekinitvah postavljamo spremenljivke, ki nam označujejo pomembnejše časovne intervale. Tako potem lahko v glavnem programu opravljamo koristno delo, občasno pa v enakomernih časovnih intervalih sprožamo različna opravila (npr. branje senzorjev, pregled prejetih znakov, itd...). Pri rešitvi za STM32H7 pa uporabimo drugačen pristop in PSP v celoti sam šteje interval in ustrezno krmili LED diode.