发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印

【CC2530入门教程-03】CC2530的中断系统及外部中断应用

[复制链接]
3585|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ohy3686|  楼主 | 2017-6-26 14:09 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ohy3686 于 2017-6-26 14:11 编辑

【CC2530入门教程-03】CC2530的中断系统及外部中断应用


一、中断相关的基础概念

    内核外设之间的主要交互方式有两种:轮询中断。 轮询的方式貌似公平,但实际工作效率很低,且不能及时响应紧急事件;中断系统使得内核具备了应对突发事件的能力。
    在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行。 这种程序在执行过程中由于外界的原因而被中间打断的情况,称为中断。
    两个重要的概念:
    <1> 中断服务函数: 内核响应中断后执行的相应处理程序。
    <2> 中断向量:中断服务程序的入口地址。每个中断源都对应一个固定的入口地址。当内核响应中断请求时,就会暂停当前的程序执行,然后跳转到该入口地址执行代码。


二、CC2530的中断系统
        CC2530具有18个中断源,每个中断源都由各自的一系列特殊功能寄存器来进行控制。可以编程设置相关特殊功能寄存器,设置18个中断源的优先级以及使能中断申请响应等。我们常用的中断源有下面几个:



三、CC2530的中断处理函数编写方法

       中断服务函数与一般自定义函数不同,有特定的书写格式:


<1> 在每一个中断服务函数之前,都要加上一句起始语句:
    #pragma vector = <中断向量>
    <中断向量>表示接下来要写的中断服务函数是为那个中断源服务的,该 语句有两种写法:
    #pragma  vector = 0x7B    或者    #pragma  vector = P1INT_VECTOR
    前者是中断向量的入口地址,后者是头文件“ioCC2530.h”中的宏定义。
<2> __interrupt关键字表示该函数是一个中断服务函数,<函数名称>可以 自定义,函数体不能带有参数,也不能有返回值。

四、CC2530的外部中断
       CC2530的P0、P1和P2端口中的每个引脚都具有外部中断输入功能,要使某些引脚具有外部中断功能,需要对IENx寄存器PxIEN寄存器PICTL寄存器进行适当的设置。 除了各个中断源都有自己的中断使能开关之外,中断系统还有一个总开关,可以同“EA = 1;”来打开总中断。
    P0、P1和P2端口分别使用P0IF、P1IF和P2IF作为中断标志位,任何一个端口组上的引脚产生外部中断时,都会将对应端口组的中断标志自动置位。注意,外部中断标志必须在中断服务函数中手工清除,否则CPU会反复进入中断。 端口状态标志寄存器P0IFG、P1IGF和P2IFG,分别对应3个端口中各引脚的中断触发状态,当某引脚发生外部中断触发时,对应的标志位会自动置位,这个标志同样需要手工清除。


五、实训案例:外部中断输入控制LED灯

【1】设计外部中断初始化函数Init_INTP()
    外部中断初始化函数,主要是完成跟中断相关的特殊功能寄存器配置工作:
    <1> 配置IENx寄存器,使能端口组的中断功能。
    <2> 配置PxIEN寄存器,使能具体的外部中断引脚。
    <3> 配置PICTL寄存器,设置中断触发方式。


【2】设计外部中断服务函数Int1_Sevice()
    在编写中断服务函数的时候,书写格式要正确,中断向量不能搞错。特别要注意:在函数里面把端口组和引脚的标志位清除,否则CPU将会反复进入中断,必须先清除引脚标志位PxIFG,再清除端口组标志位PxIF


【3】实训项目源代码及注释
#include "ioCC2530.h"

#define  LED6   P1_4
#define  LED3   P1_0
#define  LED4   P1_1
/*===================延时函数=========================*/
void Delay(unsigned int t)
{
  while(t--);
}
/*==================端口初始化函数=====================*/
void Init_Port()
{
  //将P1_0、P1_1和P1_4设置为通用I/O端口功能
  P1SEL &= ~0x13;   
  //将P1_0、P1_1和P1_4的端口传输方式设置为输出
  P1DIR |= 0x13;   
  LED6 = 0;
  LED3 = 0;
  LED4 = 0;
}
/*==================跑马灯子函数=====================*/
void LED_Running()
{
  LED3 = 1;
  Delay(50000);
  LED4 = 1;
  Delay(50000);
  LED3 = 0;
  Delay(50000);
  LED4 = 0;
  Delay(50000);
}
/*===============外部中断初始化函数==================*/
void Init_INTP()
{
  IEN2 |= 0x10;         //端口1中断使能
  P1IEN |= 0x04;        //端口P1_2外部中断使能
  PICTL |= 0x02;        //端口P1_0到P1_3下降沿触发
  EA = 1;               //使能总中断
}
/*================外部中断1服务函数====================*/
#pragma vector = P1INT_VECTOR     //外部中断1的向量入口
__interrupt void Int1_Sevice()
{
  LED6 = ~LED6;
/*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/
  P1IFG &= ~ 0x04;        //软件清除P1_2引脚的标志位
  P1IF = 0;               //软件清除P1端口组的标志位
}
/*====================主函数==========================*/
void main()
{
  Init_Port();          //初始化通用I/O端口
  Init_INTP();          //初始化外部中断
  while(1)
  {
    LED_Running();     //跑马灯
  }
}

打赏榜单

dirtwillfly 打赏了 10.00 元 2017-06-26
理由:支持一下

相关帖子

沙发
dirtwillfly| | 2017-6-26 20:22 | 只看该作者

使用特权

评论回复
板凳
dirtwillfly| | 2017-6-26 20:24 | 只看该作者
建议建个专门的索引贴

使用特权

评论回复
地板
pklong| | 2017-6-26 23:02 | 只看该作者

使用特权

评论回复
5
ohy3686|  楼主 | 2017-6-27 18:26 | 只看该作者

第一次在21ic论坛收到打赏,太太太高兴了。

使用特权

评论回复
6
ohy3686|  楼主 | 2017-6-27 18:32 | 只看该作者
dirtwillfly 发表于 2017-6-26 20:24
建议建个专门的索引贴

这个可以有,整理完CC2530单片机应用部分,有时间的话,还可以整理一下点对点通信和无线Zigbee组网部分。

使用特权

评论回复
7
dirtwillfly| | 2017-6-27 20:13 | 只看该作者
ohy3686 发表于 2017-6-27 18:32
这个可以有,整理完CC2530单片机应用部分,有时间的话,还可以整理一下点对点通信和无线Zigbee组网部分。 ...


期待你的作品

使用特权

评论回复
8
pixhw| | 2017-6-28 17:20 | 只看该作者
写的内容很详细。

使用特权

评论回复
9
pixhw| | 2017-6-28 17:20 | 只看该作者
写的内容很详细。

使用特权

评论回复
10
pixhw| | 2017-6-28 17:26 | 只看该作者
可以录个视频放到公开课去。

使用特权

评论回复
11
ohy3686|  楼主 | 2017-6-28 17:35 | 只看该作者
pixhw 发表于 2017-6-28 17:26
可以录个视频放到公开课去。

嗯...暑假有时间可以做这个事情。

使用特权

评论回复
12
ohy3686|  楼主 | 2017-7-2 15:34 | 只看该作者
系列教材完成。

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:广东职业技术学院 欧浩源(ohy3686@foxmail.com)    [Zigbee技术&物联网应用] 群:168225322    [技术交流微信]:gzyohy (暗号:宝塔镇河妖)

322

主题

899

帖子

3027

粉丝