Cortex-M处理器中断向量表

本文详细解读了Cortex-M3的中断向量表结构,包括向量地址重定向、中断优先级控制、服务程序定位及中断处理流程。通过实例解析,展示了如何从BIN文件中读取和理解中断向量表,以及中断优先级的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 这是Cortex-M3手册里面截取出来的中断向量表:

系统复位后中断向量表始终是在0x00000000地址。
系统启动后可以对中断向量表进行重定向:
SCB->VTOR = vector_addr;

中断向量表可以看做一个uint32_t类型的数组,数组长度取决于芯片厂商定义多少个中断。
从IRQ0开始属于芯片厂商自定义的中断。

Cortex-M0最多32个中断
Cortex-M3/M4/M7最多240个中断

系统上电时:
第1个成员用于初始化SP寄存器
第2个成员用于初始化PC寄存器
其余成员都指向对应的中断处理程序的地址。

当发生中断的时候,MCU从中断向量表中找到该中断服务程序的地址,跳转过去。
跳转之前,MCU会自动完成部分寄存器的入栈,入栈顺序如下图所示。
中断服务程序返回时,MCU自动完成这部分寄存器的出栈。


关于中断优先级:

中断最多可以用8bit来控制优先级,且数值越小优先级越高
有三个特殊值:HardFault = -1、NMI=-2、RESET=-3
这8个bit又可以分成2组:抢占优先级和子优先级。
下图是优先级的分组方式:

抢占优先级高的,可以打断正在执行的低优先级中断,先执行高优先级中断。
抢占优先级相同的情况下,子优先级之间不会发生抢占。

当多个中断同时发生时,按照以下顺序比较优先级:
抢占优先级 -> 子优先级 -> 中断号


中断向量表实例:

中断向量表是在start.s里面定义好的,编译器会把它放到BIN文件的起始位置。
随便打开一个编译出来的BIN文件进行查看:

因为Cortex-M一般是小端格式,所以每4个字节要倒过来。
前4个字节就是0x1000EA68,它表示上电后的SP值。
接下来4个字节是0x00000101,它表示ResetHandler,它表示上电后的PC值。
PC=0x00000101,所对应的第一条指令就是0x5088F64E。

备注:
PC最低位为1表示是Thumb模式,并不是真实的地址偏移。
指令0x5088F64E的第[15:11]位为11110B,表示这是一条32位Thumb指令。

从这个文件我们还能反向推断出其它的信息:
ROM起始地址是0x00000000
RAM起始地址(可能)是0x10000000
目标MCU肯定不是Cortex-M0
这段代码可能使用了RTOS

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值