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)