[Zigbee] 4、ZigBee基础实验——中断

[复制链接]
1760|40
 楼主| functions 发表于 2020-1-5 17:43 | 显示全部楼层 |阅读模式
前言
  上一篇介绍了CC2530的IO的基础知识,并用LED的控制来展示如何配置并控制GPIO的输出,用KEY状态的读取实验来展示如何读取GPIO的状态。从上一节的KEY状态读取的代码看出是采用轮训方式的,这种方式是很浪费资源,本节将介绍一种中断方式来替换轮训的方案。

 楼主| functions 发表于 2020-1-5 17:44 | 显示全部楼层
一、中断

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

按键中断初始设置为:
  1. /****************************************************************************
  2. * 名    称: InitKey()
  3. * 功    能: 设置KEY相应的IO口,采用中断方式
  4. * 入口参数: 无
  5. * 出口参数: 无
  6. ****************************************************************************/
  7. void InitKey()
  8. {
  9.     P0IEN |= 0x2;    // P0.1 设置为中断方式 1:中断使能
  10.     PICTL |= 0x1;    //下降沿触发   
  11.     IEN1 |= 0x20;    //允许P0口中断;
  12.     P0IFG = 0x00;    //初始化中断标志位
  13.     EA = 1;          //打开总中断
  14. }
 楼主| 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 中断使能

348585e11b02c6b126.png

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

622855e11b032d1986.png
 楼主| functions 发表于 2020-1-5 17:45 | 显示全部楼层
使能中断时候,还需要配置中断方式,这里需要用到PICTRL寄存器(配置中断方式),代码第10行 PICTL |= 0x1;即为将端口0的8个引脚中断模式设置为下降沿触发。

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

748145e11b06e45f16.png

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

P0IEN: P0 中断使能
P1IEN: P1 中断使能
P2IEN: P2 中断使能
PICTL: P0、P1 和P2 触发沿设置
P0FG: P0 中断标志
P1IFG: P1 中断标志
P2IFG: P2 中断标志
 楼主| functions 发表于 2020-1-5 17:46 | 显示全部楼层
类似51单片机,中断发生时会触发相应的回调函数:

  1. /****************************************************************************
  2. * 名    称: P0_ISR(void) 中断处理函数
  3. * 描    述: #pragma vector = 中断向量,紧接着是中断处理程序
  4. ****************************************************************************/
  5. #pragma vector = P0INT_VECTOR   
  6. __interrupt void P0_ISR(void)
  7. {
  8.     DelayMS(10);     //延时去抖
  9.     LED1 = ~LED1;    //改变LED1状态
  10.     P0IFG = 0;       //清中断标志
  11.     P0IF = 0;        //清中断标志
  12. }
 楼主| functions 发表于 2020-1-5 17:47 | 显示全部楼层
二、代码主要逻辑

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

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

  9. typedef unsigned char uchar;
  10. typedef unsigned int  uint;

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


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

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

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

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

  63. /****************************************************************************
  64. * 程序入口函数
  65. ****************************************************************************/
  66. void main(void)
  67. {
  68.     InitLed();   //设置LED灯相应的IO口
  69.     InitKey();   //设置S1相应的IO口
  70.     while(1)
  71.     {
  72.     }
  73. }
 楼主| 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
pklong 发表于 2020-1-9 20:59 | 显示全部楼层
怎么添加到zigbee协议栈里  
touser 发表于 2020-1-9 20:59 | 显示全部楼层
学习zigbee一定要学嵌入式吗?
myiclife 发表于 2020-1-9 20:59 | 显示全部楼层
zigbee技术好学吗?  

评论

好学的  发表于 2020-1-12 16:39
uytyu 发表于 2020-1-9 21:00 | 显示全部楼层
为什么 用iaridepm打开zigbee实验例程会出现问题

评论

看看iar的版本和例程里用的是否一样  发表于 2020-1-12 16:39
iyoum 发表于 2020-1-9 21:00 | 显示全部楼层
谁有zigbee cc2530的zstack的SensorDemo实验例程  
jkl21 发表于 2020-1-9 21:00 | 显示全部楼层
zigbee组网的实验框图是什么?  
wwppd 发表于 2020-1-9 21:00 | 显示全部楼层
zigbee实验中cc2530EB中EB表示什么  

评论

Education Board  发表于 2020-1-12 16:40
maqianqu 发表于 2020-1-9 21:00 | 显示全部楼层
zigbee sample和simple有什么区别  
dspmana 发表于 2020-1-9 21:01 | 显示全部楼层
zigbee收发模块与zigbee标签的区别??
eefas 发表于 2020-1-9 21:01 | 显示全部楼层
怎么在ZigBee协议栈加入modbus协议  
maqianqu 发表于 2020-1-9 21:01 | 显示全部楼层
CC2530的zigbee模块怎样使用  
pklong 发表于 2020-1-9 21:01 | 显示全部楼层
zigbee CC2530实验例程。   
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

446

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部