一、中断、异常
1.什么是中断,什么是异常
- 内核与总线以及外设

-
ARM Cortex-M4:32 位高性能嵌入式处理器内核,支持 Thumb-2 指令集,具备 100MHz 主频和可选的浮点运算单元(FPU),适用于需要数字信号处理(DSP)和实时控制的场景,如工业自动化、电机控制等。
-
JTAG & SW + ETM:JTAG(联合测试行动小组)和 SW(串行线调试)是调试接口,用于程序下载与硬件调试;ETM(嵌入式跟踪宏单元)则提供指令执行的实时跟踪功能,帮助开发者分析程序运行流程。
-
MPU(存储器保护单元):可选组件,可将存储器划分为多个区域并设置访问权限,防止程序非法访问关键内存,提升系统安全性。
-
NVIC(嵌套向量中断控制器):负责中断的优先级管理与嵌套处理,支持最多 240 个外部中断,能快速响应并执行中断服务程序,保障系统的实时性。
-
总线(D-BUS、I-BUS、S-BUS):采用哈佛架构的总线设计,D-BUS 用于数据访问,I-BUS 用于指令取址,S-BUS 用于系统外设访问,实现指令和数据的并行传输,提升处理效率。
以上所述(内核)都是由ARM公司提供,其他元件都属于片上外设。 而连接cpu与外设的就是 AHB bus-matrix总线(可以总裁)
-
异常是发生在内核里,打断执行流,一切都是异常。
-
而中断是CPU外部的突发事件(比如各种片上总线,AHB\APB等)促使内部发生异常的,叫做中断。它先找到NVIC,NVIC再造成cpu内部异常
-
CPU内部的异常时和CPU同步的,但是外部的中断,比如串口,是和COU异步的。
2.同步异常和异步异常
一、同步异常
-
触发时机 :与指令 执行同步,即异常在指令执行过程中或执行完毕时立即触发。
-
触发源 :主要来自CPU 内部 或程序行为,如:
-
图中CPU 的 "exception or trap":例如除法溢出、未定义指令、程序访问越界(需 MPU 配合检测)等,是程序执行逻辑导致的异常。
-
图中MPU 的 "fault":存储器保护单元检测到非法内存访问(如权限不足、地址越界)时,同步触发异常。
-
-
处理逻辑:通常由操作系统或运行时环境捕获后,进行错误修复、程序调试或异常终止等处理。
二、异步异常
-
触发时机 :与指令 执行异步,即异常可在任意时刻(与当前执行的指令无关)由外部事件触发。
-
触发源 :主要来自外部硬件,如图中的 **"Hardware interrupts"**(UART、IIC、SPI 等外设产生的中断),典型场景如:
-
外设数据收发完成(UART 接收中断)。
-
定时器超时(如系统调度时钟)。
-
外部中断引脚触发(如按键输入)。
-
-
处理逻辑 :操作系统通过中断控制器(如 NVIC)管理优先级,触发对应的中断服务程序(ISR),完成数据处理、事件响应等操作。

3.NVIC控制器
- 内核外设地址
一、NVIC 寄存器访问权限说明
-
权限分级 :ARM Cortex-M4 采用 ** 特权级(Privileged Mode)和用户级(User Mode)** 的权限架构:
-
多数 NVIC 寄存器仅能在特权级下访问,防止用户程序(非特权)非法修改中断配置,保障系统稳定性。
-
少数寄存器(如
NVIC_STIR)允许用户级访问,为特定场景下的用户程序触发中断提供了灵活度。
-
-
参考依据:《ARM® Cortex®-M4 Devices Generic User Guide》《Cortex®-M4 Technical Reference Manual》中 "NVIC registers and privilege access" 章节详细列举了各寄存器的访问权限,是开发中权限管理的权威依据。
4.中断向量表的圆整
一、定义:地址对齐的要求
中断向量表是存储中断服务程序 入口地址 的连续内存区域,"圆整" 指将其起始地址对齐到特定的字节边界 (如 256 字节、1024 字节等),本质是地址对齐(Address Alignment)。
假设内部异常中断加上外部中断有103个,每个占四字节,则需要412个字节,圆整就需要2的整次幂,则需要取512字节
二、中断向量表
1、向量表是什么
向量的表格,向量实际上表示的是一个地址,向量表包含了各种异常处理器异常处理的表格
(补充知识:函数是有地址的,函数名就是他的地址)
2、为什么需要向量表
-
加速中断响应当硬件(如键盘、定时器、网卡)触发中断时,CPU 需要立即知道该执行哪个处理程序(中断服务程序,ISR)。如果没有向量表,CPU 可能需要逐个查询所有硬件设备 "是谁触发了中断",效率极低(类似 "大海捞针")。而向量表通过 **"中断号→地址" 的直接映射 **,让 CPU 只需用中断号作为索引,直接从表中读取处理程序的入口地址,瞬间定位目标代码,大幅缩短响应时间(这也是 "向量" 一词的由来 ------ 像 "箭头" 一样直接指向目标)。
-
统一硬件与软件的交互标准不同硬件设备的中断触发逻辑不同(比如键盘中断和硬盘中断的触发信号完全不同),但向量表为所有中断源分配了唯一的 "中断号"(索引),软件只需根据中断号处理,无需关心硬件细节。例如,x86 架构中 "0 号中断" 固定对应 "除零异常","1 号中断" 对应 "调试异常",这种标准化让操作系统和应用程序能统一处理各类事件。
3、向量表储存在哪
这段链接器脚本通过以下配置揭示了中断向量表的存储位置:
-
脚本中明确将中断向量表(
KEEP(*(.isr_vector)))归属于.text代码段。 -
同时指定
.text段存储在FLASH中(} > FLASH)。 -
按照设计规范,向量表必须位于程序开始的地方,就像上表所示,代码一开始就要执行它
根据这张 ARM Cortex-M 系列的中断向量表,
复位后会执行以下流程:
-
初始化栈指针 :CPU 首先读取向量表第一个条目
__initial_sp,将栈指针(SP)设置到栈顶地址,为程序运行分配栈空间。 -
执行复位处理函数 :接着跳转到第二个条目
Reset_Handler,该函数会完成系统初始化(如硬件外设、时钟配置、全局变量初始化等),最终跳转到main函数,启动应用程序逻辑