zigbee协议栈之按键处理流程

zigbee协议栈版本: z-stack home 1.2.1

1、按键的初始化:协议栈的按键初始化主要有两个地方,一个是初始化开始,一个是初始化结束。

int main( void )

{

。。。。

InitBoard( OB_COLD ); //第一次初始化按键

。。。。

InitBoard( OB_READY );

。。。。

}

2、先看一下InitBoard函数的实现

void InitBoard( uint8 level )

{

if ( level == OB_COLD )

{

// Interrupts off

osal_int_disable( INTS_ALL );

HalKeyConfig( FALSE, NULL);    //根据函数名我们可以知道配置函数在这里,分析可知这里配置成了轮询的方式

#if (defined OTA_CLIENT) && (OTA_CLIENT == TRUE)

HalOTAInit();

#endif

}

else  // !OB_COLD

{

/* Initialize Key stuff */

OnboardKeyIntEnable = HAL_KEY_INTERRUPT_DISABLE;

HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);//第一个参数为是否使能中断,和相关的按键回调函数

}

}

3、先看一下void HalKeyConfig( bool interruptEnable, halKeyCBack_t cback)

{

#if (HAL_KEY == TRUE) //默认开启HAL_KEY

/* Enable/Disable Interrupt or */

Hal_KeyIntEnable = interruptEnable; //main函数里这里配置为FALSE

/* Register the callback fucntion */

pHal_KeyProcessFunction = cback;   //按键回调函数

/* Determine if interrupt is enable or not */

if ( Hal_KeyIntEnable )//如果使能中断

{

/* Initialize key handler to use interrupts */

bspKeyInit(BSP_KEY_MODE_ISR);//设置按键为中断模式

/* Map function dirKeyIsr to UP, LEFT, RIGHT and DOWN keys */

bspKeyIntRegister((BSP_KEY_UP|BSP_KEY_LEFT|BSP_KEY_RIGHT|BSP_KEY_DOWN),

&interrupt_keybd); //注册中断服务程序

/* Map function selectKeyIsr to SELECT key */

bspKeyIntRegister(BSP_KEY_SELECT, &interrupt_keybd);//注册中断服务程序

/* Enable interrupts on all keys */

bspKeyIntEnable(BSP_KEY_ALL);//使能

IntPrioritySet(INT_GPIOC, HAL_INT_PRIOR_KEY);  //设置中断优先级

IntPrioritySet(INT_GPIOA, HAL_INT_PRIOR_KEY);  //设置中断优先级

/* Cancel polling if there is one active */

osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT); //取消轮询方式开启中断方式

}

else//不使能中断

{

bspKeyInit(BSP_KEY_MODE_POLL); //按键模式设置为POLL 轮询

if( cback != NULL)// 如果回调函数不为空

{

/* Start polling if callback function is setup*/

osal_set_event(Hal_TaskID, HAL_KEY_EVENT);//进入系统前会进入到这里

}

}

#endif /* HAL_KEY */

}

4、先看一下 HalKeyConfig的函数体:

void HalKeyConfig( bool interruptEnable, halKeyCBack_t cback)

{

。。。

Hal_KeyIntEnable = interruptEnable; //main函数里初始化开始阶段这里配置为FALSE

。。。

pHal_KeyProcessFunction = cback;

。。。

if ( Hal_KeyIntEnable )//如果使能中断

{

。。。

}

else//不使能中断       //系统默认的情况下是不是能中断的

{

bspKeyInit(BSP_KEY_MODE_POLL); //按键模式设置为POLL 轮询

if( cback != NULL)// 如果回调函数不为空

{

/* Start polling if callback function is setup*/

osal_set_event(Hal_TaskID, HAL_KEY_EVENT);//这里将会启动一个Hal_TaskID任务的HAL_KEY_EVENT事件

}

}

#endif /* HAL_KEY */

}

5、先看一下Hal_TaskID任务的事件处理函数;

uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )

{

if (events & HAL_KEY_EVENT)

{

HalKeyPoll(); //按键轮询检测函数

if (!Hal_KeyIntEnable)

{

osal_start_timerEx( Hal_TaskID, HAL_KEY_EVENT, 100);
//每隔100ms轮询一次

}

return events ^ HAL_KEY_EVENT;

}

}

6、先看一下HalKeyPoll函数体

void HalKeyPoll( void )

{

#if (HAL_KEY == TRUE)

uint8 keys = 0;

if (!Hal_KeyIntEnable)//初值为0

{

keys = hal_key_keys ();//很好的一种按键防抖软件实现

if ( keys == halSavedKeys )

{

return;

}

halSavedKeys = keys;

}

/* Callback */

if (keys && (pHal_KeyProcessFunction))

{

(pHal_KeyProcessFunction) (keys, HAL_KEY_STATE_NORMAL);// //在这里将键值传递给板子初始化是注册的回调函数,进行处理。

}

#endif /* HAL_KEY */

}

时间: 2024-08-12 18:35:35

zigbee协议栈之按键处理流程的相关文章

第1章 ZigBee协议栈初始化网络启动流程

