The NVIC (Nested Vectored Interrupt Controller) manages how a microcontroller handles interrupts. Advanced features help control interrupt priority and behavior for smoother and safer program execution.
NVIC advanced features in ARM Architecture
NVIC_SetPriority(IRQn, priority); NVIC_EnableIRQ(IRQn); NVIC_DisableIRQ(IRQn); NVIC_SetPriorityGrouping(priorityGroup); NVIC_SystemReset();
IRQn is the interrupt number or identifier.
priority sets how important the interrupt is; lower numbers mean higher priority.
NVIC_SetPriority(TIM2_IRQn, 1);NVIC_EnableIRQ(USART1_IRQn);
NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);
This program sets up two interrupts with different priorities. TIM2 has a higher priority than USART1. The priority grouping is set so all bits are used for pre-emption priority, meaning interrupts can interrupt each other based on priority.
// Example: Configure and enable two interrupts with different priorities #include "stm32f4xx.h" int main(void) { // Set priority grouping: 4 bits for pre-emption priority, 0 bits for subpriority NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4); // Set TIM2 interrupt priority to 1 (high) NVIC_SetPriority(TIM2_IRQn, 1); NVIC_EnableIRQ(TIM2_IRQn); // Set USART1 interrupt priority to 3 (lower) NVIC_SetPriority(USART1_IRQn, 3); NVIC_EnableIRQ(USART1_IRQn); while (1) { // Main loop } } void TIM2_IRQHandler(void) { // Handle TIM2 interrupt } void USART1_IRQHandler(void) { // Handle USART1 interrupt }
Lower priority numbers mean higher priority in NVIC.
Priority grouping controls how priorities are split between pre-emption and subpriority.
Enabling an interrupt allows it to trigger; disabling it stops it.
NVIC advanced features let you control interrupt priorities and grouping.
You can enable or disable interrupts dynamically.
Proper configuration helps your microcontroller handle multiple interrupts smoothly.
Practice
Solution
Step 1: Understand NVIC priority grouping
Priority grouping allows dividing interrupt priority into pre-emption priority and subpriority.Step 2: Identify the purpose of balancing priorities
This balance controls which interrupts can pre-empt others and which are handled in order if priorities are equal.Final Answer:
To balance between pre-emption priority and subpriority levels -> Option BQuick Check:
Priority grouping = Balancing priorities [OK]
- Confusing priority grouping with disabling interrupts
- Thinking it changes processor speed
- Assuming it resets the device
Solution
Step 1: Identify function to enable interrupts
The function NVIC_EnableIRQ(IRQn) is used to enable a specific interrupt.Step 2: Differentiate from other NVIC functions
NVIC_DisableIRQ disables interrupts, SetPriority sets priority, ClearPendingIRQ clears pending flags.Final Answer:
NVIC_EnableIRQ(IRQn); -> Option CQuick Check:
Enable interrupt = NVIC_EnableIRQ [OK]
- Using NVIC_DisableIRQ to enable interrupts
- Confusing priority setting with enabling
- Clearing pending interrupts instead of enabling
NVIC_SetPriorityGrouping(3);
NVIC_SetPriority(IRQn, NVIC_EncodePriority(3, 1, 2));
What does this code do?
Solution
Step 1: Analyze NVIC_SetPriorityGrouping(3)
This sets the priority grouping to 3, defining how many bits are for pre-emption and subpriority.Step 2: Decode NVIC_SetPriority call
NVIC_EncodePriority(3, 1, 2) encodes pre-emption priority 1 and subpriority 2 according to grouping 3, then assigns it to IRQn.Final Answer:
Sets priority grouping to 3 and assigns pre-emption priority 1 and subpriority 2 to IRQn -> Option AQuick Check:
Priority grouping 3 + encoded priority = Sets priority grouping to 3 and assigns pre-emption priority 1 and subpriority 2 to IRQn [OK]
- Assuming it disables or enables interrupts
- Ignoring priority encoding details
- Confusing priority grouping with resetting
NVIC_EnableIRQ(IRQn);
What is the error?
Solution
Step 1: Understand function purpose
NVIC_EnableIRQ enables the interrupt, so using it to disable is incorrect.Step 2: Identify correct function to disable
NVIC_DisableIRQ should be used to disable interrupts, not NVIC_EnableIRQ.Final Answer:
The function NVIC_EnableIRQ enables, not disables, interrupts -> Option AQuick Check:
EnableIRQ enables, not disables [OK]
- Confusing enable and disable functions
- Assuming priority affects enabling/disabling
- Thinking order of calls disables interrupts
Solution
Step 1: Understand priority grouping effect
Setting priority grouping to allocate all bits to pre-emption priority means subpriority is zero, so pre-emption controls interrupt order fully.Step 2: Confirm this ensures critical interrupt pre-empts others
With no subpriority bits, the critical interrupt's pre-emption priority dominates, allowing it to always pre-empt.Final Answer:
Set priority grouping to allocate all bits to pre-emption priority and zero to subpriority -> Option DQuick Check:
All bits to pre-emption priority = critical pre-emption [OK]
- Thinking disabling subpriority means setting it high
- Assuming same priority levels allow pre-emption
- Disabling other interrupts is not practical
Ready to prove it?
Pass the test and this pattern moves unknown
