在STM32微控制器中,当发生中断时,CPU会按照以下步骤将程序计数器(PC)指针跳转到中断服务程序的入口地址:
1. **中断请求(IRQ)触发**:当外部事件或内部事件触发中断请求时,中断控制器(NVIC)会接收到这个请求。
2. **保存当前状态**:CPU会立即保存当前执行状态,包括程序计数器(PC)的值、当前执行任务的寄存器值等,这些信息通常会被保存在堆栈中。
3. **查找中断向量**:CPU会根据中断类型(中断号)来查找中断向量表。中断向量表是一个存储了各个中断服务程序入口地址的数组,通常位于内存的固定位置(例如0x8000000开始的内存区域)。
4. **跳转到中断入口**:
- 对于STM32的标准启动模式,中断向量表通常位于内部Flash的起始地址(0x8000000)。
- CPU根据中断号在中断向量表中找到对应的中断服务程序的入口地址。
- 控制单元将PC指针设置为该中断服务程序的入口地址,然后跳转到该地址执行中断服务程序(ISR)。
具体步骤如下:
- **获取中断号**:STM32的中断号与中断向量表中的索引相对应。每个中断都有一个特定的索引,这个索引通常与中断号相同。
- **计算中断向量表中的入口地址**:中断向量表中每个条目都是32位,其中包含了对应中断服务程序的入口地址。中断入口地址计算公式通常是:`中断向量表起始地址 + (中断号 * 4)`(因为每个条目是4字节,即32位)。
- **跳转执行**:CPU将PC指针设置为计算出的中断服务程序入口地址,并开始执行ISR。
这个过程是自动进行的,由CPU的硬件机制控制,不需要用户编写额外的代码。中断处理完成后,CPU会从堆栈中恢复之前保存的状态,并返回到中断前的执行位置继续执行主程序。