前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CC2530基础实验二 外部中断实验

CC2530基础实验二 外部中断实验

作者头像
w候人兮猗
发布2020-07-01 17:34:00
1.3K0
发布2020-07-01 17:34:00
举报

####一、任务要求

使用SW1按键作为外部中断输入来控制流水灯效果的启停,即实验板通电后两个发光二极管以下述方式工作:

①通电后LED1和LED2都熄灭。 ②延时一段时间后LED1点亮。 ③延时一段时间后LED2点亮,此时LED1和LED2都处在点亮状态。 ④延时一段时间后LED1熄灭。 ⑤延时一段时间后LED2熄灭,此时LED1和LED2都处在熄灭状态。 ⑥返回步骤②循环执行。 ⑦在任何时间,当按下一次SW1按键后,便暂停流水灯效果,即两个LED灯保持SW1按键按下时的亮/灭状态。直到再按下一次SW1按键后,流水灯效果从暂停状态继续执行。

####二、什么是中断 “中断”即打断,是指CPU在执行当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理出现的紧急事务,处理结束后CPU自动返回到原先暂停的程序中去继续执行。这种程序在执行过程中由于外界的原因而被中间打断的情况称为中断。

中断使得计算机系统具备应对突发事件能力,提高了CPU的工作效率。如果没有中断系统,CPU就只能按照程序编写的先后次序,对各个外设进行依次查询和处理,即轮询工作方式。轮询方式貌似公平,但实际工作效率却很低,且不能及时响应紧急事件。 采用中断技术后,可以为计算机系统带来以下好处:

1)实现分时操作 速度较快的CPU和速度较慢的外设可以各做各的事情,外设可以在完成工作后再与CPU进行交互,而不需要CPU去等待外设完成工作,能够有效提高CPU的工作效率。 2)实现实时处理 在控制过程中,CPU能够根据当时情况及时做出反应,实现实时控制的要求。 3)实现异常处理 系统在运行过程中往往会出现一些异常情况,中断系统能够保证CPU及时知道出现的异常,以便CPU去解决这些异常,避免整个系统出现大的问题。

####三、中断的基本概念

1)主程序 在发生中断前,CPU正常执行的处理程序。 2)中断源 引起中断的原因,或是发出中断申请的来源。单片机一般具有多个中断源,如外部中断、定时/计数器中断或ADC中断等。 3)中断请求 中断源要求CPU提供服务的请求。例如ADC中断在进行ADC转换结束后,会向CPU提出中断请求,要求CPU读取A/D转换结果。中断源会使用某些特殊功能寄存器中的位来表示是否有中断请求,这些特殊位叫做中断标志位,当有中断请求出现时,对应标志位会被置位。 4)断点 CPU响应中断后,主程序被打断的位置。当CPU处理完中断事件后,会返回到断点位置继续执行主程序。 5)中断服务函数 CPU响应中断后所执行的相应处理程序,例如ADC转换完成中断被响应后,CPU执行相应的中断服务函数,该函数实现的功能一般是从ADC结果寄存器中取走并使用转换好的数据。 6)中断向量 中断服务程序的入口地址,当CPU响应中断请求时,会跳转到该地址去执行代码。 (4)中断嵌套和中断优先级 当有多个中断源向CPU提出中断请求时,中断系统采用中断嵌套的方式来依次处理各个中断源的中断请求,如下图所示

这里写图片描述
这里写图片描述

在中断嵌套过程中,CPU通过中断源的中断优先级来判断优先为哪个中断源服务。中断优先级高的中断源可以打断优先级低的中断源的处理过程,而同级别或低级别的中断源请求不会打断正在处理的中断服务函数,要等到CPU处理完当前的中断请求,才能继续响应后续中断请求。为便于灵活运用,单片机各个中断源的优先级通常是可以通过编程设定的。

####四、CC2530的中断源 如图:

这里写图片描述
这里写图片描述

(1)CC2530的中断源 CC2530具有18个中断源,每个中断源都由各自的一系列特殊功能寄存器来进行控制。18个中断源的描述如表3-1所示。 18个中断源可以根据需要来决定是否让CPU对其进行响应,只需要编程设置相关特殊功能寄存器便可,在后续学习过程中我们会逐步接触各个中断源的使用方法。 (2)CC2530中断源的优先级 CC2530将18个中断源划分成6个中断优先级组IPG0~IPG5,每组包含3个中断源,如表所示。

