关于设计,生活和电子的二三事

走进MSP430(4)——MSP430外部中断

对于MSP所有常见系列,包括F1到F5,P1和P2口都是具有中断功能的,而且也只有这两组端口具有中断功能,P3及以上端口没有中断功能。控制端口功能的寄存器如下图:

P1、P2中断可选上升沿或下降沿中断。对于按键,一般会采用上拉方式:

对于这种按键,当按键按下时单片机端口检测到的是低电平,按键松开时由于上拉电阻作用,单片机端口会检测到高电平,因此中断可以设置为下降沿中断,即检测到按键端口出现由高到低的电平变化时产生中断。如果按键松开时是低电平,按键按下时是高电平,则需将端口设置为上升沿中断。
设置按键中断的方法很简单,设置对应的寄存器位即可。下面是一段示例程序,设置P1.3端口为下降沿中断,使用内部上拉,通过中断控制P1.0端口LED灯发光和熄灭。

#include <msp430.h>

int main(void)
{
    WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
    P1DIR |= BIT0;                            // Set P1.0 to output direction
    P1IE |=  BIT3;                            // P1.3 interrupt enabled
    P1IES |= BIT3;                            // P1.3 Hi/lo edge
    P1REN |= BIT3;							// Enable Pull Up on SW2 (P1.3)
    P1IFG &= ~BIT3;                           // P1.3 IFG cleared
                                          //BIT3 on Port 1 can be used as Switch2

    While(1);
}

// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
    P1OUT ^= BIT0;                            // P1.0 = toggle
    P1IFG &= ~BIT3;                           // P1.3 IFG cleared
}

在主函数中,跟P1.3中断相关的寄存器有三个,P1IE,P1IES,P1IFG。其中P1IE设置P1对应端口中断是否打开,P1IES设置对应端口是上升沿中断还是下降沿中断,P1IFG为P1对应端口中断标志位,产生中断后对应位会置为1,然后产生中断。在中断函数里需要检测P1IFG判断是哪个端口产生的中断,然后进行对应处理。
MSP420x2系列的中断向量表如下图:

中断产生时,程序会跳转到对应的中断地址,然后再跳转到对应的中断处理函数。上图可见,对应的中断地址中,每个中断只分配了两个字节Flash空间,因此这部分只能放置一条跳转指令,跳转到中断函数实际存在的位置进行处理。中断处理函数开头的#pragma是编译器定义,表示下面的程序是中断处理函数,后面的PORT1_VECTOR表示中断类型,这里PORT1_VECTOR代表是P1组端口的中断。这样,在上图的中断地址中存放的就是跳转到中断处理函数程序所在地址的汇编指令,然后在中断处理函数中进行处理。
在中断处理函数中,因为MSP430 LAUNCHPAD只有1个用户按键,因此没有进行按键终端判断,而是直接进行按键处理。但对于自己写的程序,需要在函数开始处添加判断。一个添加判断的中断处理函数如下:

// Port 1 interrupt service routine
#pragma vector=PORT1_VECTOR
__interrupt void Port_1(void)
{
if(P1IFG & BIT3)
    {
        P1OUT ^= BIT0;                            // P1.0 = toggle
        P1IFG &= ~BIT3;                           // P1.3 IFG cleared
    }
}

在按键处理函数中,需要将相应中断标志位清零。有些中断标志位不需要软件置零,在处理之后会有单片机硬件置零,但有些需要软件置零。为避免遗漏,最好在中断处理函数开头判断完成中断标志位后就对对应的标志位置零。因为中断是由对应中断标志位产生的,如果没有清零就有可能不断申请中断,导致程序处理异常。
对于多按键情况,如果按键多于16个,那么就没有办法全部连接到具有中断功能的端口上。可以使用下降沿中断方式,将所有按键连接上拉电阻的一端通过二极管连接到具有中断功能的端口上,如下图所示:

图中P3端口是没有中断功能的。当按键按下之后,将P3对应的引脚拉低。由于二极管单向导电性,P1.0也被拉低,通过P1端口产生中断。在中断程序中,先将P1.0中断标志位清零,然后检测P3端口是那个引脚被拉低,从而确定按键。为保证中断有效,二极管最好使用正向压降比较低的型号,如肖特基系列。
关于中断按键的更多用法,比如矩阵案件检测,自己想想怎么实现吧
其他的终端,比如串口中断,定时器中断,会在各自对应的模块部分介绍。
【本篇完】

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据