搜索
查看: 10219|回复: 21

【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

[复制链接]

9

主题

20

帖子

98

积分

注册会员

Rank: 2

积分
98
发表于 2013-9-3 09:53:20 | 显示全部楼层 |阅读模式
对于手上拥有一个2530开发板的Zstack初学者来说,最经常做的事情也许就是按下开发板上的某个按键,进行绑定或者远程控制另一个开发板上的LED的亮灭。自然而然地,大家都想知道这个过程是如何实现的,协议栈的按键处理函数在哪里,如果想自己设计开发板,假如按键接口和2530标准开发板不一样的话,又应当修改哪些参数才能保证按键能够起作用,这里我就来详细地解释一下。
按键的配置是在hal_key.c里实现的,在文件的顶端,我们能够找到如下的预编译内容:
/* SW_6 is at P0.1 */
#define HAL_KEY_SW_6_PORT   P0
#define HAL_KEY_SW_6_BIT    BV(1)
#define HAL_KEY_SW_6_SEL    P0SEL
#define HAL_KEY_SW_6_DIR    P0DIR

/* edge interrupt */
#define HAL_KEY_SW_6_EDGEBIT  BV(0)
#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE

/* SW_6 interrupts */
#define HAL_KEY_SW_6_IEN      IEN1  /* CPU interrupt mask register */
#define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */
#define HAL_KEY_SW_6_ICTL     P0IEN /* Port Interrupt Control register */
#define HAL_KEY_SW_6_ICTLBIT  BV(1) /* P0IEN - P0.1 enable/disable bit */
#define HAL_KEY_SW_6_PXIFG    P0IFG /* Interrupt flag at source */

对于具备大学英语水平的同学们来说,这些语句的含义并不难理解。这里是说Zstack协议栈的SW6按键被分配到了P0.1端口,下面所有的这些预编译内容都是为了保证按键被按下时,程序能够检测到并进行正确处理。我们看到这里的预编译内容涉及到了大量的寄存器,大家要适应Zstack的这一编码方式,习惯冗长的预编译命名(对于经常编写VC等高级语言代码的同学来说这也许并不算什么)。
好的,心急的同学也许已经迫不及待地想要开始修改了,我这里就列出我自己修改的将SW6分配到P0.7的配置代码:
/* SW_6 is at P0.7 */
#define HAL_KEY_SW_6_PORT   P0
#define HAL_KEY_SW_6_BIT    BV(7)
#define HAL_KEY_SW_6_SEL    P0SEL
#define HAL_KEY_SW_6_DIR    P0DIR

/* edge interrupt */
#define HAL_KEY_SW_6_EDGEBIT  BV(0)
#define HAL_KEY_SW_6_EDGE     HAL_KEY_FALLING_EDGE

/* SW_2 interrupts */
#define HAL_KEY_SW_6_IEN      IEN1  /* CPU interrupt mask register */
#define HAL_KEY_SW_6_IENBIT   BV(5) /* Mask bit for all of Port_0 */
#define HAL_KEY_SW_6_ICTL     P0IEN /* Port Interrupt Control register */
#define HAL_KEY_SW_6_ICTLBIT  BV(7) /* P0IEN - P0.6 enable/disable bit */
#define HAL_KEY_SW_6_PXIFG    P0IFG /* Interrupt flag at source */
如果对于以上配置有什么不很理解的地方我建议大家多去看看CC2530的说明文档,仔细理解每一个寄存器所起到的作用。对于嵌入式软件工程师来说,说明文档永远是最得力的帮手。
OK,在完成了以上配置之后,下面要关注的应该就是按键处理函数了,那么这个函数在哪呢?这里我们以Zstack协议栈的SampleSwitch工程为例,有一个文件我们要特别注意,这就是zcl_samplesw.c。这是应用层的源文件,对于广大Zstack协议栈开发者来说,以后对协议栈的修改很大一部分都是在这个文件中进行的。在这个文件中,找到这个函数:
static void zclSampleSw_HandleKeys( byte shift, byte keys )
{
  zAddrType_t dstAddr;
  (void)shift;  // Intentionally unreferenced parameter

  if ( keys & HAL_KEY_SW_1 )
  {
    // Using this as the "Light Switch"
#ifdef ZCL_ON_OFF
    zclGeneral_SendOnOff_CmdToggle( SAMPLESW_ENDPOINT, &zclSampleSw_DstAddr, false, 0 );
#endif
  }

  if ( keys & HAL_KEY_SW_2 )
  {
    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

    // Initiate an End Device Bind Request, this bind request will
    // only use a cluster list that is important to binding.
    dstAddr.addrMode = afAddr16Bit;
    dstAddr.addr.shortAddr = 0;   // Coordinator makes the match
    ZDP_EndDeviceBindReq( &dstAddr, NLME_GetShortAddr(),
                           SAMPLESW_ENDPOINT,
                           ZCL_HA_PROFILE_ID,
                           0, NULL,   // No incoming clusters to bind
                           ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,
                           TRUE );
  }

  if ( keys & HAL_KEY_SW_3 )
  {
  }

  if ( keys & HAL_KEY_SW_4 )
  {
    HalLedSet ( HAL_LED_4, HAL_LED_MODE_OFF );

    // Initiate a Match Description Request (Service Discovery)
    dstAddr.addrMode = AddrBroadcast;
    dstAddr.addr.shortAddr = NWK_BROADCAST_SHORTADDR;
    ZDP_MatchDescReq( &dstAddr, NWK_BROADCAST_SHORTADDR,
                       ZCL_HA_PROFILE_ID,
                       ZCLSAMPLESW_BINDINGLIST, bindingOutClusters,
                       0, NULL,   // No incoming clusters to bind
                       FALSE );
  }
}
聪明的同学一看就明白了,哦,原来如此简单啊,那我是不是只要这么添加就成了:
if ( keys & HAL_KEY_SW_6 )
{
   处理函数
}
没有错,杀人越货居家旅行必备的天下第一奇毒秘密配方已尽收你眼底了,哈哈OK,修改之后编译下载,大功告成,按下按键,等待见证奇迹的时刻。咦,咋什么反应都没???
呵呵,是不是有种想要砸电脑的感觉Zstack协议栈确实相当令人各种厌烦,除了以上的配置,还有两个要注意的地方。在hal_board_cfg.h文件中,有下面两句预编译语句:
/* S1 */
#define PUSH1_BV          BV(1)
#define PUSH1_SBIT         P0_1
这时你心想,这不是S1么,跟S6有毛的关系啊!咦,不对啊,Zstack默认的的SW6不是对应着P0.1么,怎么这里的S1也关联到P0.1去了。呵呵,这个其实是TI的不对了,确实这里的S1和刚才的SW6是一回事,就让我们尽情地对着TI的协议栈送上各种“美好的”问候词吧。在hal_key.c中,也可以看到:
if (HAL_PUSH_BUTTON1())
{
  keys |= HAL_KEY_SW_6;
}
是不是憋不住想骂人了,淡定淡定。我们把hal_board_cfg.h中的那两个预编译代码进行相应的修改:
/* S1 */
#define PUSH1_BV          BV(7)
#define PUSH1_SBIT         P0_7
编译下载,按下按键,此刻,屏幕缓缓变黑,最后留下一行颇有深意的文字:To be continued…
影迷们请尽情期待13年悬疑大剧的下一集