作者:宋老师,华清远见嵌入式学院讲师. ZigBee的基本流程:由协调器的组网(创建PAN ID),终端设备和路由设备发现网络以及加入网络. 基本流程:main()->osal_init_system()->osalInitTasks()->ZDApp_Init(),进协议栈初始化函数ZDApp_Init(). 1.1 进入程序入口main(). ZMain.c中 C++ Code int main( void )         {                 // Turn of

Zigbee协议栈内核分析 - 按键分析

Zigbee协议栈内核分析 - 按键分析(轮询) Jesse 协议栈按键代码分析 - 思维导图(放大可看) 一.综述 上图从协议栈的 main() 函数开始分析,罗列出了 main()  函数里调用的函数.接下来我们将会对函数一个一个的分析,有关于 key 的函数我将会用黄色方框表示. 二.协议栈代码分析(按照上图逐步分析) 1.osal_int_disable( INTS_ALL );           //关闭总中断 2.HalDriverInit(); 调用 HalKeyInit(); 

zigbee学习之路(十五):基于协议栈的按键实验

一.前言 经过上次的学习,相信大家已经初步学会使用zigbee协议进行发送和接受数据了.今天,我们要进行的实验是按键的实验,学会如何在协议栈里实现按键中断. 二.实验功能 在协议栈上实现按键中断,BUT1 按下,LED1 闪烁两次. 三.代码讲解 大家还记得,前面做过的按键实验是怎么配置的吗,其实基于zigbee的协议栈原理是差不多的,我们要对按键的接口和状态是差不多,TI已经为我们建立了专用的按键配置的代码文件,我们只要在此基础上修改就行了.先打开hel_key.c进行修改,下面是代码 #de

[ZigBee] 16、Zigbee协议栈应用(二)——基于OSAL的无线控制LED闪烁分析(下)

说在前面:上一篇介绍了无线LED闪烁实现的OSAL部分,本篇介绍如何实现无线数据收发及数据处理: 上一篇是用SI跟着流程查看源码,我个人认为以架构的思维去了解代码能让人更清晰 ::ZMain.c程序入口文件 这里chipcon_cstartup.s51是汇编的启动文件,ZMain.c相当于main文件,里面有main函数: 1 int main( void ) 2 { 3 osal_int_disable( INTS_ALL );// Turn off interrupts 关中断 4 HAL_

[ZigBee] 15、Zigbee协议栈应用(一)——Zigbee协议栈介绍及简单例子(长文,OSAL及Zigbee入门知识)

1.Zigbee协议栈简介 协议是一系列的通信标准,通信双方需要按照这一标准进行正常的数据发射和接收.协议栈是协议的具体实现形式,通俗讲协议栈就是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议,进而实现无线数据收发. 如图1所示:Zigbee协议分为两部分,IEEE 802.15.4定义了PHY(物理层)和MAC(介质访问层)技术规范:Zigbee联盟定义了NWK(网络层).APS(应用程序支持层).APL(应用层)技术规范.Zigbee协议栈就是将各个层定义的协议都集合在一起,

「ZigBee模块」zigbee协议栈网络管理

Zigbee协议栈网络管理 一.补充基础知识 每个cc2530芯片出厂时候都有一个全球唯一的32位MAC地址,当设备连入网络的时候,每个设备都能获得由协调器分配的16位短地址,协调器默认地址0x0000,很多时候网络就是通过短地址进行管理. 二.实验现象 路由器.设备终端发送自己定义的设备号给协调器,协调器通过接收到的设备号判断设备类型,并且获取设备的短地址,通过串口打印出来. 三.实验步骤 串口初始化 图1 先在SampleApp.c添加串口通信的头文件.(如图1) #include “MT_

(zigbee学习总结一)zigbee协议栈中OSAL运行机理

在基于zigbee协议栈的应用程序开发过程中,用户只需要实现应用层的开发即可,zigbee应用程序框架中包含了最多240个应用程序对象,每个应用程序对象运行在不同的端口上,因此端口的最作用是区分不同的应用程序对象,可以把一个应用程序对象看成为一个任务.因此,需要一个机制来实现任务的切换.同步和互斥,这就是OSAL产生的根源. OSAL用一句话来说就是指支持多任务运行的系统资源分配机制.OSAL中有三个参数非常重要,即:tasksCnt.tasksEvent[]和tasksArr[]. (1)ta

Android 7.0 Power 按键处理流程

Android 7.0  Power 按键处理流程 Power按键的处理逻辑由PhoneWindowManager来完成,本文只关注PhoneWindowManager中与Power键相关的内容,其他系统按键的处理类似也是在PhoneWindowManager中处理的.理解了power按键的处理再看其他系统按键的逻辑会容易的多也简单的多. 一.Power按键的上报 Power按键的上报流程与其余的按键处理流程一致,在按下power按键后驱动上报按键经InputManagerService处理按键

zigbee协议栈应用与组网(二):串口基础实验

资料里的实验都是已经做好了的,所以我下载了一个全新的ZStack-2.5.1a来做实验,按照步骤做,发现了很多问题. 第一步,配置串口. MT_UART.c中的MT_UartInit(); baudRate设置为115200(默认是38400),flowControl设置为FALSE. 第二步,预定义宏. MT_UartInit()后还有一小部分 1.2行根据预先定义的 ZTOOL或者ZAPP选择不同的数据处理函数. 后面的P1和P2则是串 口0和串口1.我们用ZTOOL,串口0.我们可以在op