无线传感网技术及应用 课件 项目22 Z-Stack协议栈按键控制_第1页
无线传感网技术及应用 课件 项目22 Z-Stack协议栈按键控制_第2页
无线传感网技术及应用 课件 项目22 Z-Stack协议栈按键控制_第3页
无线传感网技术及应用 课件 项目22 Z-Stack协议栈按键控制_第4页
无线传感网技术及应用 课件 项目22 Z-Stack协议栈按键控制_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目二十二

Z-Stack协议栈按键控制01项目导入项目导入

物联网设备在使用过程中常用到手动控制功能,如按不同按键远程控制其他多个设备的打开或关闭。本项目通过在协调器上按不同按键,控制多个终端模块IO口的开启或关闭,让大家了解Z-Stack协议栈下按键控制技术的工作原理、代码编写、程序烧录、程序调试的整个过程,并通过实验结果加以验证。02项目分析项目分析

本项目需要1个协调器模块和1个终端节点模块。由协调器模块的按键控制终端节点IO口的输出,完成手动远程控制终端节点外接的设备打开或关闭。如果协调器上有多个按键,也可以修改代码实现多个设备的远程控制。后续课程中我们会采用在用户手机上通过云平台远程控制这些网络设备,从而实时了解这些设备运行状况,并发送相关指令控制相关设备的运行。【项目要求】1.用Z-Stack协议栈实现协调器端的按键参数采集。2.用Z-Stack协议栈实现按键数据传输。3.Z-Stack协议栈下实现终端节点接收到的按键数据控制设备。03项目目标项目目标学会使用Z-Stack协议栈下的终端节点所接设备的控制方法。学会Z-Stack协议栈下的下的按键参数采集代码的编写。学会使用Z-Stack协议栈下的按键数据无线传输。熟悉Z-Stack协议栈下的按键参数设置。04知识储备

要完成这个项目的设计,我们首先要了解HAL目录下主板、按键、LCD、LED、uart串口等硬件设备的中断设置概念,掌握按键中断方式和查询方式的设置方法、调用方法和代码的编写。4.1按键初始化1.按键的定义:在文件hal_board_cfg.h中默认定义两个按键PUSH1和PUSH2。/*S1*/#definePUSH1_BVBV(0)#definePUSH1_SBITP0_1//定义PUSH1按键为P0_1脚/*JoystickCenterPress*/#definePUSH2_BVBV(0)#definePUSH2_SBITP2_0//定义PUSH2按键为P2_0脚#definePUSH2_POLARITYACTIVE_HIGH//定义PUSH1初始为高电平4.2按键初始化

系统启动过程中主程序main()调用OnBoard.c文件中的InitBoard(OB_READY)函数。voidInitBoard(uint8level){if(level==OB_COLD){

osal_int_disable(INTS_ALL);}else//如果不是OB_COLD状态{

HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,OnBoard_KeyCallback);}}

HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,OnBoard_KeyCallback),//其意义为禁用按键中断

OnBoard_KeyCallback为中断的回调函数。4.3系统按键初始化1.操作系统在hal_key.c文件中定义按键SW_6的端口和需要设置的寄存器。/*SW_6isatP0.1*/#defineHAL_KEY_SW_6_PORTP0//P0端口#defineHAL_KEY_SW_6_BITBV(1)//P0.1引脚#defineHAL_KEY_SW_6_SELP0SEL//P0端口功能寄存器#defineHAL_KEY_SW_6_DIRP0DIR//P0端口方向寄存器/*SW_6interrupts*/#defineHAL_KEY_SW_6_EDGEBITBV(0)#defineHAL_KEY_SW_6_EDGEHAL_KEY_FALLING_EDGE//下降沿触发中断#defineHAL_KEY_SW_6_IENIEN1//中断屏蔽寄存器#defineHAL_KEY_SW_6_IENBITBV(5)//

IEN1的第5位#defineHAL_KEY_SW_6_ICTLP0IEN//端口中断允许寄存器#defineHAL_KEY_SW_6_ICTLBITBV(1)//位中断允许寄存器#defineHAL_KEY_SW_6_PXIFGP0IFG//中断标志寄存器系统按键初始化2.在hal_key.c文件的HalKeyInit()函数中设置按键I/O口的模式和方向寄存器。voidHalKeyInit(void){

HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT);//设置SW6引脚功能为普通IO口

HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT);//设置SW6引脚方向为输入

