本节简单介绍 MSP430的中断处理系统
1 .可屏蔽中断
可屏蔽中断由具有中断能力的外围模块产生,包括处于定时器模式的看门狗定时器。每个可屏蔽中断都可以通过单独的中断允许位来使能。所有的可屏蔽中断都可以通过SR中的GIE位来使能。
如果GIE位置位,则打开可屏蔽中断模块,如果复位的话,就是把所有的可屏蔽中断都给屏蔽掉了,那么及时发生中断响应,也不会向CPU发送中断请求。
2 .可屏蔽中断响应时序
对于可屏蔽中断,当INTR引脚变为高电平,并IF=1且有足够的优先权,则在执行完当前指令后,CPU将发出下列中断响应周期时序。
我们来看这里,这里CPU通过引脚INTA 发中断响应信号,通知接口芯片开始准备中断类型号;
然后看这里,这里CPU再发INTA通知接口芯片将中断类型号送至数据总线上;
最后看这里,这里CPU从数据总线读取中断类型号,并完成前述的响应中断的过程。
3 .断点和中断现场
讲到中断,那就必然会涉及到一些名词,比如说:断点,中断现场。现在,咱们就来看看他们的定义。
首先是断点:是指CPU执行的现行程序被中断时的下一条指令的地址,又称断点地址。
然后是中断现场:是指CPU转去执行中断服务程序前的运行状态,包括CPU内部某些寄存器(如SR)的值和断点地址等。
4 .上电复位后的硬件初始化
中断延迟是6个周期,就是从CPU接收到外部发过来的中断请求之后,到它执行第一条指令大概是需要6个机器周期的。
中断逻辑的执行过程是这样的:
①完成当前正在执行的指令;
②把PC寄存器内容入栈;
③把SR寄存器内容入栈;
④如果同时有多个中断,则选择优先级最高的中断;
⑤如果中断是单源中断,则中断标志位自动复位;如果中断是多源中断,则需要中断服务程序复位;
⑥SR清零,结束低功耗模式。由于GIE被清除,其他的中断被屏蔽。因此,中断不能被嵌套;
⑦中断向量被装入PC寄存器,并从该地址开始执行中断服务程序。
在执行完了用户自己编写的中断服务程序以后,就通过一条RETI指令,就可以返回原来的主程序继续运行。
5 .中断返回过程
在从中断过程返回到主程序的过程大概需要花费5个周期。中断返回过程是这样子的:
首先就是状态寄存器从堆栈指针中弹出,这个在弹出的过程中,实际上它弹出的就是在运行主程序时状态寄存器的值。以前的GIE和CPUOFF都被恢复到以前的位置,比如说在进入中断之前,这个系统是处在低功耗0模式的话,从中断恢复以后还是处于低功耗0模式;GIE位在进入中断之前是被置位的,那么恢复中断以后还是被置位的。
然后程序指针也从堆栈中被取出来,被取出来之后CPU继续按照指针指向的代码执行下去。
6 .SFR中的中断控制位
大多数中断控制位、中断标志和中断允许位集中在少数SFR中。这些SFR以字节形式位于低地址区。SFR只能以字节指令访问。
MSP430各型号支持各个模块内的SFR。除了NMI,各模块中断源可以单独允许以实现中断功能及操作。配置位的完全软件控制使得应用软件在中断允许屏蔽时重新激活系统。
7 .中断向量表
在发生中断时,单片机实际上就是把中断向量的地址装入到程序指针PC中,然后程序指针从这个地址开始程序代码,这段程序代码就是用户自己编写的中断服务程序代码。
8 .中断控制机制
我们首先看到的是非屏蔽中断的控制机制,首先是中断请求,然后就是中断总控位,再经过优先权裁决,最后进行中断响应。、
其次就是可屏蔽中断的控制机制,首先同样是中断请求,然后是中断总控位,接着就不一样了,是GIE控制位,经过优先权裁决就是中断响应了。
这就是中断控制机制的过程。
9 .外部中断
端口P0、P1和P2的全部为8位都可实现外部事件的中断处理。每一个I/O位都可独立编程。
由于可能组合任意输入、输出和中断条件,因此能灵活适应不同的I/O结构。
注意:外部中断信号的最小脉冲宽度
所有外部中断信号必须具有至少1.5MCLK的脉冲宽度以保证稳定的中断响应,但是更窄的脉冲信号仍可能产生中断请求。
9.1 端口P0
P0模块安排了3个向量。P0.0的信号,P0.1的信号和其余端口P0.2-P0.7的信号是这三个向量的源。通过中断事件可将向量地址装入PC。
P0有六个I/O引脚的寄存器,分别是:
输入寄存器、输出寄存器、方向寄存器、中断标志、中断沿选择、中断允许。
9.2端口P1、P2
P1和P2完全相同。对P1和P2模块分配一个单独向量。引脚P1.0-P1.7和P2.0-P2.7可用作中断源。向量包含因中断事件引发装入PC的存储器地址。
P1和P2分别有7个寄存器用于控制I/O引脚,分别是:
输入寄存器、输出寄存器、方向寄存器、中断标志、中断沿选择、中断允许、功能选择寄存器。
10.程序中如何使用中断
10.1中断程序结构
10.2 中断程序
首先是关中断,然后设置相关的中断控制位等,接着就是中断子程序有关量的初始化,然后是开中断,好了,从这里进入了中断程序,进入中断后首先就是保护现场,以便以后恢复现场用,然后是完成中断源请求的任务,在清零中断标志,最后恢复现场就返回主程序,并进行其他工作的处理。
我们在写完主程序后,我们需要写我们的中断服务程序,我们拿来了一个定时中断的例子。
我们首先要做的就是让Timer_A初始化。这是将定时器初始化,这样我们后面才能进行定时中断。
再来是中断服务程序。首先,第一句是中断服务函数的起始句,是我们必须要写的,而TIMERA0_VECTOR则只是针对TimerA0的中断,它是对应于TimerA0的中断向量。如果是其他外设所引发的中断,这句话写法会不同。
例如#pragma vector=UART0RX_VECTOR是写针对串口的中断。
当我们写完中断服务函数的起始句之后,我们就需要写出我们自己要求中断执行的任务了,这个部分是我们自己写的内容,而其他部分,可以说是一个框架。