博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【CC2530入门教程-03】CC2530的中断系统及外部中断应用
阅读量:4947 次
发布时间:2019-06-11

本文共 2862 字,大约阅读时间需要 9 分钟。

第3课  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、P1IFP2IF作为中断标志位,任何一个端口组上的引脚产生外部中断时,都会将对应端口组的中断标志自动置位。注意,外部中断标志必须在中断服务函数中手工清除,否则CPU会反复进入中断。 端口状态标志寄存器P0IFGP1IGFP2IFG,分别对应3个端口中各引脚的中断触发状态,当某引脚发生外部中断触发时,对应的标志位会自动置位,这个标志同样需要手工清除。

 

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

【1】设计外部中断初始化函数Init_INTP()

        外部中断初始化函数,主要是完成跟中断相关的特殊功能寄存器配置工作:

        <1> 配置IENx寄存器,使能端口组的中断功能。

        <2> 配置PxIEN寄存器,使能具体的外部中断引脚。

        <3> 配置PICTL寄存器,设置中断触发方式。

【2】设计外部中断服务函数Int1_Sevice()

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

【3】实训项目源代码及注释

1 #include "ioCC2530.h" 2  3 #define  LED6   P1_4 4 #define  LED3   P1_0 5 #define  LED4   P1_1 6 /*===================延时函数=========================*/ 7 void Delay(unsigned int t) 8 { 9   while(t--);10 }11 /*==================端口初始化函数=====================*/12 void Init_Port()13 {14   //将P1_0、P1_1和P1_4设置为通用I/O端口功能15   P1SEL &= ~0x13;   16   //将P1_0、P1_1和P1_4的端口传输方式设置为输出17   P1DIR |= 0x13;   18   LED6 = 0;19   LED3 = 0;20   LED4 = 0;21 }22 /*==================跑马灯子函数=====================*/23 void LED_Running()24 {25   LED3 = 1;26   Delay(50000);27   LED4 = 1;28   Delay(50000);29   LED3 = 0;30   Delay(50000);31   LED4 = 0;32   Delay(50000);33 }34 /*===============外部中断初始化函数==================*/35 void Init_INTP()36 {37   IEN2 |= 0x10;         //端口1中断使能38   P1IEN |= 0x04;        //端口P1_2外部中断使能39   PICTL |= 0x02;        //端口P1_0到P1_3下降沿触发 40   EA = 1;               //使能总中断41 }42 /*================外部中断1服务函数====================*/43 #pragma vector = P1INT_VECTOR     //外部中断1的向量入口44 __interrupt void Int1_Sevice()45 {46   LED6 = ~LED6;47 /*先清除引脚标志位,再清除端口标志位,否则会不断进入中断*/48   P1IFG &= ~ 0x04;        //软件清除P1_2引脚的标志位49   P1IF = 0;               //软件清除P1端口组的标志位50 }51 /*====================主函数==========================*/52 void main()53 {54   Init_Port();          //初始化通用I/O端口55   Init_INTP();          //初始化外部中断56   while(1)57   {58     LED_Running();     //跑马灯59   }60 }

 

转载于:https://www.cnblogs.com/ALittleBee/p/7072927.html

你可能感兴趣的文章
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
Does not contain a valid host;port authority解决方法
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
浙江大学PAT上机题解析之1008. Elevator (20)
查看>>
【软件工程】第一次阅读作业
查看>>
创建链表LinkedList
查看>>
页面底部的回到顶部的按钮实现
查看>>
APIs
查看>>
c# 判断是否为同一周
查看>>
Python函数篇(1)-函数中的形参与实参(已更新)
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
REST构架风格介绍:状态表述转移
查看>>
广告弹力球效果
查看>>