这里写图片描述
这里写图片描述

6个中断优先级组可以分别被设置成0~3级,即由用户指定中断优先级,其中0级属于最低优先级,3级为最高优先级。 同时,为保证中断系统正常工作,CC2530的中断系统还存在自然优先级,即: 如果多个组被设置成相同级别,则组号小的要比组号大的优先级高; 同一组中所包含的3个中断源,最左侧的优先级最高,最右侧的优先级最低。 要将6个中断优先级组设置成不同优先级别,使用的是IP0和IP1两个寄存器,两个寄存器的定义如表3-3所示。要为优先级组设置优先级别,可参照表3-4来分别配置IP0和IP1。

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

####五、中断初始化 中断初始化

1、CUP中断总开关 EA = 1; 2、对应的组开关 P0组的中断开关在 IEN1 的第5位 P1组的中断开关在 IEN2 的第4位 IEN2|=(3<<1); P2组的中断开关在 IEN2 的第1位 3、组内脚的开关 P0IEN、P1IEN、P2IEN 每个寄存器都有8位 4、选择上升沿还是下降沿

中断产生条件:

这里写图片描述
这里写图片描述

中断函数(P1产生中断)

代码语言:javascript
复制
#pragma vector = P1INT_VECTOR
__interrupt void P1()
{
    /*****************
        //代码
    *****************/
}

P0/P1/P2口中断向量
P0INT_VECTOR
P1INT_VECTOR
P2INT_VECTOR

T1定时器中断向量

串口0/串口1 发送中断向量
UTX0_VECTOR
UTX1_VECTOR

串口0/串口1 接收中断向量
URX0_VECTOR

中断标志位
PxIFG:每一组的中断标志位,P1IFG有8位分别对应P1口的8位。如P1_0产生中断,
P1IFG = 0x01;
PxIF::CPU的中断标志位,有P0IF、 P1IF、 P2IF。如P1_0产生中断,P1IF = 1;

P0IFG &= ~(1<<1) ;        //0000 0010
P0IF=0; 

P1中断的相关寄存器

代码语言:javascript
复制
PICTL
0表示上升沿,1表示下降沿
这里写图片描述
这里写图片描述
代码语言:javascript
复制
IEN2、IEN1
这里写图片描述
这里写图片描述
代码语言:javascript
复制
PxIEN
这里写图片描述
这里写图片描述

####六、代码

代码语言:javascript
复制
#include "ioCC2530.h" //引用CC2530头文件
#define LED1 (P1_0)     //LED1端口宏定义
#define SW1  (P1_2)     //SW1端口宏定义

/**************************************************************
函数名称:delay
功    能:软件延时
入口参数:time--延时循环执行次数
出口参数:无
返 回 值:无
**************************************************************/
void delay(unsigned int time)
{
    unsigned int i;
    unsigned char j;
    for(i = 0;i < time;i++)
        for(j = 0;j < 240;j++)
        {
            asm("NOP");//asm用来在C代码中嵌入汇编语言操作,汇
            asm("NOP");//编命令nop是空操作,消耗1个指令周期。
            asm("NOP");
        }
}

/**************************************************************
函数名称:main
功    能:程序主函数
入口参数:无
出口参数:无
返 回 值:无
**************************************************************/
void main(void)
{
    P1SEL &= ~0x05;         //设置P1_0口和P1_2为通用I/O口
    P1DIR |= 0x01;          //设置P1_0口为输出口
    P1DIR &= ~0x04;         //设置P1_2口为输入口

    P1INP &= ~0x04;         //设置P1_2口为上拉或下拉
    P2INP &= ~0x40;         //设置P1口所有引脚使用上拉

    LED1 = 0;               //熄灭LED1

    while(1)//程序主循环
    {
        if(SW1 == 0)            //如果按键被按下
        {
            delay(100);         //为消抖进行延时
            if(SW1 == 0)        //经过延时后按键仍旧处在按下状态
            {
                LED1 = ~LED1;   //反转LED1的亮灭状态
                while(!SW1);    //等待按键松开
            }
        }
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年3月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档