首先要区分,按键的处理和PROFILES中的按键服务是完全两个维度,两码事。simplekeys.c是一种profile,类似simpleGATTprofile.c。
本文关注协议栈中按键是怎么从底层单片机一路向上,送到应用层处理的。
1、顺着代码逻辑从头看起,涉及到按键的最早是在main函数中先调用了HalDriverInit函数,void HalDriverInit (void)调用了HalKeyInit();设置IO口功能和方向,然后将全局变量HalKeyConfigured = FALSE;
2、main函数的osal_init_system中调用了SimpleBLEPeripheral.c 的 SimpleBLEPeripheral_Init ,其中有
RegisterForKeys( simpleBLEPeripheral_TaskID );//其中仅仅做一件事,参数赋值给全局变量:registeredKeysTaskID = task_id;
3、接着还是main函数中一系列初始化的后半部分有:InitBoard( OB_READY ); 其中就干了两件事:先把全局变量OnboardKeyIntEnable赋值1;
4、然后InitBoard中调用HalKeyConfig( OnboardKeyIntEnable, OnBoard_KeyCallback);
HalKeyConfig做了什么事呢?
赋值给一个全局变量: pHalKeyProcessFunction = cback; 也就是pHalKeyProcessFunction =OnBoard_KeyCallback后面会用到这个全局变量。
开启中断、设置IO口中断方式。
然后在if (Hal_KeyIntEnable)前提下:
if (HalKeyConfigured == TRUE)//这里第一次进来,所以不走这个。
{
osal_stop_timerEx(Hal_TaskID, HAL_KEY_EVENT); /* Cancel polling if active */
}
最后 HalKeyConfigured = TRUE;
到这里就可以等单片机的中断信号了。
IAR中常用的中断函数定义方式为:
#pragma vector=T1_VECTOR //(h文件中定义的中断向量)
__interrupt void 中断服务程序名任意(void)
{
//中断处理程序
}
2540协议栈类似,不过是加了宏定义绕了个弯:
HAL_ISR_FUNCTION( halKeyPort2Isr, P2INT_VECTOR )
{
HAL_ENTER_ISR();
if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT)
{
halProcessKeyInterrupt();
}
CLEAR_SLEEP_MODE();
HAL_EXIT_ISR();
return;
}<