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