[ CC2541 ] [ 2 ] 外部中断实验

电路原理图

在开发板上完成外部中断实验,首先需要看懂电路原理图:

image.png

从上面的原理图中不难看出,当按下按键会产生外部中断,P0IFG 寄存器为中断状态标志。

相关寄存器

然后,通过芯片手册查找相关寄存器。CC2541 外部中断需要配置 P0IEN、PICTL、P0IFG、IEN1 寄存器。外部中断寄存器说明如下表所示:

image.png

按照表格寄存器内容,对P1.0口进行配置,当P1.0输出高电平时 D1 被点亮。S1 按下时 P0.1 产生外部中断从而控制 LED1 的亮灭。

/****************************************************************************
* 名    称: InitLed()
* 功    能: 设置LED灯相应的IO口
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitLed(void)
{
    P1DIR |= 0x01;   //P1.0定义为输出口,输出3.3v电压
    LED1 = 0;        //LED1灯灭 
}

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置KEY相应的IO口,采用中断方式 
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey()
{
    P0IEN |= 0x02;    // P0.1 设置为中断方式 1:中断使能
    PICTL |= 0x02;    //下降沿触发   
    IEN1 |= 0x20;    //允许P0口中断; 
    P0IFG = 0x00;    //初始化中断标志位
    EA = 1;          //打开总中断
}

/****************************************************************************
* 名    称: P0_ISR(void) 中断处理函数 
* 描    述: #pragma vector = 中断向量,紧接着是中断处理程序
****************************************************************************/
#pragma vector = P0INT_VECTOR    
__interrupt void P0_ISR(void) 
{ 
    DelayMS(10);     //延时去抖
    LED1 = ~LED1;    //改变LED1状态
    P0IFG = 0;       //清中断标志 
    P0IF = 0;        //清中断标志 
}