从Zigbee协议栈底层添加自己的按键配置
从Zigbee协议栈底层添加自己的按键配置精编版
本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动hal_board_cfg.h、hal_board_cfg.h、hal_key.c、hal_key.h和自己定义的Coordinator.c这5个文件。
注意:添加自己的按键时尽量不要修改协议栈里面的按键程序,自己另行添加即可。
1、hal_key.h在/* Switches (keys) */下面添加自己的按键定义#define HAL_KEY_SW_8 0x80图1:----------------------------------------------------------------------------------------2、hal_board_cfg.h在/* S6 */#define PUSH1_BV BV(1)#define PUSH1_SBIT P0_1#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH1_POLARITY ACTIVE_LOW#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH1_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif下面模仿/* S6 */下的程序定义自己的按键值:/* S8 */#define PUSH8_BV BV(4)//修改#define PUSH8_SBIT P0_4//修改#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH8_POLARITY ACTIVE_HIGH#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH8_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif图2:------------------------------------------------------------------------------------------------------------- 在/* ----------- Push Buttons ---------- */#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT))#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT))#define HAL_PUSH_BUTTON3() (0)#define HAL_PUSH_BUTTON4() (0)#define HAL_PUSH_BUTTON5() (0)#define HAL_PUSH_BUTTON6() (0)下定义自己的按键函数#define HAL_PUSH_BUTTON8() (PUSH8_POLARITY (PUSH8_SBIT))图3:---------------------------------------------------------------------------------------------------------------- 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 */下模仿/* SW_6 is at P0.1 */建立自己的按键函数#define HAL_KEY_SW_8_PORT P0#define HAL_KEY_SW_8_BIT BV(4) //修改#define HAL_KEY_SW_8_SEL P0SEL#define HAL_KEY_SW_8_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_8_EDGEBIT BV(0)#define HAL_KEY_SW_8_EDGE HAL_KEY_FALLING_EDGE/* SW_8 interrupts */#define HAL_KEY_SW_8_IEN IEN1 /* CPU interrupt mask register */#define HAL_KEY_SW_8_IENBIT BV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_8_ICTL P0IEN /* Port Interrupt Control register */#define HAL_KEY_SW_8_ICTLBIT BV(4) //修改#define HAL_KEY_SW_8_PXIFG P0IFG /* Interrupt flag at source */图4:-------------------------------------------------------------------------------------------------------------注意:将void HalKeyPoll (void)中的// if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */// {// keys = halGetJoyKeyInput();// }/* If interrupts are not enabled, previous key status and current key status* are compared to find out if a key has changed status.*/// if (!Hal_KeyIntEnable)// {// if (keys == halKeySavedKeys)// {/* Exit - since no keys have changed */// return;// }/* Store the current keys for comparation next time */// halKeySavedKeys = keys;// }// else// {/* Key interrupt handled here */// }图5:全部注释掉,因为它会对我们设定的按键产生干扰,具体情况我也不知道... 然后再在内模仿:if (HAL_PUSH_BUTTON1()){keys |= HAL_KEY_SW_6;}添加:if (HAL_PUSH_BUTTON8()){keys |= HAL_KEY_SW_8;}图6:------------------------------------------------------------------------------------------------------------- OnBard.c将void InitBoard( uint8 level ){if ( level == OB_COLD ){// IAR does not zero-out this byte below the XSTACK.*(uint8 *)0x0 = 0;// Interrupts offosal_int_disable( INTS_ALL );// Check for Brown-Out resetChkReset();}else // !OB_COLD{/* Initialize Key stuff */HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback); //修改此处}}改为:HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback);记得在任务初始化函数中加入RegisterForKeys( GenericApp_TaskID ); //注册按键事件图7:最后再在Coordinator.c中的uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )添加事件及其处理函数case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );再在static void GenericApp_HandleKeys( uint8 shift, uint8 keys ){zAddrType_t dstAddr;if ( keys & HAL_KEY_SW_1 ){}if ( keys & HAL_KEY_SW_2 ){}if ( keys & HAL_KEY_SW_3 ){}if ( keys & HAL_KEY_SW_4 ){}if ( keys & HAL_KEY_SW_8 ) //添加自己的按键及其处理函数{HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);}}。
Zigbee操作说明
一.Android软件安装配置,导入项目安装pad驱动测试对应源码是否成功使用无线路由器组建局域网,并将摄像头配置进来ZIGBEE用万用表测出2,3,5口:具体使用:将万用表的开关拨到箭头的地方,然后测线路是否通,如果有响声,即是联通的。
串口线和ZIGBEE连接时对应的点:2口:tx; 3口:rx 5口:GND继电器Vin1连接12伏电源GND2连接地D+5连接智能终端的RS485的左边D-6连接智能终端的RS485的右边使用智能终端的使用:1) 连接电源:PWR:左黑右红,红为5伏电源,黑为底线2)串口线连接PC,进行配置查询: AT+AA_BASE_ADDRESS=1返回结果,0,硬件地址设置地址: AT+AA_BASE_ADDRESS=0,A1108 注意:1108为自己设定的硬件地址(0——F)查询:AT+R_AA_Z_NODE返回结果AT+AA_Z_NODE=C 注:C为协调器设置信道:AT+AA_Z_CHANNEL=11 注:11为自行设定的信道(值为11-26)设组网地址:AT+AA_Z_PAN_ID=1105 注:1105为自行设定的组网地址自此,智能终端设置完成设置ZIGBEE连接电源连接串口线,设置235,黑的是5,黄的是2,绿的是3通过串口线连接PC,进行设置:查询硬件地址:AT+AZ_BASE_ADDRESS=1返回结果0,Z硬件地址设置硬件地址:AT+AZ_BASE_ADDRESS=0,Z1109 注:1109为自行设定的硬件地址(这个地址必须区别于智能终端的硬件地址)设置工作模式:AT+AZ_BASE_WORKMODE=0,2设置为路由器:AT+AZ_Z_NODE=R设置信道:AT+AZ_Z_CHANNEL=11 注:11为上述设置的信道AT+AZ_Z_PAN_ID=1105 注:1105为上述设置的组网地址设置工作模式:AT+AZ_BASE_WORKMODE=0,2将门磁连上:门磁的两头分别连接ZIGBEE的GND和IN两口关于继电器1)继电器就是一个开关2)一个继电器有四对:第一队:AG,A1,A2,;第二队:10,11,12;第三队:13,14,15;第四对:16,17,18。
Zigbee设置
ZigBee模块设置1.ZigBee模块F8913D插入配置基板F8913-EVB(注:基板排针接口与模块插针序号正确对应,不可反插。
否则,模块可能烧坏。
)2.用USB连接线,连接配置基板与电脑。
配置基板通过USB口供电。
电脑端打开ZigBeeConfig.exe3.查看端口号,,,(如何查看端口号,详见备注2)4.参数设置,配置步骤如图。
串口波特率:9600校验:无校验停止位:1个停止位是否启用硬件控制流:不勾选调试等级:0AT命令是否回显:不勾选网络号:自行设置(同一网络内模块和网关的网络号必须相同)节点类型:路由 分节点网络地址:自行设置(同一网络内的设备不能有相同网络地址) 透传地址:0 重新自52A8加入网络:勾选 物理信道:26 应用模式: 透传模块设置关键参数说明:网络号:网络号是ZigBee 判断是否在同一个网络的标志,只有网络号相同的设备才会互相组网,互相通信。
节点类型:同一网络,有且仅有一个协调器。
路由具备转发其他模块数据功能,终端不具有该功能。
1 92 34 5 67 8分节点网络地址:即ZigBee 设备本机在网络内的地址标志,协调器不能修改,默认固定为0,路由或终端可设置为非0 的其它数值,一个ZigBee 设备设置完网络地址后这个地址在本网络内就是唯一的,不可再重复加入这个地址的设备。
透传地址:即本ZigBee 设备串口收到的数据要发送的目标ZigBee 设备的分节点网络地址,在透传模式下,只要指定了透传地址,那么本设备发出的数据都会发送给那个分节点网络地址的zibgee 设备。
例如:ZigBee1(分节点网络地址为10)---ZigBee2(分节点网络地址为13)ZigBee1 要把串口收到的数据发给ZigBee2,ZigBee1 的透传地址就要指定为13,ZigBee2 把串口收到的数据发给ZigBee1,那ZigBee2 的透传地址就要设置为10。
物理信道:要互相通信的设备必须设置为一样的信道,推荐使用15,20,25,26 信道,可减少WIFI的干扰。
ZigBee实验——按键控制开关
此实验的功能是通过实验班上的按键控制 LED 的亮灭。本实验用于熟悉 CC2430的 I/O 端口相 关的寄存器,熟悉寄存器的赋值操作。 无线龙 C51RF-3-PK 实验板的 LED1与 P1.0相连,LED2与 P1.1口相连。按键 S5与 P0.5相连, S6同 P0.6相连。我以前对 PIC 的单片机比较熟悉,CC2430的一些操作同 PIC 相比有些不同, 两者对比下学习,效率比较高。先把实验板附带的代码贴上来。 //CD WXL 电池板开关控制小灯 #include <ioCC2430.h>
#define GLED P1_1
/* 根据原理图,LD2(红)为 P1_1口控制;主扩展板为 GLED;从扩展板为 D3(黄) */
#define K1 P0_4
//K1为扩展板的 CANCEL 键,在 P0_4口
#define K2 P0_5
//K2为扩展板的 OK 键,在 P0_5口
//函数声明
#define uint unsigned int
#define uchar unsigned char
#define ON 0
//定义 LED 状态,ON 为亮,OFF 为灭
#define OFF 1
//定义控制灯的端口
#define RLED P1_0
/* 根据原理图,LD1(黄)为 P1_0口控制;主扩展板为 RLED;从扩展板为 D2(红) */
//延时函数
*****************************/
void Delay(uint n)
{ uint tt; for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); for(tt = 0;tt<n;tt++); } /***************************************** //按键初始化函数,原理图中按键连在 P0_4和 P0_5,所以进行了修改 void InitKey(void) { P1SEL &= ~0X0C;//作用是将 P12 P13设为普通 I/O 口,但默认就是,不知道为什么还要加此语句 P1DIR &= ~0X0C; //按键在 P12 P13 P1INP |= 0x0c; //上、下拉 } *****************************************/ void InitKey(void) { //P0SEL &= ~0X30; P0DIR &= ~0x30; //将连接按键的 P0_4、P0_5口设置为输入 P0INP |= 0x30; //将 P0_4、P0_5口的输入状态设置为三态,以读取按键的状态 } /**************************** //初始化程序 *****************************/ void Initial(void)
zigbee模块设置使用说明
Zigbee简介:Zigbee网络通常由三种节点构成:z协调器(Coordinator):用来创建一个Zigbee网络,并为最初加入网络的节点分配地址,每个Zigbee网络需要且只需要一个Coordinator.z路由器(Router):也称为Zigbee全功能节点,可以转发数据,起到路由的作用,也可以收发数据,当成一个数据节点,还能保持网络,为后加入的节点分配地址.z终端节点(End Device):通常定义为电池供电的低功耗设备,通常只周期性发送数据。
或者通过休眠按键控制节点的休眠或工作。
注意:三种Zigbee节点的P ANID在相同的情况下,可以组网并且互相通讯(上电即组网,不需要人为干预)。
这样可以通过P ANID区分zigbee网络,在同一个区域内,可以同时并存多个zigbee网络,互相不会干扰。
Panid设置见下。
管脚定义:z P1.5:休眠键,输入脚,p1.5拉高时,休眠有效。
模块如果是Cornidator、Router 时此脚无效,只有模块是Enddevice时,此脚才有效,如果不需要休眠功能,则此脚与GND连接。
z p1.7:Set键,输入脚,p1.7拉高时候,设置功能有效,平时模块处于数据收发状态时,此引脚应为低电平,具体设置功能见下节z p2.0 网络连接状态灯,输出脚,模块如果是Router或Enddevice时,此按键表明当前模块是否入网,高电平表明入网,低电平表明没有入网。
z p0.2:Rx,与外置MCU的Tx连接z P0.3:Tx,与外置MCU的Rx连接z GND:电源地z VCC:电源3.3V用户在使用时候,可以根据自己需要选择引脚。
最简单的情况是只使用Rx、Tx.、GND、VCC四个脚,但需要将P1.5(休眠键)、P1.7(设置键)接地。
P2.0(网络连接状态)悬空。
当P1.7为高,通过串口对模块进行设置,数据格式如下(以下数据均为16进制):说明:模块处于设置状态时,波特率固定为38400.即P1.7为高时,模块波特率为38400;P1.7为低时,波特率为设置的波特率,波特率设置见下面命令。
zigbee协议栈的使用流程
Zigbee协议栈的使用流程1. 什么是Zigbee协议栈Zigbee协议栈是一种基于IEEE 802.15.4标准的低功耗、自组织的无线通信协议。
它被广泛应用于物联网设备、智能家居、工业自动化等领域。
Zigbee协议栈提供了一套完整的网络协议和通信机制,方便开发者在无线传感器网络中进行通信和数据交换。
2. Zigbee协议栈的使用流程Zigbee协议栈的使用流程可以分为以下几个步骤:步骤一:选择Zigbee协议栈在开始使用Zigbee协议栈之前,首先需要选择合适的Zigbee协议栈。
目前市面上有许多不同的Zigbee协议栈提供商,可以根据自己的需求选择适合的协议栈。
步骤二:准备开发环境在开始使用Zigbee协议栈之前,需要准备好相应的开发环境。
这包括硬件设备、开发工具以及相应的驱动程序。
一般来说,开发者需要购买Zigbee芯片和开发板,并安装相应的开发工具和驱动程序。
步骤三:编写应用程序一旦准备好开发环境,就可以开始编写Zigbee应用程序了。
首先,需要了解Zigbee协议栈的API和接口,理解Zigbee网络的特点和通信机制。
然后,根据具体需求,设计和实现相应的功能模块,例如网络配置、数据传输和安全性等。
步骤四:测试和调试编写完应用程序后,需要进行测试和调试,以确保程序的正确性和稳定性。
可以通过模拟器或者实际的Zigbee设备进行测试。
测试过程中需要注意检查网络连接、数据传输和异常情况处理等方面的功能。
步骤五:部署和运行在完成测试和调试后,就可以将应用程序部署到真实的Zigbee设备上了。
根据具体的部署场景,可能需要进行设备安装、网络配置和数据监控等工作。
一旦部署完成,就可以正式运行Zigbee协议栈,并进行数据交换和通信了。
3. 使用Zigbee协议栈的注意事项在使用Zigbee协议栈的过程中,需要注意以下几个方面:•理解Zigbee网络的拓扑结构和层次关系,合理设计网络拓扑和路由规划。
•注意设备之间的信号强度和信号干扰的问题,确保通信质量和稳定性。
zigbee 自动绑定的实现
zigbee 自动绑定的实现近来事情比较多,忙着答辩,忙着去应酬,尤其是同学之间的感情需要喝酒来加深,以至于没什么时间看书写码。
所以就没什么空看书写码了。
今天把绑定的实验重新做了一遍,但是觉得通过按键来绑定是手动实现的,过程很麻烦。
所以就琢磨着用自动的方式实现。
下面就讲讲实现自动绑定的过程了。
BTW,把我在这次实验的过程中失败经验也介绍一下,希望大家一下。
在开始的过程中,我在初始化中添加了自己的事件MY_EVENT,然后在事件中读取设备的类型,如果是协调器就允许绑定,绑定时间无限制,如果是终端就发送绑定请求。
但是始终失败了,而且设备在不断的重启。
甚是烦恼,不知道什么原因。
希望遇到类似问题的童鞋们可以和我讲解一下。
ok,如正题吧。
估计大家已经不赖烦了要喷我了。
1、要保证设备的自动启动。
在原来的程序中,设备的类型是依据不同按键进行设置的,也就是说按下不同的按键,其将该节点按照特定的设备进行启动。
首先屏蔽掉在初始化程序中的按键部分。
因为这部分关闭了自动启动模式。
/*#if (defined HAL_KEY) && (HAL_KEY == TRUE)if ( HalKeyRead () == HAL_KEY_SW_1){// If SW1 is pressed and held while powerup, force auto-start and nv-restore off and resetstartOptions = 0;zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions );zb_SystemReset();}#endif // HAL_KEY*/初始化函数的结束部分添加如下代码:startOptions = ZCD_STARTOPT_AUTO_START;zb_WriteConfiguration( ZCD_NV_STARTUP_OPTION, sizeof(uint8), &startOptions ); ZDOInitDevice(0);设备自动启动以后,会向任务发送一个设备状态改变的消息,在任务处理函数中对应如下的部分:case ZDO_STATE_CHANGE:// If the device has started up, notify the applicationif (pMsg->status == DEV_END_DEVICE ||pMsg->status == DEV_ROUTER ||pMsg->status == DEV_ZB_COORD ){SAPI_StartConfirm( ZB_SUCCESS );}break;当设备进行确认状态发生变化的时候,这个时候我们开始来允许设备进行绑定,或是发送绑定请求。
12Zigbee实验报告《协议栈按键控制led》
添加自己的按键驱动步骤:
第一步:修改hal ey.c
1、修改SW6所在10口,对应自己开发板上的按键
2、修改触发方式
3、修改对应的中断一些相关标志位
4、不需要用到TI的摇杆J-STICK,所以把代码注释掉·
第二步:修改halboardcfg.h文件
5、修改SW-6所在10口
第三步:修改OnBoard.C文件。
实验内容与步骤
按键驱动,主要有两种方法。一种是普通的轮询,不断查询是否按下按键。另一种是通过中断来产生事件中断与轮询的区别按键
中断和轮询的主要区别是轮询需要CPU定期的检查按键状态,当检测到按键按下则发出HAL KEY EVENT消息到HAL层来执行处理,中断则是当有按键按下立刻向HAL KEY EVENT发出消息,不需要CPU的检查。轮询的实时性比中断要差点,推荐用中断方式。
在ZMain.C目录树下:6、是否使能中断
第四部: SampleApp ProcessEvent中
7、添加case KEY CHANGE,修改按键服务程序
第二页
实验内容与步骤
第三页
实验内容与步骤
实验总结
教师评定
签字: 年 月 日
2019——2020学年第二学期
专业
班级
学号
姓名
日期
2019——2020学年第二学期
专业
班级
学号
姓名
日期
第一页
实验题目
实验目的
本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动. hal board-cfg.h. hal board-cfg.h, halkey.c. halkey.h和自己定义的Coordinator.c这5
zigbee模块使用手册
2.4G无线模块WLT2408NZ产品数据手册编号:DSWLT01003 更新日期:2012/04/26 版本:V1.03产品概述WLT2408NZ模块是广州晓网电子出品的WLT系列ZigBee数据传输模块,具备最大8dBm 输出功率,视距传输距离可达500米(@5dbi天线),工作频段2.380GHz~2.500Ghz,除标准ZigBee的16个通道外,还有9个扩展频段,可以有效避开WIFI、蓝牙等其他2.4G信号干扰。
广州晓网电子为WLT2408NZ用户提供mesh对等无线路由协议,无组网延时,采用时间空间权值均衡原则,路由时间短,通讯稳定可靠。
基本参数产品图片输出功率:供电电压:天线接口:数字接口:视距传输距离:功耗:休眠电流工作温度:存储温度:尺寸:-50~+8dBm1.9~3.3VSMA,U.FLUART,GPIO,AD500米@5dbi天线发送峰值电流46.3mA,接收时36.4mA <1uA-40℃至+85℃-40℃至+105℃16×23mm公司简介广州晓网电子科技有限公司是一家专门从事无线通讯方案设计、生产及服务的公司,公司拥有一流的设计团队,运用先进的工作方法,集合无线设计经验,公司拥有业界实用的各种模块,也为客户提供客制化服务。
订货信息WLT2408NZ-S SMA形式天线接头WLT2408NZ-U U.FL形式天线接头WLT2408NZ SDK 无线模块评估板套件,包含两个评估板,搭载的模块为WLT2408NZ-S。
数据手册版权声明本文档提供有关晓网电子产品的信息,并未授予任何知识产权的许可,并未以明示或暗示,或以禁止发言或其它方式授予任何知识产权许可,任何单位和个人未经版权所有者授权不得在任何形式的出版物中摘抄本手册内容。
产品命名规则图1-1 产品命名规则例如:WLT2408NZ-S表示晓网电子模块类的产品,频段为2.4GHz,理论输出功率为﹢8dBm(实际输出为﹢7.7dBm),超小封装,调制方式为ZigBee,外置SMA头的模块。
物联网ZigBee协议栈解析(加入网络)
开发平台:AR EW8051 7.51A 驱动软件: CP210x驱动包 例 程:文件包GenericApp
GenericApp
• “..\Samples CC2530\GenericApp\SX2530
不可更改或者移出 任务
代码分析2
不可移出任 务
• OS信息处理。 • 异常任务处理。
查看函数
组装系统
修改通道
• 为了方便大家集中学习,我们已经在每 套学习系统中标明了相关的通道与PanId 请各位严格使用自己的通道与PanId
修改PanId
• 为了方便大家集中学习,我们已经在每 套学习系统中标明了相关的通道与PanId 请各位严格使用自己的通道与PanId
GenericApp 形成或者加入一个网络
本章利用简单应用程序 GenericApp 实现ZigBee相关功能例程的讲解 在指定通道和pan上形成一个网络 设备加入指定特定参数的网络
实验准备
硬件清单
C51FF-PS-F V21仿真器一块 SMBD-V1.2 底板一块 SMBD-V11-1底板两块 RF-2530无线模块三块 Mini USB线2条 AAA电池8只
ZigBee工程
子工程
配置文件
链接配置文件
全局配置文
件
• ZigBee的大部分配置都放在相关的配置
节点设备文的件中
配置文件
协调器的配置 文件
路由器配置 文件
配置通道
通道选择
通道全 局变量
f8wConfig.cfg中配置PAN ID
• 如果 PAN_ID = 0xFFFF 设备类型是协调者
• 设备将使用物理地址最后两个字节作为PAN_ID
zigbee工程子工程配置文件zigbee的大部分配置都放在相关的配置文件中链接配置文件全局配置文协调器的配置文件节点设备的配置文件路由器配置文件配置通道通道全局变量通道选择f8wconfigcfg中配置panid0xffff设备类型是协调者0xffff设备类型是路由器或者终端节点设备0xffff设备类型是协调者0xffff设备类型是路由器或者终端节点设备设备将只能加入该panid指定的网络genericapp形成或者加入一个网络本章利用简单应用程序genericapp实现zigbee相关功能例程的讲解在指定通道和pan上形成一个网络设备加入指定特定参数的网络实验准备硬件清单c51ffpsfv21仿真器一块smbdv12底板一块smbdv111底板两块rf2530无线模块三块miniusb线2条aaa电池8只软件清单开发平台
zigbee开发套间之工具配置与开发流程
zigbee开发套间之工具配置与开发流程工具安装:(参考文档:MPLAB IDE V6.XX快速入门指南.pdf)1、安装MPLAB IDE V6.60 (注:"auto connect when startup"及”auto download ICD2 operation system"两项建议取消)2、安装C183、手动安装ICD2所带的USB线驱动(驱动程序在安装的IDE文件夹内的drivers xp/ICD2_USB内)4、安装zigbee协议栈(包含文档、示例程序、协议栈源程序)使用IDE开发流程:(参考文档:MPLAB IDE V6.XX快速入门指南.pdf,MPLAB C18入门.pdf)1、新建工程(建议用project wizard),配置工程(主要是在configer—select device , configer—configer bits , project—select language toolsuite和project—build option中进行配置)2、编写源程序(file—new),向工程中添加文件(注:如果在源程序中已经写了include “xx.h”来包含头文件xx.h,且在第一步中正确设置了文件包含路径,那么此时不需在向工程中添加此文件),(该演示例子中需要在linker file中添加18f452.lkr文件)3、编译(build all)4、用MPLAB SIM进行软件调试(debugger—select tools—MPLAB SIM , 在源程序中设置断点,view—watch—addsymbol添加观察变量,调试运行)使用ICD2进行硬件调试及烧写:(参考文档:MCD2使用说明书.pdf,MCD2快速入门篇)1、连接ICD2及目标板(注意通电顺序)2、选择ICD2为当前调试器件:(debugger—select tools—MPLAB ICD2)3、配置(configer—configer bits;debugger—setting)有时还需要为ICD2下载新的操作系统“download ICD2 operation system”,4、连接(debugger—connect)5、烧写调试用程序(debugger—program)6、在源程序中设置断点,view—watch—addsymbol添加观察变量,调试运行7、调试完成至没有错误后进行应用程序烧写(首先debugger—select tools—none, 然后programmer—select tools—ICD2; programmer—setting;)8、连接(programmer—connect)9、烧写(programmer—program)(也可以在file—import 中直接导入一.hex文件进行烧写)应用程序配置与演示:(参考文档:00965a_cn.pdf,演示工具说明.pdf)1、第一次使用新烧写进的应用程序时,先要进行配置,主要是节点ID的设置(用串口连接目标板与电脑,打开一串口通讯程序(需要设置),按住S3进行通电,然后按照设置菜单进行设置操作即可)2、演示。
ZigBee协议栈Z-Stack开发指南
2.ZigBee2.1设备类型(Device Types)在ZigBee网络中存在三种逻辑设备类型:Coordinator(协调器),Router(路由器)和End-Device(终端设备)。
ZigBee网络由一个Coordinator以及多个Router和多个End_Device组成。
上图是一个简单的ZigBee网络示意图。
其中黑色节点为Coordinator,红色节点为Router,白色节点为End-Device。
2.1.1Coordinator(协调器)协调器负责启动整个网络。
它也是网络的第一个设备。
协调器选择一个信道和一个网络ID(也称之为PAN ID,即Personal Area Network ID),随后启动整个网络。
协调器也可以用来协助建立网络中安全层和应用层的绑定(bindings)。
注意,协调器的角色主要涉及网络的启动和配置。
一旦这些都完成后,协调器的工作就像一个路由器(或者消失go away)。
由于ZigBee网络本身的分布特性,因此接下来整个网络的操作就不在依赖协调器是否存在。
2.1.2Router(路由器)路由器的功能主要是:允许其他设备加入网络,多跳路由和协助它自己的由电池供电的儿子终端设备的通讯。
通常,路由器希望是一直处于活动状态,因此它必须使用主电源供电。
但是当使用树群这种网络模式时,允许路由间隔一定的周期操作一次,这样就可以使用电池给其供电。
2.1.3End-Device(终端设备)终端设备没有特定的维持网络结构的责任,它可以睡眠或者唤醒,因此它可以可以是一个电池供电设备。
通常,终端设备对存储空间(特别是RAM的需要)比较小。
注意:在Z-Stack 1.4.1中一个设备的类型通常在编译的时候通过编译选项(ZDO_COORDINATOR 和RTR_NWK)确定。
所有的应用例子都提供独立的项目文件来编译每一种设备类型。
2.2栈配置(Stack Profil e)栈参数的集合需要被配置为一定的值,连同这些值在一起被称之为栈配置。
协议栈下的按键实验.
修改为 PUSH1_BV
BV(4)
P0_1 P0_4
144行: #define PUSH1_SBIT 修改为 #define PUSH1_SBIT
一、修改协议栈按键定义
第三步:
1、打开OnBoard.C文件(位于ZMain目录下)
一、修改协议栈按键定义
2、使能按键中断
137行: OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;
该函数作为SampleApp任务的主要处理函数,是供给用户实现应用层功能的地方。 其中包含了几种常用的消息事件 1、 case KEY_CHANGE: 按键事件 2、 case AF_INCOMING_MSG_CMD: 无线接收消息事件 3、 case ZDO_STATE_CHANGE: Zigbee设备网络状态改变事件 。。。用户也可自定义事件
修改为 #define HAL_KEY_SW_6_ICTLBIT BV(4)
一、修改协议栈按键定义
第二步:
1、打开 hal_board_cfg.h文件(位于HAL—Target—CC2530DB—Config)
一、修改协议栈按键定义
2、修改SW_6所在IO口
143行: PUSH1_BV BV(1)
一、修改协议栈按键定义
第一步: 1、打开hal_key.c文件(位于HAL—Target—CC2530DB—Drivers)
一、修改协议栈按键定义
2、修改SW_6所在IO口
113行: #define HAL_KEY_SW_6_BIT BV(1)
修改为 #define HAL_KEY_SW_6_BIT BV(4)
一、修改协议栈按键定义
3、修改边缘触发方式
基于ZigBee的无线键盘的设计与实现
基于ZigBee的无线键盘的设计与实现无线键盘作为一种便携、灵活的输入设备,广泛应用于各类电子设备中。
为了提高无线键盘的性能和实用性,基于ZigBee通信技术的无线键盘逐渐引起了人们的关注。
本文将介绍基于ZigBee的无线键盘的设计与实现。
首先,我们需要了解ZigBee通信技术的基本原理。
ZigBee 是一种低功耗、低速率的无线通信技术,它采用短距离、低功耗的无线传输方式,适用于小范围、低速率的无线通信。
通过ZigBee通信技术,无线键盘可以与电脑或其他设备进行无线连接,实现数据传输和控制。
基于ZigBee的无线键盘的设计与实现主要包括以下几个方面。
首先是硬件设计,包括键盘矩阵、按键开关、控制电路等。
键盘矩阵是无线键盘的核心部件,它由多个按键组成,每个按键与一个按键开关相连。
按下某个按键时,按键开关会闭合,电流流过,通过控制电路将按键信息转换为数字信号发送给ZigBee模块。
其次是软件设计,包括ZigBee协议栈的开发、按键扫描算法的实现等。
ZigBee协议栈是无线键盘与其他设备进行通信的关键,它负责数据的传输和处理。
按键扫描算法是为了检测用户按下的按键,并将按键信息发送给ZigBee模块。
通过软件设计,实现了无线键盘的功能和性能。
最后是无线键盘的测试和应用。
在设计完成后,我们需要对无线键盘进行测试,包括按键的灵敏度、通信的稳定性等。
在测试通过后,无线键盘可以应用于各类电子设备,如电脑、智能手机等,提供无线输入的便利性和灵活性。
综上所述,基于ZigBee的无线键盘通过采用ZigBee通信技术,实现了无线连接和数据传输的功能。
通过硬件设计、软件设计和测试应用等步骤,实现了无线键盘的设计与实现。
基于ZigBee的无线键盘具有低功耗、灵活性强的特点,能够满足人们对无线键盘的各种需求,具有广阔的应用前景。
zigbee协议栈按键流程
我使用的协议栈版本及例子信息:ZigBee2006\Texas Instruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp记录下个人对按键流程的理解在hal_key.c中有一段说明:/*********************************************************************NOTE: If polling is used, the hal_driver task schedules the KeyRead() to occur every 100ms. This should be long enough to naturallydebounce(去抖动) the keys. The KeyRead() function remembers the keystate of the previous poll and will only return a non-zerovalue if the key state changes.NOTE: If interrupts are used, the KeyRead() function is scheduled25ms after the interrupt occurs by the ISR. This delay is usedfor key debouncing. The ISR disables any further Key interruptuntil KeyRead() is executed. KeyRead() will re-enable Keyinterrupts after executing. Unlike polling, when interruptsare enabled, the previous key state is not remembered. Thismeans that KeyRead() will return the current state of the keys(not a change in state of the keys).NOTE: If interrupts are used, the KeyRead() fucntion is scheduled by the ISR. Therefore, the joystick movements will only be detectedduring a pushbutton interrupt caused by S1 or the center joystickpushbutton.NOTE: When a switch like S1 is pushed, the S1 signal goes from a normally high state to a low state. This transition is typically clean. Theduration of the low state is around 200ms. When the signal returnsto the high state, there is a high likelihood of signal bounce, whichcauses a unwanted interrupts. Normally, we would set the interruptedge to falling edge to generate an interrupt when S1 is pushed, butbecause of the signal bounce, it is better to set the edge to risingedge to generate an interrupt when S1 is released. The debounce logiccan then filter out the signal bounce. The result is that we typicallyget only 1 interrupt per button push. This mechanism is not totallyfoolproof because occasionally, signal bound occurs during the fallingedge as well. A similar mechanism is used to handle the joystickpushbutton on the DB. For the EB, we do not have independent controlof the interrupt edge for the S1 and center joystick pushbutton. Asa result, only one or the other pushbuttons work reasonably well withinterrupts. The default is the make the S1 switch on the EB work morereliably.*********************************************************************/对本协议中,对按键有两种处理方式:1、中断法:有按键按下,则进入中断,开启一软定时器25ms后,读取键值进行相应处理2、查询法:开启一软定时器,系统每隔100ms进行轮询,如有按键按下读取键值进行相应处理(软定时器即软件定时器,参见“系统时钟定时器”说明)首先看下协议栈对KEY的初始化,在InitBoard()函数中:/* Initialize Key stuff */OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);从而知道协议栈默认的按键处理机制是查询法.就先来看下查询法的流程:1、查询法(或者轮询法)首先看下HalKeyConfig()这个函数用于把按键/开关/操纵杆服务配置为轮询或中断驱动。
ZigBee协议栈NV操作
NV操作实验
static void rxCB(unit8 port,uint8 event); { Uint8 value_read;//定义一个变量从用于从NV存储器读 取数据。 uint8 value=18;//要写入的NV条目数据 uint8 uartbuf[2];//定义一个缓冲区用于存放读取数据 uint8 cmd[6];//定义一个命令缓冲区,存放读取的命令 HalUARTRead(0,cmd,6)读取的命令放在cmd数组中
#include "hal_key.h" #include "sensor.h" #ifdef EXSENSOR #include "exsensor.h" #endif #include "hal_adc.h" #include "MT_UART.h #include”OSAL_Nv.h”//添 加代码
uint8 value=20; //添加写入NV条目变量 …………………………………………. case SPI_INCOMING_ZTOOL_PORT: HalUARTRead( MT_UART_DEFAULT_PORT,R_Buffer.data, 16 ); if( osal_nv_item_init(TEST_NV,1,NULL) == ZSUCCESS ) {
NV操作函数
Uint8 osal_nv_write(uint16 id,uint16 ndx,uint16,len,void*buf) 这个是NV写入函数。该函数4个参数含义如下: Uint16 id:NV条目ID号; Uint16 ndx:距离条目开始地址的偏移量; Uint16len:要写入的数据长度; Void*buf:指向存放写入数据缓冲代码:
Zigbee协议栈添加自己的任务实验
6.1 Zigbee协议栈添加自己的任务实验对于IEEE 802.15.4定义的规范和zigbee联盟制定的规范,在Z-Stack2007/PRO整个协议栈中,对应的各层协议已经基本实现。
在此基础上,若想建立一个项目并添加一个任务,必须要对Z-Stack协议栈的运行流程及应用层的调用关系搞清楚。
这些知识,我们在前面的第四章已经基本讲述了。
下面我们以一个简单的例子,来讲述怎样添加自己的任务,并完成自己的事件。
该实验的功能是实现在一个zigbee网络中,当协调器节点建立网络之后,路由节点和终端节点打开并加入该网络,然后协调器节点的LED1灯、路由节点的LED2灯、终端节点的LED3灯同时闪烁。
我们将这个项目的名字设置为MyAppXD。
6.1.1 实验目的与器材1)实验目的◆学习如何利用Z-Stack2007/PRO创建自己的工程。
◆学习如何添加自己的任务并编写处理事件。
◆加深对Z-Stack2007/PRO协议栈的流程认识。
◆了解zigbee协议规范在Z-Stack中的体现。
2)实验器材◆3个CC2530开发套件(1个协调器套件,1个路由器套件,1个终端套件);◆PC电脑一台;◆协议栈开发环境:IAR 7.51A。
6.1.2 实验原理与步骤1)硬件介绍在本实验中,采用zigbee模块CC2530最小模块和带液晶低板组成一个设备。
试验中需要的3个设备,都是采用这种套件方式。
每个套件包括:一个CC2530最小模块(如图6-1-3所示),一个带液晶底板(如图6-1-2所示),一个CC2530仿真器(如图6-1-1所示),还有一个大头的USB下载线。
图6-1-1 CC2530/2430仿真器图6-1-2 整个CC2530开发模块图6-1-3 CC2530最小模块2)实验原理OSAL任务分配机制在基于ZigBee协议的应用开发中,用户只需要实现应用程序框架即可。
ZigBee协议栈框架包含了最多240个应用程序对象。
从Zigbee协议详情栈底层添加自己地按键配置
本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动hal_board_cfg.h、hal_board_cfg.h、hal_key.c、hal_key.h和自己定义的Coordinator.c 这5个文件。
注意:添加自己的按键时尽量不要修改协议栈里面的按键程序,自己另行添加即可。
1、hal_key.h在/* Switches (keys) */下面添加自己的按键定义#define HAL_KEY_SW_8 0x80图1:----------------------------------------------------------------------------------------2、hal_board_cfg.h在/* S6 */#define PUSH1_BV BV(1)#define PUSH1_SBIT P0_1#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH1_POLARITY ACTIVE_LOW#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH1_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif下面模仿/* S6 */下的程序定义自己的按键值:/* S8 */#define PUSH8_BV BV(4)//修改#define PUSH8_SBIT P0_4//修改#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH8_POLARITY ACTIVE_HIGH#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH8_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif图2:-------------------------------------------------------------------------------------------------------------在/* ----------- Push Buttons ---------- */#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT))#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT))#define HAL_PUSH_BUTTON3() (0)#define HAL_PUSH_BUTTON4() (0)#define HAL_PUSH_BUTTON5() (0)#define HAL_PUSH_BUTTON6() (0)下定义自己的按键函数#define HAL_PUSH_BUTTON8() (PUSH8_POLARITY (PUSH8_SBIT))图3:----------------------------------------------------------------------------------------------------------------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 */下模仿/* SW_6 is at P0.1 */建立自己的按键函数#define HAL_KEY_SW_8_PORT P0#define HAL_KEY_SW_8_BIT BV(4) //修改#define HAL_KEY_SW_8_SEL P0SEL#define HAL_KEY_SW_8_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_8_EDGEBIT BV(0)#define HAL_KEY_SW_8_EDGE HAL_KEY_FALLING_EDGE/* SW_8 interrupts */#define HAL_KEY_SW_8_IEN IEN1 /* CPU interrupt mask register */#define HAL_KEY_SW_8_IENBIT BV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_8_ICTL P0IEN /* Port Interrupt Control register */#define HAL_KEY_SW_8_ICTLBIT BV(4) //修改#define HAL_KEY_SW_8_PXIFG P0IFG /* Interrupt flag at source */图4:-------------------------------------------------------------------------------------------------------------注意:将void HalKeyPoll (void)中的// if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */// {// keys = halGetJoyKeyInput();// }/* If interrupts are not enabled, previous key status and current key status * are compared to find out if a key has changed status.*/// if (!Hal_KeyIntEnable)// {// if (keys == halKeySavedKeys)// {/* Exit - since no keys have changed */// return;// }/* Store the current keys for comparation next time */// halKeySavedKeys = keys;// }// else// {/* Key interrupt handled here */// }图5:全部注释掉,因为它会对我们设定的按键产生干扰,具体情况我也不知道... 然后再在内模仿:if (HAL_PUSH_BUTTON1()){keys |= HAL_KEY_SW_6;}添加:if (HAL_PUSH_BUTTON8()){keys |= HAL_KEY_SW_8;}图6:-------------------------------------------------------------------------------------------------------------OnBard.c将void InitBoard( uint8 level ){if ( level == OB_COLD ){// IAR does not zero-out this byte below the XSTACK.*(uint8 *)0x0 = 0;// Interrupts offosal_int_disable( INTS_ALL );// Check for Brown-Out resetChkReset();}else // !OB_COLD{/* Initialize Key stuff */HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback); //修改此处 }}改为:HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback);记得在任务初始化函数中加入RegisterForKeys( GenericApp_TaskID ); //注册按键事件图7:最后再在Coordinator.c中的uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )添加事件及其处理函数case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );再在static void GenericApp_HandleKeys( uint8 shift, uint8 keys ){zAddrType_t dstAddr;if ( keys & HAL_KEY_SW_1 ){}if ( keys & HAL_KEY_SW_2 ){}if ( keys & HAL_KEY_SW_3 ){}if ( keys & HAL_KEY_SW_4 ){}if ( keys & HAL_KEY_SW_8 ) //添加自己的按键及其处理函数 {HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);}}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本实验是基于ZStack-CC2530-2.5.1a版本的协议栈来进行实验的,整个实验需要改动hal_board_cfg.h、hal_board_cfg.h、hal_key.c、hal_key.h和自己定义的Coordinator.c这5个文件。
注意:添加自己的按键时尽量不要修改协议栈里面的按键程序,自己另行添加即可。
1、hal_key.h在/* Switches (keys) */下面添加自己的按键定义#define HAL_KEY_SW_8 0x80图1:----------------------------------------------------------------------------------------2、hal_board_cfg.h在/* S6 */#define PUSH1_BV BV(1)#define PUSH1_SBIT P0_1#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH1_POLARITY ACTIVE_LOW#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH1_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif下面模仿/* S6 */下的程序定义自己的按键值:/* S8 */#define PUSH8_BV BV(4)//修改#define PUSH8_SBIT P0_4//修改#if defined (HAL_BOARD_CC2530EB_REV17)#define PUSH8_POLARITY ACTIVE_HIGH#elif defined (HAL_BOARD_CC2530EB_REV13)#define PUSH8_POLARITY ACTIVE_LOW#else#error Unknown Board Indentifier#endif图2:------------------------------------------------------------------------------------------------------------- 在/* ----------- Push Buttons ---------- */#define HAL_PUSH_BUTTON1() (PUSH1_POLARITY (PUSH1_SBIT))#define HAL_PUSH_BUTTON2() (PUSH2_POLARITY (PUSH2_SBIT))#define HAL_PUSH_BUTTON3() (0)#define HAL_PUSH_BUTTON4() (0)#define HAL_PUSH_BUTTON5() (0)#define HAL_PUSH_BUTTON6() (0)下定义自己的按键函数#define HAL_PUSH_BUTTON8() (PUSH8_POLARITY (PUSH8_SBIT))图3:---------------------------------------------------------------------------------------------------------------- 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 */下模仿/* SW_6 is at P0.1 */建立自己的按键函数#define HAL_KEY_SW_8_PORT P0#define HAL_KEY_SW_8_BIT BV(4) //修改#define HAL_KEY_SW_8_SEL P0SEL#define HAL_KEY_SW_8_DIR P0DIR/* edge interrupt */#define HAL_KEY_SW_8_EDGEBIT BV(0)#define HAL_KEY_SW_8_EDGE HAL_KEY_FALLING_EDGE/* SW_8 interrupts */#define HAL_KEY_SW_8_IEN IEN1 /* CPU interrupt mask register */#define HAL_KEY_SW_8_IENBIT BV(5) /* Mask bit for all of Port_0 */#define HAL_KEY_SW_8_ICTL P0IEN /* Port Interrupt Control register */#define HAL_KEY_SW_8_ICTLBIT BV(4) //修改#define HAL_KEY_SW_8_PXIFG P0IFG /* Interrupt flag at source */图4:-------------------------------------------------------------------------------------------------------------注意:将void HalKeyPoll (void)中的// if ((HAL_KEY_JOY_MOVE_PORT & HAL_KEY_JOY_MOVE_BIT)) /* Key is active HIGH */// {// keys = halGetJoyKeyInput();// }/* If interrupts are not enabled, previous key status and current key status* are compared to find out if a key has changed status.*/// if (!Hal_KeyIntEnable)// {// if (keys == halKeySavedKeys)// {/* Exit - since no keys have changed */// return;// }/* Store the current keys for comparation next time */// halKeySavedKeys = keys;// }// else// {/* Key interrupt handled here */// }图5:全部注释掉,因为它会对我们设定的按键产生干扰,具体情况我也不知道... 然后再在内模仿:if (HAL_PUSH_BUTTON1()){keys |= HAL_KEY_SW_6;}添加:if (HAL_PUSH_BUTTON8()){keys |= HAL_KEY_SW_8;}图6:------------------------------------------------------------------------------------------------------------- OnBard.c将void InitBoard( uint8 level ){if ( level == OB_COLD ){// IAR does not zero-out this byte below the XSTACK.*(uint8 *)0x0 = 0;// Interrupts offosal_int_disable( INTS_ALL );// Check for Brown-Out resetChkReset();}else // !OB_COLD{/* Initialize Key stuff */HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE, OnBoard_KeyCallback); //修改此处}}改为:HalKeyConfig(HAL_KEY_INTERRUPT_ENABLE, OnBoard_KeyCallback);记得在任务初始化函数中加入RegisterForKeys( GenericApp_TaskID ); //注册按键事件图7:最后再在Coordinator.c中的uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )添加事件及其处理函数case KEY_CHANGE:GenericApp_HandleKeys( ((keyChange_t *)MSGpkt)->state, ((keyChange_t *)MSGpkt)->keys );再在static void GenericApp_HandleKeys( uint8 shift, uint8 keys ){zAddrType_t dstAddr;if ( keys & HAL_KEY_SW_1 ){}if ( keys & HAL_KEY_SW_2 ){}if ( keys & HAL_KEY_SW_3 ){}if ( keys & HAL_KEY_SW_4 ){}if ( keys & HAL_KEY_SW_8 ) //添加自己的按键及其处理函数{HalLedSet(HAL_LED_1, HAL_LED_MODE_FLASH);}}。