中断

中断的概念:

中断是在程序的运行过程中,受到内部或者外部的相应,按照优先级执行程序(其中复位的优先级最高,详见数据手册——中断部分)

CC2530中断源的中断走向:
  1. 确定端口触发模式(PICTL)
  2. 判断中断是否触发(P?IFG)
  3. 打开端口位中断使能(P?IEN)
  4. 判断中断是否已经被处理(P?IF)
  5. 打开中断总开关(EA)
  6. 打开相应中断使能(IEN?)
  7. 由51内核进行处理
中断的基本配置:
  1. PICTI 中断边缘寄存器: 设置端口是输入上升引起中断,还是下降引起中断 0:上升 1:下降
  2. P?IFG 端口中断状态标志: 设置中断请求是否触发,没有触发为0,有触发,则相应位为1
  3. P?IEN 端口位中断屏蔽: 设置端口位的中断使能 0:禁止 1:使能
  4. P?IF 端口位中断标志: 设置中断是否被处理 0:未处理 1:已处理
  5. EA 中断总开关: 设置是否禁止所有中断 0:禁止 1:分别设置
  6. IEN? 端口中断使能: 设置端口的中断使能 0:禁止 1:使能
中断处理过程:

当中断被触发,交由51内核进行处理;在我们的RAM中,有一块空间专门用于存储中断向量表,中断向量表按照中断优先级将中断向量存储在这块空间中,一旦一个中断开始执行,只有其他优先级比它高的向量能把它打断;而我们的中断向量其实就是一个GO TO语句,直接指向相应中断服务函数的开头,当中断服务程序执行完毕后,再返回主函数的中断点,继续运行;

CC2530中断源走向

下面我们通过程序进行分析:

/***********************************************
* filename: Key_Interrupt.c
* writer  : geeknuo
* time    : 2017-1-21
* version : 1.0
* effect  : 按键中断实验
************************************************/
#include <ioCC2530.h>

//端口定义;
#define led P1_0  
#define key P0_1

/***********************************************
 * function name : delay_ms
 * function      : 延时函数,单位为毫秒
 * prarmeter     : n_ms 为延时时间,最大不超过65535 
 * returned value: 无
************************************************/
void delay_ms(unsigned int n_ms) 
{ 
    unsigned int i,j; 

    for(i = 0; i < n_ms; i++) 
        for(j = 0; j < 535; j++); 
}


/***********************************************
 * function name : LedInit
 * function      : 配置led相关寄存器并设置led初始状态
 * prarmeter     : 无
 * returned value: 无
************************************************/
void LedInit(void)
{
    P1DIR |= 0x01;  //P1_0设置为输出模式
    P1SEL &= ~0x01; //P1_0设置为通用IO

    led = 1;  //初始状态为熄灭;
}

/***********************************************
 * function name : KeyInit
 * function      : 配置key相关寄存器
 * prarmeter     : 无 
 * returned value: 无
************************************************/
void KeyInit(void)
{
    P0DIR &= ~0x02;  //P1_0设置为输入模式
    P0SEL &= ~0x02;  //P1_0设置为通用IO

    PICTL |= 0x01;  //设置输入下降沿引起中断
    P0IFG &= ~0x02;    //设置 P0_1 中断状态标志为0,没有触发
    P0IF = 0;       //设置 P0_1 中断标志为0,表示没有中断未处理
    P0IEN |= 0x02;  //打开 P0_1 的中断使能
    EA = 1;         //打开总开关
    IEN1 |= (1<<5); //打开端口的中断使能
}

//中断服务函数
#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void) 
{
    /*中断服务程序需要做的事情*/
    delay_ms(10);
    led = ~led;

    P0IFG = 0;  //清中断标志 
    P0IF = 0;   //清中断标志 
}

/***********************************************
 * function name : main
 * function      : 初始化LED和KEY,当检测到按键按下并松开时,改变led状态
 * prarmeter     : 无
 * returned value: 无
************************************************/
void main(void)
{
    LedInit(); //初始化LED
    KeyInit(); //初始化KEY

    while(1)
    {
    }
}

此程序实现的效果跟按键程序的效果是一样的,在按键程序中,我们采用的是轮询的方式进行判断,这里我们采用中断的方式来处理,整体应该还是比较容易理解的,只是这里涉及的寄存器相对较多,通过数据手册应该可以很快的理解;我们对中断服务函数再进行一下分析:

#pragma vector = P1INT_VECTOR
__interrupt void P1_ISR(void) 
{
    /*中断服务程序需要做的事情*/
}

/*************************************************
 * #pragma       //表示中断向量指向的地址
 * vector        //存放向量的变量
 * P1INT_VECTOR  //P1端口的中断向量地址
 * __interrupt   //将函数的首地址放入中断向量表中
 * P1_ISR        //相当于函数名
*************************************************/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值