……}3.在hal_key.c文件的HalKeyConfig()函数中设置按键中断寄存器。本例未使用中断,因此无需设置相关寄存器。voidHalKeyConfig(boolinterruptEnable,halKeyCBack_tcback){

if(Hal_KeyIntEnable)//如果开启了中断模式{……

PICTL|=HAL_KEY_SW_6_EDGEBIT;//设置下降沿触发

HAL_KEY_SW_6_ICTL|=HAL_KEY_SW_6_ICTLBIT;//P0IEN寄存器相关位置1系统按键初始化HAL_KEY_SW_6_IEN|=HAL_KEY_SW_6_IENBIT;//IEN1寄存器相关位置1HAL_KEY_SW_6_PXIFG=~(HAL_KEY_SW_6_BIT);//P0IFG寄存器相关位置1……}else//如果没有开启中断{HAL_KEY_SW_6_ICTL&=~(HAL_KEY_SW_6_ICTLBIT);//P0IEN寄存器相关位清0HAL_KEY_SW_6_IEN|=HAL_KEY_SW_6_IENBIT;//IEN1寄存器相关位置1HAL_KEY_SW_6_PXIFG=~(HAL_KEY_SW_6_BIT);//P0IFG寄存器相关位置1……}4.4轮询按键事件

按键初始化设置函数HalKeyConfig()调用了设置定时器函数osal_start_timerEx(Hal_TaskID,HAL_KEY_EVENT,HAL_KEY_POLLING_VALUE)。其含义为:每经过HAL_KEY_POLLING_VALUE时间(默认100ms),则启动一个硬件处理任务Hal_TaskID,任务内容为HAL_KEY_EVENT(按键事件),简单说来就是定时查询按键有无动作。如果开启了按键中断,则关闭这个定时器,改由中断触发按键事件。当发生按键事件时,硬件事件处理函数Hal_ProcessEvent()首先调用HalKeyPoll()函数判断是哪个按键动作,如果PUSH1动作则将PUSH1与系统按键HAL_KEY_SW_6绑定。轮询按键事件voidHalKeyPoll(void){if(HAL_PUSH_BUTTON1())

{

keys|=HAL_KEY_SW_6;

}}其次回调函数OnBoard_KeyCallback()调用osal_msg_send(),发送按键状态消息到系统任务,由系统对此按键任务进行处理。4.5按键时发送广播包1.在SampleApp.c文件的SampleApp_HandleKeys()函数中添加发送广播包的函数。voidSampleApp_HandleKeys(uint8shift,uint8keys){if(keys&HAL_KEY_SW_6){if(keyCounter<3)//keyCounter有1和2两种状态

SampleApp_SendPeriodicMessage1(keyCounter++);else{keyCounter=1;SampleApp_SendPeriodicMessage1(keyCounter++);}}在发送的广播包中发送控制编号voidSampleApp_SendPeriodicMessage1(uint8index){if(AF_DataRequest(&SampleApp_Periodic_DstAddr,&SampleApp_epDesc,

SAMPLEAPP_PERIODIC_CLUSTERID,

1,

&index,

&SampleApp_TransID,

AF_DISCV_ROUTE,

AF_DEFAULT_RADIUS)==afStatus_SUCCESS)

{

if(index==1)

HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);//状态1时灯灭

else

HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//状态2时灯亮……

}}4.6处理接收到的控制数据

在SampleApp.c文件下的SampleApp_MessageMSGCB()函数负责接收到数据的处理。终端和路由节点接收到广播包后,采用接收到的灯光控制数据控制LED1的状态。如果带有液晶显示功能,也可将数据显示到液晶屏上。voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){……caseSAMPLEAPP_PERIODIC_CLUSTERID://收到广播数据data=(uint8)pkt->cmd.Data[0];if(data=='A')

HalLedBlink(HAL_LED_2,4,50,200);//收到终端发送来的“A1”包时LED2灯闪4次elseif(data==1)

HalLedSet(HAL_LED_1,HAL_LED_MODE_OFF);//收到状态包“1”时LED1灯灭else

HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//收到状态包“2”时LED1灯亮break;……}05项目实施实施过程(1)在hal_board_cfg.h修改按键端口/*S1*/#definePUSH1_BVBV(0)#definePUSH1_SBITP0_0//设置按键1为P0_0/*S2*/#definePUSH2_BVBV(0)#definePUSH2_SBITP2_0//设置按键2为P2_0#definePUSH2_POLARITYACTIVE_HIGH实施过程(2)OnBoard.c中禁止按键中断:voidInitBoard(uint8level)HalKeyConfig(HAL_KEY_INTERRUPT_DISABLE,OnBoard_KeyCallback);(3)在hal_key.c文件中设置寄存器/*SW_6isatP0.0*/#defineHAL_KEY_SW_6_PORTP0#defineHAL_KEY_SW_6_BITBV(0)#defineHAL_KEY_SW_6_SELP0SEL#defineHAL_KEY_SW_6_DIRP0DIR实施过程(4)在hal_key.c文件中HalKeyInit(void)

函数中设置寄存器

HAL_KEY_SW_6_SEL&=~(HAL_KEY_SW_6_BIT);

HAL_KEY_SW_6_DIR&=~(HAL_KEY_SW_6_BIT);

(5)在hal_key.c文件的HalKeyConfig()函数中屏蔽中断。因未开启中断,此步可省略。

HAL_KEY_SW_1_ICTL&=~HAL_KEY_SW_1_ICTLBIT;HAL_KEY_SW_1_IEN&=~HAL_KEY_SW_1_IENBIT;HAL_KEY_SW_1_PXIFG=~(HAL_KEY_SW_1_BIT);HAL_KEY_SW_1_PXIFG=~(HAL_KEY_SW_1_BIT);(6)在hal_key.c文件的HalKeyPoll()函数中绑定硬件按键BUTTON1与系统按键SW6if(HAL_PUSH_BU

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论