====== Nested Vectored Interrupt Controller (NVIC) ======
The NVIC manages all the interrupts and is closely coupled to the processor core. \\
A list of all available interrupts: [[interrupt_table|interrupt table]]. \\
\\ {{nvic_complete.svg?700em}} \\ \\
===== Features =====
* 91 maskable interrupt channels.
* 16 programmable priority levels.
* low-latency exceptions and interrupt handling.
\\
===== Configuration Register =====
Table of interrupt numbers: [[interrupt_table| IRQ numbers]]. \\ \\
==== NVIC - ISERx ====
=== ISER0 - Interrupt set enable register 0 ===
\\ {{nvic_reg_iser1.svg}} \\ \\
=== ISER1 Interrupt set enable register 1 ===
\\ {{nvic_reg_iser2.svg}} \\ \\
=== ISER2 - Interrupt set enable register 2 ===
\\ {{nvic_reg_iser3.svg}} \\ \\
|< 100% 5em 5em >|
|SETENA*|1|Enable interrupt (unmask interrupt)|
//*Setting this bit to 0 has no effect, refer to [[#ICER]]// \\
==== NVIC - ICERx ====
=== ICER0 - Interrupt clear enable register 0 ===
\\ {{nvic_reg_icer1.svg}} \\ \\
=== ICER1 - Interrupt clear enable register 1 ===
\\ {{nvic_reg_icer2.svg}} \\ \\
=== ICER2 - Interrupt clear enable register 2 ===
\\ {{nvic_reg_icer3.svg}} \\ \\
|< 100% 5em 5em >|
|CLRENA*|1|Disable interrupt (mask interrupt)|
//*Setting this bit to 0 has no effect, refer to [[#ISER]]//
===== Programming Example =====
For external interrupts via GPIO pins go to the [[exti|EXTI]] page. \\
==== Setup Peripheral (e.g. Timer 2) ====
#include "reg_stm32f4xx.h"
RCC->APB1ENR |= (0x1 << 0u); /* Enable TIM2 clock. */
/* configure timer */
TIM2->PSC = 84000u - 1u; /* Counting with f = 84MHz / 84000 = 1MHz */
TIM2->ARR = 512u; /* Count to 512 */
TIM2->DIER |= (0x1 << 0u); /* Enable IRQ */
TIM2->CR1 |= (0x1 << 0u); /* Start timer */
\\
==== Setup NVIC ====
#include "reg_stm32f4xx.h"
NVIC->ISER0 |= (0x1 << 28u); /* Enable TIM2 global interrupt. */
\\