原创 【原创】ZigBee学习之34——按键部分及系统调用时钟的分析1

2010-2-17 23:55 2182 3 3 分类: MCU/ 嵌入式

按键部分及系统调用时钟的分析


因为我的开发板没有DB的joystick,只有三个可用的独立按键,所以必须对Z-Stack中的按键部分的代码做比较多的修改。修改过程中我们可以看到Zstack对按键的处理,可以更深入地理解协议栈的实现。我首先把代码中关于SW5和SW6的部分全部注释掉了,然后自己声明了一些宏定义。我们主要来看一下函数部分的实现和执行流程。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


//按键初始化部分,设置端口状态,初始化标志变量


void HalKeyInit( void )


{


#if (HAL_KEY == TRUE)


  /* Initialize previous key to 0 */


  halKeySavedKeys = 0;


//因为我在前面已经注释掉了HAL_KEY_SW_6_ENABLE和HAL_KEY_SW_5_ENABLE,所以下面部分代码不执行


#if defined (HAL_KEY_SW_6_ENABLE)


  HAL_KEY_SW_6_SEL &= ~(HAL_KEY_SW_6_BIT);    /* Set pin function to GPIO */


  HAL_KEY_SW_6_DIR &= ~(HAL_KEY_SW_6_BIT);    /* Set pin direction to Input */


#endif


#if defined (HAL_KEY_SW_5_ENABLE)


  HAL_KEY_SW_5_SEL &= ~(HAL_KEY_SW_5_BIT);    /* Set pin function to GPIO */


  HAL_KEY_SW_5_DIR &= ~(HAL_KEY_SW_5_BIT);    /* Set pin direction to Input */


  HAL_KEY_SW_5_INP |= HAL_KEY_SW_5_BIT;       /* Set pin input mode to tri-state */


#endif


 


  //这里是我加的,主要是设置按键链接的IO为通用IO,输入状态


  HAL_KEY_SW_SEL &= ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);      


/*设置管脚功能为GPIO*/


  HAL_KEY_SW_DIR &= ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);      


/*设置管脚为输入*/


  //---------------------------------------


  /* Initialize callback function */


  pHalKeyProcessFunction  = NULL;


  /* Start with key is not configured */


  HalKeyConfigured = FALSE;


#endif /* HAL_KEY */


}


 


//按键配置,根据是否采用中断方式响应按键来进行不同的配置。这里把不相干的部分省略了


void HalKeyConfig (bool interruptEnable, halKeyCBack_t cback)


{


#if (HAL_KEY == TRUE)


  /* Enable/Disable Interrupt or */


  Hal_KeyIntEnable = interruptEnable;


 


  /* Register the callback fucntion */


  pHalKeyProcessFunction = cback;


//上面将传进来的参数送给局部变量,这样可以保护参数,嗯,学习!


  /* Determine if interrupt is enable or not */


  if (Hal_KeyIntEnable)


  {


    //打开中断允许,清除相关的中断标志


    HAL_KEY_SW_PXIF = 0;                               /*清除P1全局中断*/


HAL_KEY_SW_PXIFG = ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);   


/*清除按键1,2,3端口的中断标志*/


HAL_KEY_SW_IEN |= (HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);     


/*允许各按键的中断*/


    HAL_KEY_SW_GLOBAL_IEN |= HAL_KEY_SW_IENBIT;        /*允许P1中断*/


    /* Do this only after the hal_key is configured - to work with sleep stuff */


    if (HalKeyConfigured == TRUE)


    {//第一次配置按键是不会进入到这里执行的,必须配置过一次以后将标志HalKeyConfigured置位才行,但是只要执行按键初始化操作就可以复位HalKeyConfigured标志。


      osal_stop_timerEx( Hal_TaskID, HAL_KEY_EVENT);  /*如果采用中断方式则不用定时器来发送事件,所以关闭以前为这个事件开启的系统时钟*/


    }


  }


  else    /*这里是非中断方式的执行*/


  {


    HAL_KEY_SW_GLOBAL_IEN &= ~HAL_KEY_SW_IENBIT;        /*不允许P1中断*/


HAL_KEY_SW_IEN &= ~(HAL_KEY_SW_1_BIT | HAL_KEY_SW_2_BIT |HAL_KEY_SW_3_BIT);    


/*不允许各按键的中断*/


 


osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_POLLING_VALUE);   


/*此函数根据传进来的参数启创建一个指定任务的定时器并启动,当定时器计时到时就会发出指定的事件给指定的任务。此函数仅仅是为指定事件和指定任务创建了一个时钟,并使时钟运行,那时钟超时的处理函数,事件的发送是在哪里呢? */


//一路跟踪定位:osal_timer_activate()——osal_timer_hw_setup()——HalTimerStart()——HalTimerInterruptEnable()【不要误会为是一个开启中断的标志,这个函数的操作过程是如果定时器配置中的中断允许为开启的话,就开启定时器的中断,如果为不允许的话就不开启中断,所以其实这是一个定时器中断配置函数。至此已没有能继续跟踪的函数。那么猜想应该是开启了总中断,在定时器计时到时进入中断服务程序进行相关事件和消息的发送,应为系统时钟使用的是一个8位的定时器。


#define OSAL_TIMER  HAL_TIMER_2


#define HAL_TIMER_2                0x02    // 8bit timer


我们关键来看看这个定时器的配置情况】


//在函数void InitBoard()【OnBoard.c】中可以发现对系统定时器的配置:

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
3
关闭 站长推荐上一条 /3 下一条