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 */}

梦想让我与众不同,奋斗让我改变命运!

zigbee协议栈之按键处理流程

相关文章:

你感兴趣的文章:

标签云: