Povolení, stav a priorita
Aby procesor generoval výjimku, aby byla spuštěna rutina obsluhy přerušení, je nutné nejdříve dané přerušení povolit.K tomu slouží sada registrů, které jsou součástí řadiče přerušení NVIC.
Povolení
Pro povolení přerušení je určen registr SETENA. Každý bit tohoto registru odpovídá pozičně jednomu externímu přerušení. Bit 0 je pro povolení přerušení číslo 0 (číslo výjimky 16), bit 1 pro přerušení číslo 1 (výjimka 17), bit 31 pro povolení přerušení číslo 31 (výjimka 47). Protože může být výrobcem implementováno až 240 externích přerušení, musí být těchto registrů víc. Registry jsou označeny SETENA0, SETENA1 atd. a jejich počet je dán počtem externích přerušení, které výrobce v konkrétním mikrokontroléru implementoval.
Registr SETENA0 je dostupný na adrese 0xE000E100, povoluje přerušení číslo 0 až 31 (výjimky číslo 16 až 47), registr SETENA1 je na adrese 0xE000E104, povoluje přerušení číslo 32 až 63 (výjimky 48 až 79), registr SETENA2 je na adrese 0xE000E108 a dál podle počtu externích přerušení daného mikrokontroléru.
Registry SETENA jsou určeny pouze pro povolení přerušení. Zápis hodnoty 1 na požadované pozici přerušení povolí, zápis hodnoty 0 obsah registru neovlivní. Pokud chci například povolit externí přerušení 0 a 2, zapíšu do registru SETENA0 hodnotu 0x00000005. Čtením registru SETENA dostanu stav povolení jednotlivých přerušení.
Zákaz
Pro zákaz přerušení jsou určeny registry CLRENA, která mají stejná pravidla jako registry SETENA. Přerušení je zakázáno zápisem hodnoty 1 na odpovídající pozici registru CLRENA. Pokud chci zakázat přerušení 1 a 3, zapíšu do registru CLRENA0 hodnotu 0x0000000A. Registr CLRENA0 je dostupný na adrese 0xE000E180 a nuluje povolení externích přerušení číslo 0 až 31, registr CLRENA1 je na adrese 0xE000E184 atd.
Pro dočasný zákáz přerušení, například při provádění krititické sekce kódu, jsou určeny speciální registry PRIMASK a FAULTMASK. Tyto registry slouží k zákazu všech přerušení vyjma NMI a HardFault (PRIMASK) nebo pouze NMI (FAULTMASK). Registry jsou přístupné pouze prestřednictvím speciálních instrukcí MSR/MRS nebo CPS. Hromadně lze také přerušení zakázat nastavením speciálního registru BASEPRI. Zápis do tohoto registru zakáže všechna přerušení, jejichž úroveň priority je nižší nebo stejná jako hodnota zapsaná do BASEPRI.
Stav přerušení
Pokud dojde k požadavku na přerušení, ale přerušení nelze vykonat, protože procesor například provádí obsluhu přerušení s vyšší prioritou, přerušení je v nevyřízeném (pending) stavu. Příznak nevyřízeného stavu je uložen v registru SETPEND a přerušení je vykonáno ihned jak je obsluha přerušení s vyšší prioritou dokončena. Registry SETPEND mají stejná pravidla jako SETENA pro každé externí přerušení je vyhrazen jeden bit. Registr SETPEND0 pro přerušení číslo 0 až 31 je na adrese 0xE000E200, SETPEND1 na adrese 0xE000E204 atd. Registr CLRPEND0 je na adrese 0xE000E280, CLRPEND1 na adrese 0xE000E284 atd.
Do registrů SETPEND i CLRPEND je možné provádět zápis a tím také řídit reakce na přerušení. Zápisem do CLRPEND registru lze požadavek na přerušení ukončit, zápisem do SETPEND registru lze sofwarově vygenerovat požadavek na přerušení.
Registr ACTIVE eviduje, zda je dané přerušení v aktivním stavu. Registr ACTIVE0, adresa 0xE000E300, obsahuje příznak aktivity externích přerušení číslo 0 až 31, registr ACTIVE1 je na adrese 0xE000E304 atd.
Priorita přerušení
Od adresy 0xE000E400 jsou umístěny registry pro definici úrovně priority jednotlivých externích přerušení. Pro každé přerušení je vyhrazen jeden 8-bitový registr, který obsahuje hodnotu priority daného přerušení. Výrobce nemusí ale pro uložení hodnoty priority implementovat všech 8 bitů, minimum jsou 3 bity.
Priorita externího přerušení číslo 0 (výjimka číslo 16) je nastavitelná registrem PRI_0, který je umístěn na adrese 0xE000E400, priorita přerušení 1 (výjimka 17) registrem PRI_1 na adrese 0xE000E401, priorita přerušení 2 registrem PRI_2 na adrese 0xE000E402 atd. Nižší hodnota uložená v registru znamená vyšší důležitost daného přerušení.