Zigbee协议栈学习实例

本文通过一个简单的按键控制LED闪烁的例子,详细解释了如何在Zigbee协议栈中实现这一功能,涉及宏定义、初始化配置、按键回调函数及事件处理流程,帮助读者深入理解Zigbee协议栈的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前Zstack协议栈的工作原理已经讲过了,这次来一发应用举例的帮助大家理解,实验内容很简单,就是按键控制LED小灯闪烁,用的是CC2530的电路板,如果是裸机控制,过程相当简单,只要查询是否有按键按下,然后执行小灯闪烁的操作就可以了,或者用中断也可以。但是如果放到了协议栈当中,过程会复杂些,也就是之前所说的工作原理。

在添加自己的函数或者命令行之前,我们要做的最最重要的事情就是宏定义,比如按键的端口,小灯的端口,用的板子的型号等等。诸如此类的宏定义在嵌入式开发中是家常便饭思密达,因为本人使用的板子是宅基地购买的,所以宏定义大多都是HoneyGeek_V2之类的。在修改代码之前,先要有个大概的思路,那些文件里的代码是要做修改的,比如这次是用到按键和小灯,那么hal_key.c和hal_key.h,hal_board_cfg.h等一些和按键、小灯有关的.c和.h文件都要看一下。我们先看hal_board_cfg.h文件,在LED Configuration下面看到#define HAL_NUM_LEDS这句定义,很明显要改,我用的HoneyGeek_V2的板子只有一个LED所以在后面添加|| defined (HoneyGeek_V2)。

if defined (FS2530)|| defined (HAL_BOARD_CC2530EB_REV17) && !defined (HAL_PA_LNA) && !defined (HAL_PA_LNA_CC2590)

#define HAL_NUM_LEDS 3

elif defined (HAL_BOARD_CC2530EB_REV13) || defined (HAL_PA_LNA) || defined (HAL_PA_LNA_CC2590)|| defined (HoneyGeek_V2)

#define HAL_NUM_LEDS 1

else

#error Unknown Board Indentifier

endif

再往下看,看到对LED1的定义,也就是LED1的PIN和PORT的一些设置,我们可以这样改:

ifdef HoneyGeek_V2

/* 1 - Green */
#define LED1_BV BV(3)
#define LED1_SBIT P0_3
#define LED1_DDR P0DIR
#define LED1_POLARITY ACTIVE_HIGH

elif defined (HAL_BOARD_CC2530EB_REV17)

#define LED1_BV BV(0)
#define LED1_SBIT P1_0
#define LED1_DDR P1DIR
#define LED1_POLARITY ACTIVE_HIGH

endif

再往下,看到一块Push Button Configuration的部分,显然是按键配置:

ifdef HoneyGeek_V2

#define PUSH1_BV BV(2)
#define PUSH1_SBIT P1_2

else

/* S1 */
#define PUSH1_BV BV(1)
#define PUSH1_SBIT P0_1

endif

再往下看,找到Board Initialization我们也要修改:

elif defined (HoneyGeek_V2)

define HAL_BOARD_INIT()

{
……

HAL_TURN_OFF_LED1();
LED1_DDR |= LED1_BV;

/* configure tristates */
P1INP |= PUSH1_BV;
}

这部分代码就是内部时钟的初始化,后面两行是小灯和按键的设置,要改成相应的端口数值。接下来看hal_key.c文件,对按键再配置一下:

ifdef HoneyGeek_V2

/* SW_6 is at P1.2 */

define HAL_KEY_SW_6_PORT P1

define HAL_KEY_SW_6_BIT BV(2)

define HAL_KEY_SW_6_SEL P1SEL

define HAL_KEY_SW_6_DIR P1DIR

