Running H/F 2
复位后被置位可以屏蔽所有的中断源。这样在清这一位以允许CPU 响应中断之前就可以让用户程序初始化堆
栈指针并执行其他系统设置。
当CPU 接收到一个有效的中断请求时,它在完成当前的指令以后响应此中断。中断的执行过程就像SWI
指令的一个周期一个周期的执行顺序一样,包括以下步骤:
• 在堆栈中保存CPU 寄存器;
• 将CCR 中的I 位置位来屏蔽中断;
• 取出当前等待的最高优先级的中断向量;
• 用从中断向量地址处取得的前三个字节的程序信息来填充指令队列;
当CPU 响应中断时,I 位自动置位以防止其他的中断进入而打断ISR( 称为嵌套中断)。通常状态下,当
CCR 恢复到进入ISR 前堆栈保留的值,I 位回复到0。在很特殊的情况下,处于ISR 时I 位可能会被中断清零
(清零后可以产生中断)让其他中断程序可以在不等待第一个中断服务程序结束后就先执行。这种做法不被推
荐,除非是非常有经验的编程人员,否则会导致一些难以调试的小程序错误。
中断服务程序由RTI 指令结束,用先前保存在堆栈中的值来恢复CCR、A、X 及PC 寄存器为中断前的
值。
注意
为了能够和HCS08 兼容,H 寄存器是不会自动的保存和恢复的。因此,好的编程
习惯是:在中断服务例程(ISR) 开始时将H 压栈,在ISR 返回指令RTI 前将其恢
复。
当I 位清零导致两个或更多中断挂起时,高优先级的中断首先响应(参见表 5-2)。
5.5.1
中断堆栈结构
图 5-1 显示了堆栈结构的内容和组织形式。中断之前,堆栈指针(SP) 指向堆栈的下一个可用的位置。
CPU 寄存器的当前值被储存在堆栈中。依次保存的是从程序计数器中低地址位(PCL) 开始到CCR 结束的部
分,在这些寄存器入栈以后,SP 指向堆栈中的下一个可用位置,这个地址是CCR 被保存的地址的低一个地
址。入栈的PC 值是主程序中的若中断没有发生所要执行的下一个指令的地址。
出栈顺序
低地址方向
7
0
中断入栈后的SP
中断入栈前的SP
5
4
3
2
1
1
2
3
4
5
CCR寄存器
累加器
*
变址寄存器的低字节X*
程序计数器的高字节
程序计数器的低字节
高地址方向
入栈顺序
*变址寄存器的高半字节(H)没有入栈
图 5-1. 中断堆栈框架
MC9S08AC16 系列微控制器数据手册, 第6 版
飞思卡尔半导体公司
#