Pro některé řadiče (komponenty) je potřebné čtení pouze jednou za nějaký čas na základě nějaké události. Aby se z řadiče nemusel stále číst stav a tím zjišťovat zda jsou k dispozici data, využívá se systému přerušení. Systém přerušení se skládá z dvou částí a to z řadiče přerušení uvnitř FPGA, který zpracovává požadavky o přerušení od jednotlivých komponent uvnitř FPGA a na základě toho generuje žádost o přerušení pro MCU. Obsluha přerušení v MCU si při zpracování žádosti o přerušení přečte pomocí SPI vektor přerušení z řadiče uvnitř FPGA a podle jeho hodnoty zjistí zdroj žádosti. Podle stavu bitů tohoto vektoru se volají příslušné obslužné rutiny.
Řadič přerušení je navrhnut genericky, aby bylo možné jednoduchým způsobem nastavit počet vstupních přerušení. Rozhraní komponenty je na obrázku 2.1.
Popis generických parametrů SPI dekodéru:
N : natural, výchozí hodnota 8
Parametr určující počet zdrojů přerušení
Popis rozhraní SPI řadiče:
CLK - vstup pro hodinový signál
RST - vstup pro reset
IRQ_IN - žádost o přerušení z řadičů uvnitř FPGA
DATA_OUT, DATA_IN, WRITE_EN, READ_EN - signály, které je nutné připojit k řadiči SPI
IRQ_OUT - žádost o přerušení z řadiče přerušení. Tento signál je nutné připojit k portu MCU
Knihovna přerušení, která je umístěna v adresáři libs umožňuje obsluhovat pouze osm zdrojů přerušení. Pokud budeme chtít využít více zdrojů přerušení, je nutné v zvýšit datovou šířku SPI dekodéru a v software použít vhodnou instrukci.
Po restartu FPGA se inicializuje řadič přerušení a nastaví se taková maska přerušení, která zakazuje veškeré přerušení. Poté inicializaci je zapotřebí nahrát do řadiče přerušení masku přerušení, která dovoluje přerušení pouze od zdrojů, které budeme využívat. Řadič zpracovává příchozí žádosti o přerušení a v případě, že detekoval žádost, generuje na výstupu IRQ_OUT žádost o přerušení směrem do MCU. Tato žádost způsobí vyvolání obslužné rutiny uvnitř MCU. Obslužná rutina si nejprve přečte z FPGA vektor přerušení, který určuje zdroj přerušení a současně potvrdí přijetí žádosti vynulováním bitů vektoru přerušení v řadiči přerušení. Po potvrzení žádosti je signál IRQ_OUT automaticky deaktivován. Poté co má obslužná rutina k dispozici vektor přerušení, zavolá obslužnou uživatelskou rutinu s parametrem, obsahujícím přijatý vektor přerušení.
Aby přerušení fungovalo tak jak má, je nutné u FITkitu verze 1.x propojit pin JP10(5) (signál z FPGA) s pinem JP9(26) (signál do MCU) - viz obrázek 2.2. V případě FITkitu verze 2.x k tomuto účelu slouží propojka J5.