打印
[Zigbee]

4、ZigBee基础实验——中断

[复制链接]
940|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
前言
  上一篇介绍了CC2530的IO的基础知识,并用LED的控制来展示如何配置并控制GPIO的输出,用KEY状态的读取实验来展示如何读取GPIO的状态。从上一节的KEY状态读取的代码看出是采用轮训方式的,这种方式是很浪费资源,本节将介绍一种中断方式来替换轮训的方案。

使用特权

评论回复

相关帖子

沙发
functions|  楼主 | 2020-1-5 17:44 | 只看该作者
一、中断

  电路依然没变,若要使用CC2530的外部中断需要使用P0IEN、PICTL、P0IFG、INE1寄存器。


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

使用特权

评论回复
板凳
functions|  楼主 | 2020-1-5 17:45 | 只看该作者
通用I/O 引脚设置为输入后,可以用于产生中断。中断可以设置在外部信号的上升或下降沿触发。P0、P1或P2 端口都有中断使能位,对位于IENl(端口中断使能寄存器)寄存器内的端口所有的位都是公共的,如下:所以代码中第11行允许P0口中断为IEN1 |= 0x20;(第5位)

IENI.P0 IE:P0 中断使能
IEN2.PI IE:P1 中断使能
IEN2.P2IE:P2 中断使能



  除了这些公共中断使能之外,每个端口的位都有位于SFR 寄存器P0IEN、P1IEN 和P2IEN(单独引脚中断使能寄存器)的单独的中断使能。即使配置为外设I/O 或通用输出的I/O 引脚使能时都有中断产生。因此代码第9行将P0IEN设置为P0IEN|=0x2;即为使能P01引脚的中断。

使用特权

评论回复
地板
functions|  楼主 | 2020-1-5 17:45 | 只看该作者
使能中断时候,还需要配置中断方式,这里需要用到PICTRL寄存器(配置中断方式),代码第10行 PICTL |= 0x1;即为将端口0的8个引脚中断模式设置为下降沿触发。

使用特权

评论回复
5
functions|  楼主 | 2020-1-5 17:46 | 只看该作者
当中断条件发生在I/O 引脚之一上面,P0-P2 中断标志寄存器P0IFG、P1IFG 或P2IFG(中断标志寄存器)中相应的中断状态标志将设置为1。不管引脚是否设置了它的中断使能位,中断状态标志都被设置。当中断已经执行,中断状态标志被清除,该标志写入0。因此代码中第12行P0IFG = 0x00; 是初始化中断标志位为0:、



  这个标志必须在清除CPU 端口中断标志(PxIF)之前被清除。用于中断的SFR 寄存器描述在下一节。寄存器总结如下:

P0IEN: P0 中断使能
P1IEN: P1 中断使能
P2IEN: P2 中断使能
PICTL: P0、P1 和P2 触发沿设置
P0FG: P0 中断标志
P1IFG: P1 中断标志
P2IFG: P2 中断标志

使用特权

评论回复
6
functions|  楼主 | 2020-1-5 17:46 | 只看该作者
类似51单片机,中断发生时会触发相应的回调函数:

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

使用特权

评论回复
7
functions|  楼主 | 2020-1-5 17:47 | 只看该作者
二、代码主要逻辑

  经过上面讲解,代码主要逻辑已经比较容易理解——在配置好KEY端口的中断之后,一旦按键被按下,会产生下降沿电平,触发P0中断,进入P0_ISR回调函数。在回调函数中对LED状态进行控制,并清除中断标志位。

/****************************************************************************
* 文 件 名: main.c
* 作    者: Andy
* 修    订: 2013-01-08
* 版    本: 1.0
* 描    述: 通过按键S1产生外部中断改变LED1状态
****************************************************************************/
#include <ioCC2530.h>

typedef unsigned char uchar;
typedef unsigned int  uint;

#define LED1 P1_0       // P1.0口控制LED1
#define KEY1 P0_1       // P0.1口控制S1


/****************************************************************************
* 名    称: DelayMS()
* 功    能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久
* 出口参数: 无
****************************************************************************/
void DelayMS(uint msec)
{
    uint i,j;
   
    for (i=0; i<msec; i++)
        for (j=0; j<535; j++);
}

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

/****************************************************************************
* 名    称: InitKey()
* 功    能: 设置KEY相应的IO口,采用中断方式
* 入口参数: 无
* 出口参数: 无
****************************************************************************/
void InitKey()
{
    P0IEN |= 0x2;    // P0.1 设置为中断方式 1:中断使能
    PICTL |= 0x1;    //下降沿触发   
    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;        //清中断标志
}

/****************************************************************************
* 程序入口函数
****************************************************************************/
void main(void)
{
    InitLed();   //设置LED灯相应的IO口
    InitKey();   //设置S1相应的IO口
    while(1)
    {
    }
}

使用特权

评论回复
8
functions|  楼主 | 2020-1-5 17:48 | 只看该作者
三、链接

Zigbee系列:

[ZigBee] 1、 ZigBee简介   https://bbs.21ic.com/icview-2894000-1-1.html

[ZigBee] 2、 ZigBee开发环境搭建   https://bbs.21ic.com/icview-2894002-1-1.html

[ZigBee] 3、ZigBee基础实验——GPIO输出控制实验-控制Led亮灭   https://bbs.21ic.com/icview-2894004-1-1.html

使用特权

评论回复
9
pklong| | 2020-1-9 20:59 | 只看该作者
怎么添加到zigbee协议栈里  

使用特权

评论回复
10
touser| | 2020-1-9 20:59 | 只看该作者
学习zigbee一定要学嵌入式吗?

使用特权

评论回复
11
myiclife| | 2020-1-9 20:59 | 只看该作者
zigbee技术好学吗?  

使用特权

评论回复
评论
dirtwillfly 2020-1-12 16:39 回复TA
好学的 
12
uytyu| | 2020-1-9 21:00 | 只看该作者
为什么 用iaridepm打开zigbee实验例程会出现问题

使用特权

评论回复
评论
dirtwillfly 2020-1-12 16:39 回复TA
看看iar的版本和例程里用的是否一样 
13
iyoum| | 2020-1-9 21:00 | 只看该作者
谁有zigbee cc2530的zstack的SensorDemo实验例程  

使用特权

评论回复
14
jkl21| | 2020-1-9 21:00 | 只看该作者
zigbee组网的实验框图是什么?  

使用特权

评论回复
15
wwppd| | 2020-1-9 21:00 | 只看该作者
zigbee实验中cc2530EB中EB表示什么  

使用特权

评论回复
评论
dirtwillfly 2020-1-12 16:40 回复TA
Education Board 
16
maqianqu| | 2020-1-9 21:00 | 只看该作者
zigbee sample和simple有什么区别  

使用特权

评论回复
17
dspmana| | 2020-1-9 21:01 | 只看该作者
zigbee收发模块与zigbee标签的区别??

使用特权

评论回复
18
eefas| | 2020-1-9 21:01 | 只看该作者
怎么在ZigBee协议栈加入modbus协议  

使用特权

评论回复
19
maqianqu| | 2020-1-9 21:01 | 只看该作者
CC2530的zigbee模块怎样使用  

使用特权

评论回复
20
pklong| | 2020-1-9 21:01 | 只看该作者
zigbee CC2530实验例程。   

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