CC2541 OSAL中按键处理过程全解析

首先要区分,按键的处理和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;
}<
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值