本文深入解析STM32微控制器中NVIC(Nested Vector Interrupt Controller)的工作原理及其在处理中断请求时的优先级与嵌套机制。
在STM32(Cortex-M3)微控制器里有两个优先级的概念:抢占式优先级和响应优先级。每个中断源需要被指定这两种优先级别。
1. 抢占式优先级决定了中断的嵌套关系,而响应优先级则决定了中断的处理顺序。
例如,具有高抢占式优先级别的中断可以在一个低抢占式优先级别的中断正在执行时打断它并开始自己的处理过程。如果两个中断源拥有相同的抢占式优先级别,则它们之间没有嵌套关系;这意味着后到达的一个将会在前一个完成后再被处理。
2. 当两个同时到来的相同抢占式优先级的中断需要被处理时,系统会根据响应优先级来决定先执行哪一个。
3. 如果这两个中断源不仅抢占式优先级别相等而且响应优先级别也相等,则它们将按照他们在中断向量表中的位置顺序进行处理。
在Cortex-M3中定义了8个比特位用于设置每个中断的优先等级,这些比特可以被分配给抢占式和响应优先级的不同组合。STM32简化了这个过程,使用4位来表示这两个级别的不同分组方式:
- 第0组:所有四位都用来指定响应优先级别。
- 第1至第4组:分别用从一个到四个不同的比特为抢占式优先级别,剩下的用于指定响应优先级。
通过调用`NVIC_PriorityGroupConfig()`函数可以设置这些分组。例如,使用第一组的代码如下:
```c
// 设置中断优先级分组为1
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
// 使能EXTI0和EXTI9_5中断,并指定它们各自的抢占式与响应优先级别。
```
在配置这些值时,确保所选的优先级设置不会超出当前选定的优先级分组所能支持的最大范围。
总结来说,理解如何正确地为STM32中的中断分配合适的抢占式和响应优先级对于实现复杂的多任务处理系统至关重要。