目录
一 5w2h介绍NVIC (Nested Vectored Interrupt Controller)
5W (Who, What, Where, When, Why)
ARM Cortex-M 的 NVIC (Nested Vectored Interrupt Controller)
一 5w2h介绍NVIC (Nested Vectored Interrupt Controller)
NVIC (Nested Vectored Interrupt Controller) 是 ARM Cortex-M 系列微控制器中的一个重要组成部分,用于管理和调度中断。下面使用 5W2H 方法来解释 NVIC 的各个方面:
5W (Who, What, Where, When, Why)
-
Who (谁):
- NVIC 是 ARM Cortex-M 微控制器的一部分,由 ARM 公司设计。
- 开发者在编写 Cortex-M 应用程序时需要使用 NVIC 来管理中断。
-
What (什么):
- NVIC 是一个嵌套向量中断控制器,用于管理中断请求。
- 它负责调度中断服务例程 (ISR) 的执行顺序,以及处理中断的嵌套。
-
Where (在哪里):
- NVIC 位于 ARM Cortex-M 微控制器内部,是其核心架构的一部分。
- 在 Cortex-M 系列的不同型号中,NVIC 的具体实现可能略有差异。
-
When (何时):
- NVIC 在中断发生时被激活。
- 当中断服务例程执行完毕后,NVIC 将控制权返回给主程序。
-
Why (为什么):
- NVIC 的主要目的是提高系统的实时响应能力。
- 它通过支持嵌套中断和优先级处理来确保高优先级的中断能够得到及时处理。
2H (How, How much)
-
How (如何):
- NVIC 通过一组寄存器来控制中断的使能、优先级和挂起状态。
- 开发者可以通过编程这些寄存器来配置 NVIC 的行为。
-
How much (多少):
- NVIC 支持一定数量的中断源。
- 具体支持的中断源数量取决于 Cortex-M 系列的具体型号。
- 例如,Cortex-M4 支持最多 240 个中断源。
示例代码
以下是一个简化的示例,说明如何在 ARM Cortex-M 中使用 NVIC:
c
深色版本
1#include <stdint.h>
2
3// 假设这是中断服务例程
4void isr_example(void) {
5 // ISR 的代码
6 // 处理中断事件
7}
8
9// 初始化 NVIC
10void init_nvic(void) {
11 // 启用中断
12 NVIC_EnableIRQ(Example_IRQn);
13
14 // 设置中断优先级
15 NVIC_SetPriority(Example_IRQn, 3); // 优先级为 3
16}
17
18int main(void) {
19 // 初始化 NVIC
20 init_nvic();
21
22 while (1) {
23 // 主程序循环
24 }
25}
26
27// 假设这是中断向量表中的中断服务例程入口
28extern void Example_IRQHandler(void);
29
30// 中断向量表
31void (* const g_pfnVectors[])(void) = {
32 // 其他中断向量...
33 [Example_IRQn] = &Example_IRQHandler,
34};
35
36// 中断服务例程入口
37void Example_IRQHandler(void) {
38 // 清除中断标志
39 // NVIC_ClearPendingIRQ(Example_IRQn);
40
41 // 调用 ISR
42 isr_example();
43
44 // 清除挂起的中断
45 NVIC_ClearPendingIRQ(Example_IRQn);
46}
总结
NVIC 是 ARM Cortex-M 微控制器中的一个关键组件,用于管理中断请求。它通过一组寄存器来控制中断的使能、优先级和挂起状态,支持嵌套中断和优先级处理,以提高系统的实时响应能力。
二 概述
ARM Cortex-M 的 NVIC (Nested Vectored Interrupt Controller)
NVIC (Nested Vectored Interrupt Controller) 是 ARM Cortex-M 系列微控制器中的一个重要组成部分。NVIC 是一个硬件中断控制器,负责管理各种中断请求,它与 Cortex-M 内核紧密耦合,共同处理中断。
NVIC 的主要特性
-
中断管理:
- NVIC 负责处理所有的中断请求,包括多个 IRQ (Interrupt Request) 和一个 NMI (Non-Maskable Interrupt) 请求。
- IRQ 通常由片上外设或外部中断输入通过 I/O 端口产生。
- NMI 用于处理不可屏蔽中断,例如看门狗定时器或掉电检测。
-
优先级处理:
- NVIC 支持中断优先级处理,可以根据优先级来调度中断服务程序 (ISR) 的执行顺序。
- 中断优先级由用户定义,允许开发者根据应用程序需求调整中断的响应顺序。
-
中断向量表:
- NVIC 使用一个中断向量表来存储每个中断源的中断服务例程的地址。
- 这个表通常位于内存的特定位置,以便快速访问。
-
嵌套中断:
- NVIC 支持嵌套中断,即在处理一个中断时可以被更高优先级的中断打断。
- 这样可以提高系统的实时响应能力。
-
中断使能和禁止:
- NVIC 提供了使能和禁止特定中断的能力,允许开发者根据需要动态控制中断的启用和禁用。
-
中断挂起和清除:
- NVIC 支持中断挂起和清除机制,可以防止中断重复触发。
- 这有助于避免中断服务程序被不必要的重复调用。
NVIC 的工作原理
-
中断请求:
- 当一个中断发生时,NVIC 接收到中断请求。
- 如果中断被使能并且没有被更高优先级的中断抢占,则 NVIC 会处理该中断。
-
中断优先级:
- 每个中断都有一个优先级,NVIC 会根据优先级来确定中断的处理顺序。
- 高优先级的中断可以打断低优先级中断的处理。
-
中断服务例程:
- 当中断被处理时,NVIC 会跳转到相应的中断服务例程 (ISR)。
- ISR 完成后,NVIC 会返回到中断之前的程序位置。
-
中断挂起:
- 如果中断服务例程正在处理时又产生了新的中断请求,NVIC 会挂起当前中断并处理更高优先级的中断。
- 当更高优先级的中断处理完成后,NVIC 会返回到先前被挂起的中断。
-
中断返回:
- 中断服务例程完成后,NVIC 会恢复中断之前的上下文并返回到中断前的程序位置。
示例代码
以下是一个简化的示例,说明如何在 ARM Cortex-M 中使用 NVIC:
c
深色版本
1#include <stdint.h>
2
3// 假设这是中断服务例程
4void isr_example(void) {
5 // ISR 的代码
6 // 处理中断事件
7}
8
9// 初始化 NVIC
10void init_nvic(void) {
11 // 启用中断
12 NVIC_EnableIRQ(Example_IRQn);
13
14 // 设置中断优先级
15 NVIC_SetPriority(Example_IRQn, 3); // 优先级为 3
16}
17
18int main(void) {
19 // 初始化 NVIC
20 init_nvic();
21
22 while (1) {
23 // 主程序循环
24 }
25}
26
27// 假设这是中断向量表中的中断服务例程入口
28extern void Example_IRQHandler(void);
29
30// 中断向量表
31void (* const g_pfnVectors[])(void) = {
32 // 其他中断向量...
33 [Example_IRQn] = &Example_IRQHandler,
34};
35
36// 中断服务例程入口
37void Example_IRQHandler(void) {
38 // 清除中断标志
39 // NVIC_ClearPendingIRQ(Example_IRQn);
40
41 // 调用 ISR
42 isr_example();
43
44 // 清除挂起的中断
45 NVIC_ClearPendingIRQ(Example_IRQn);
46}
总结
NVIC 是 ARM Cortex-M 系列微控制器中用于管理中断的关键组件。它支持嵌套中断、优先级处理、中断向量表等功能,使得 Cortex-M 微控制器能够高效地处理中断请求,提高系统的实时性和响应速度。