本例子中其他部分无需修改宏定义了。那么,完成前期的宏定义之后,就可以修改后面的命令行,来实现自己要的功能了。在osal_system_start(0函数里是没有任何与按键相关的信息的,这说明在之前的函数里就已经有相关的命令了。首先,看到HAL_BOARD_INIT()函数,GOTO一下发现是Board Initialization,上面已经说过了。然后,InitBoard( OB_COLD )函数点进去看发现HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback)这个配置函数,明显这个函数是按键配置函数,输入参数一个是知否中断的宏定义值,还有一个是按键回调函数,那么这个回调函数又能实现什么功能呢?来看一下这个函数:

void OnBoard_KeyCallback ( uint8 keys, uint8 state )
{
uint8 shift;
(void)state;

shift = (keys & HAL_KEY_SW_6) ? true : false;

if ( OnBoard_SendKeys( keys, !shift ) != ZSuccess )
{
// Process SW1 here
if ( keys & HAL_KEY_SW_1 ) // Switch 1
{
}
// Process SW2 here
if ( keys & HAL_KEY_SW_2 ) // Switch 2
{
}
// Process SW3 here
if ( keys & HAL_KEY_SW_3 ) // Switch 3
{
}
// Process SW4 here
if ( keys & HAL_KEY_SW_4 ) // Switch 4
{
}
// Process SW5 here
if ( keys & HAL_KEY_SW_5 ) // Switch 5
{
}
// Process SW6 here
if ( keys & HAL_KEY_SW_6 ) // Switch 6
{
}
}
}

关键是看if ( OnBoard_SendKeys( keys, !shift ) != ZSuccess )这句话,因为他又嵌套了一个函数OnBoard_SendKeys( keys, !shift ),那让我们看看它又是做什么的吧!

uint8 OnBoard_SendKeys( uint8 keys, uint8 state )
{
keyChange_t *msgPtr;

if ( registeredKeysTaskID != NO_TASK_ID )
{
// Send the address to the task
msgPtr = (keyChange_t *)osal_msg_allocate( sizeof(keyChange_t) );
if ( msgPtr )
{
msgPtr->hdr.event = KEY_CHANGE;
msgPtr->state = state;
msgPtr->keys = keys;

  osal_msg_send( registeredKeysTaskID, (uint8 *)msgPtr );
}
return ( ZSuccess );

}
else
return ( ZFailure );
}

这个函数内部关键就是osal_msg_send( registeredKeysTaskID, (uint8 )msgPtr ),这个函数就不展开了,先看registeredKeysTaskID,这个是注册的按键任务ID号,是多少呢?在应用层已经定义好了,RegisterForKeys( PuppyApp_TaskID )就是这个函数啦!把应用层的任务ID号给了按键的任务ID号,osal_msg_send( registeredKeysTaskID, (uint8 )msgPtr )中有个osal_set_event( destination_task, SYS_EVENT_MSG ),就是设置应用层的任务事件,然后轮询的过程中就会通知应用层有事件要处理了,应用层就调用PuppyApp_ProcessEvent( uint8 task_id, UINT16 events )函数,然后因为是KEY_CHANGE事件,所以执行PuppyApp_HandleKeys()函数,在这个函数里会判断是哪个按键触发的,我的实验用的是按键6,所以:

if ( keys & HAL_KEY_SW_6 )
{
PuppyApp_SendTheMessage();
HalLedBlink(HAL_LED_1,10,50,800);
}

这个命令就是让小灯闪烁10次。说到这里,大家有没有疑问呢?我按键的时候系统怎么知道我按了?嘿嘿,在这个函数HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback)中有个osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE)函数,就是再过一段时间后触发HAL_KEY_EVENT事件,这次的事件是给硬件层的,所以我们找到硬件层处理函数Hal_ProcessEvent( uint8 task_id, uint16 events ):

if (events & HAL_KEY_EVENT)
{

if (defined HAL_KEY) && (HAL_KEY == TRUE)

/* Check for keys */
HalKeyPoll();

/* if interrupt disabled, do next polling */
if (!Hal_KeyIntEnable)
{
  osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
}

endif // HAL_KEY

return events ^ HAL_KEY_EVENT;

}