本文为与非网月光码头原创,未经允许谢绝转载。
更多内容请见:【深度分析Zigbee】Zigbee技术知多少?资深大牛对对碰
----------------------------

主讲嘉宾简 介:网名:月光码头。毕业于中国科学院电子学研究所,主要从事zigbee物联网方向的应用研究,尤其擅长TI RF芯片、和Silicon Lab  MCU芯片的使用。现就职于上海理滋芯片设计公司,任研发部门经理,主要从事智能家居产品的设计开发,拥有5年多的zigbee软硬件开发经验。
------------------
推荐技术讲座:
  听东北人讲天线:每周一个实例,个个经典!(CST仿真实践全包括)
【ADS学习小组】课程汇总(火烽主讲)
【HFSS学习小组】课程汇总(木木主讲)
回复

使用道具 举报

445

主题

1871

帖子

1万

积分

版主

Rank: 7Rank: 7Rank: 7

积分
14758
发表于 2013-9-3 17:46:52 | 显示全部楼层

RE:Zstack协议栈初窥(三)

仔细阅读、认真领会
回复 支持 反对

使用道具 举报

9

主题

20

帖子

98

积分

注册会员

Rank: 2

积分
98
 楼主| 发表于 2013-9-4 19:05:28 | 显示全部楼层

回复:Zstack协议栈初窥(三)

回复第 2 楼 于2013-09-03 17:46:52发表:
仔细阅读、认真领会

大哥太谦虚了
回复 支持 反对

使用道具 举报

84

主题

601

帖子

1903

积分

金牌会员

Rank: 6Rank: 6

积分
1903
发表于 2013-9-5 10:50:00 | 显示全部楼层

RE:【深度分析Zigbee】Zstack协议栈初窥(三)

第三讲开始啦
回复 支持 反对

使用道具 举报

0

主题

9

帖子

15

积分

新手上路

Rank: 1

积分
15
发表于 2013-9-20 21:32:59 | 显示全部楼层

RE:【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

认真的学习中……
回复 支持 反对

使用道具 举报

0

主题

82

帖子

157

积分

注册会员

Rank: 2

积分
157
发表于 2013-9-24 15:51:48 | 显示全部楼层

RE:【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

认真学习           
回复 支持 反对

使用道具 举报

0

主题

5

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2013-10-29 19:56:04 | 显示全部楼层

RE:【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

一口气看了3集,哈哈,休息一会,To be continued...
回复 支持 反对

使用道具 举报

0

主题

13

帖子

9

积分

新手上路

Rank: 1

积分
9
发表于 2013-10-31 20:03:19 | 显示全部楼层

回复:【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

好!!!!
回复 支持 反对

使用道具 举报

6

主题

55

帖子

85

积分

注册会员

Rank: 2

积分
85
发表于 2013-11-21 19:57:39 | 显示全部楼层

RE:【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

lllllllllccccccccuuuuuuuuu
回复 支持 反对

使用道具 举报

0

主题

10

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2013-12-1 21:34:34 | 显示全部楼层

回复:【深度分析Zigbee】第三讲:Zstack协议栈初窥(三)

三讲,好继续跟进
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /2 下一条

Archiver|手机版|小黑屋|RF技术社区

GMT+8, 2024-4-19 08:41 , Processed in 0.075495 second(s), 9 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表