9. naloga: Prekinitve IRQ
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 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, 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.