这里执行了HalKeyPoll()然后又是一次osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100),也就是说每隔100毫秒系统都会接收到一个HAL_KEY_EVENT要处理,反复的来检查是否有按键被按下,如果有按键被按下,就会去执行回调函数,然后按照上面的顺序来点亮小灯。整个过程就是这样啦!可能说的不太清楚,不过大家推敲一下肯定OK的啦!

目录 第1章 ZigBee技术概述 1.1 ZigBee技术的演变与进展1 1.1.1 ZigBee技术的由来2 1.1.2 ZigBee技术的发展历程2 1.2 ZigBee技术特点5 1.3 ZigBee2007/PRO特性6 1.3.1 ZigBeeZigBee PRO比较6 1.3.2 不同ZigBee版本的兼容分析8 1.4 ZigBee无线网络使用频谱和ISM开放频带16 1.5 ZigBee技术的广阔应用前景17 第2章 低功耗微控制器MSP430与ZigBee芯片CC2520 2.1 低功耗微控制器MSP43022 2.1.1 关键特性22 2.1.2 MSP430模块化架构23 2.1.3 16位RISC先进CPU24 2.1.4 超低功耗性能25 2.1.5 灵活的时钟系统26 2.1.6 智能外设27 2.1.7 MSP430应用29 2.2 MSP430F2618简介29 2.2.1 MSP430F2xxx介绍30 2.2.2 MSP430F2618特性30 2.3 ZigBee芯片CC252031 2.3.1 CC2520的特性32 2.3.2 CC2520引脚描述34 2.3.3 CC2520与CC2420的区别35 2.3.4 CC2520典型设计36 第3章 ZigBee无线网络多功能开发系统 3.1 无线网络ZigBee开发系统平台选择39 3.1.1 如何选择嵌入式无线开发工具和平台40 3.1.2 需要的设备和必要条件42 总结43 3.2 多功能可视化ZigBee无线网络开发系统C51RF3PK44 3.2.1 C51RF3PK仿真器44 3.2.2 网络液晶扩展板45 3.2.3 C51RF3PK电池板51 3.2.4 ZigBee模块53 3.3 图形化ZigBee2007开发系统56 3.3.1 ZigBee模块CC252057 3.3.2 网络液晶扩展板58 3.4 ZigBee软件集成开发平台63 3.4.1 IAR集成开发环境的安装65 3.4.2 添加文件或新建程序文件72 3.4.3 设置工程选项参数74 3.4.4 编译、链接、下载78 3.4.5 仿真调试79 第4章 ZigBee开发入门 4.1 认识ZigBee协议栈88 4.2 ZigBee网络数据传输90 4.2.1 实验目的90 4.2.2 ZigBee数据传输原理解析90 4.2.3 实验设备准备110 4.3 ZigBee协议栈编译/下载111 4.3.1 设备选择及设置111 4.3.2 编译/下载程序112 4.4 ZigBee源代码剖析113 4.4.1 发送一个信息包113 4.4.2 收发数据过程113 4.4.3 接收一个信息包116 4.5 实验流程117 4.5.1 流程图117 4.5.2 路由器代码118 4.5.3 协调器代码120 4.6 ZigBee分析仪分析ZigBee数据包121 4.6.1 协议分析仪121 4.6.2 ZigBee数据格式122 4.6.3 加入网络数据分析125 4.6.4 收发数据分析126 4.7 实验效果128 第5章 ZigBee无线网络开发进阶 5.1 ZigBee协议栈结构129 5.2 ZigBee协议栈实时操作系统132 5.2.1 OS术语介绍132 5.2.2 OSAL API介绍133 5.2.3 OSAL任务142 5.3 ZigBee2006应用接口144 5.3.1 实验目的144 5.3.2 原理介绍144 5.3.3 软件准备SAPI介绍145 5.4 网络形成145 5.4.1 协调器格式化网络146 5.4.2 路由器和终端设备加入网络146 5.4.3 ZDO_StartDevice147 5.5 绑定148 5.5.1 绑定表格149 5.5.2 绑定建立151 5.5.3 绑定解除156 5.6 命令156 5.6.1 命令定义及使用156 5.6.2 串159 5.6.3 ZCL介绍159 5.6.4 Profile介绍160 5.7 灯光控制实验165 5.7.1 APP函数分析165 5.7.2 灯光控制实验过程176 5.7.3 实验总结178 5.8 无线温度传感器实验179 5.8.1 设备179 5.8.2 命令180 5.8.3 发现和绑定180 5.8.4 数据包发送和接收181 第6章 ZigBee2007/PRO入门 6.1 ZigBee2007/PRO入门实验185 6.2 实验设备185 6.2.1 硬件介绍185 6.2.2 硬件组成186 6.3 实验基础知识186 6.3.1 ZigBee2007简介186 6.3.2 ZigBee2007/PRO协议栈简介187 6.3.3 ZigBee设备在Zstack中的体现189 6.4 实验内容191 6.4.1 建立任务192   6.4.2 按键处理函数197   6.4.3 发送函数198   6.4.4 接收处理函数200  6.5 实验步骤和结果200   6.5.1 建立网络200   6.5.2 路由设备加入网络202   6.5.3 发送数据203   6.5.4 退出小组203   6.5.5 加入小组203  6.6 实验拓展204   6.6.1 项目分析204   6.6.2 协调器函数的设计204   6.6.3 路由器设备函数设计205  6.7 实验总结206 第7章 ZigBee2007/PRO进阶  7.1 实验目的207  7.2 实验设备207   7.2.1 硬件介绍207   7.2.2 硬件组成208   7.2.3 ZigBee2007协议栈208  7.3 实验基础知识209   7.3.1 ZigBee PRO简介209   7.3.2 ZigBee PRO中的路由210   7.3.3 ZigBee PRO新功能211   7.3.4 信息包格式211  7.4 实验内容212   7.4.1 初始化任务213   7.4.2 任务处理215   7.4.3 UART_RX_CB_EVT事件219   7.4.4 串口发送函数222   7.4.5 串口接收中断函数223   7.4.6 串口读取函数224   7.4.7 ZigBee发送函数225   7.4.8 ZigBee接收处理函数226  7.5 实验步骤和现象228   7.5.1 建立网络228   7.5.2 路由设备加入网络229   7.5.3 查看网络中节点230   7.5.4 配置地址231   7.5.5 收发数据231  7.6 实验总结233 第8章 ZigBee2007/PRO高级应用——家庭自动化  8.1 家庭自动化概念234  8.2 ZigBee2007/PRO的家庭自动化236  8.3 家庭自动化实验目的236  8.4 家庭自动化体系236  8.5 实验设备237  8.6 家庭自动化实验工程238  8.7 家庭自动化工程剖析239   8.7.1 实验操作流程图240   8.7.2 灯和控制器主函数程序流程图240   8.7.3 其他初始化关键函数242   8.7.4 网络状态变化函数243   8.7.5 绑定相关函数246  8.8 操作系统250   8.8.1 操作系统关键参数251   8.8.2 操作系统关键函数252  8.9 灯设备关键任务256  8.10 控制器关键任务260  8.11 实验操作步骤265  8.12 家庭自动化例程总结268 第9章 ZigBee2007无线传感器网络  9.1 无线传感器网络概述269   9.1.1 什么是无线传感器网络269   9.1.2 无线传感器网络现状270   9.1.3 ZigBee在无线传感器网络上的应用272   9.1.4 ZigBee无线传感器网络系统特点272  9.2 ZigBee2007无线传感器网络实验概述273  9.3 ZigBee2007无线传感器网络硬件设计274   9.3.1 网关底板设计275   9.3.2 传感器底板设计276  9.4 网关与PC机的数据连接281  9.5 ZigBee2007无线传感器网络建立与网络管理287   9.5.1 网络通信过程介绍287   9.5.2 网关网络节点的地址管理288  9.6 网关与节点间的无线采集过程293  9.7 程序编译、下载303  9.8 实验效果304 附录A 网络层所定义的特性常量311 附录B 网络层信息库属性312 参考文献315
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值