微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > CC2541通过外部中断从电池模式中唤醒时是如何恢复蓝牙运行状态的?

CC2541通过外部中断从电池模式中唤醒时是如何恢复蓝牙运行状态的?

时间:10-02 整理:3721RD 点击:

CC2541通过外部中断从电池模式中唤醒时是如何恢复蓝牙运行状态的?

跟踪代码

中断:

HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
  HAL_ENTER_ISR();

#if defined ( CC2540_MINIDK )
  if ((HAL_KEY_SW_1_PXIFG & HAL_KEY_SW_1_BIT) || (HAL_KEY_SW_2_PXIFG & HAL_KEY_SW_2_BIT))
#else
  if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
#endif
  {
    halProcessKeyInterrupt();
	HalKeyInit();
//		(P2 = (P2 & (~(1<<0))) | (1<<0));
  }

  /*
    Clear the CPU interrupt flag for Port_0
    PxIFG has to be cleared before PxIF
  */
#if defined ( CC2540_MINIDK )
  HAL_KEY_SW_1_PXIFG = 0;
  HAL_KEY_SW_2_PXIFG = 0;
#else
  HAL_KEY_SW_6_PXIFG = 0;
#endif
  HAL_KEY_CPU_PORT_0_IF = 0;

  CLEAR_SLEEP_MODE();

  HAL_EXIT_ISR();

  return;
}
void halProcessKeyInterrupt (void)
{
  bool valid=FALSE;

 
  if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)  /* Interrupt Flag has been set */
  {
	HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); /* Clear Interrupt Flag */
	valid = TRUE;
  }
  if (valid)
  {
    osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);
  }
}
uint16 Hal_ProcessEvent( uint8 task_id, uint16 events )
{
	if (events & HAL_KEY_EVENT)
	{
#if (defined HAL_KEY) && (HAL_KEY == TRUE)

		WeakupUARTInit();
		HalKeyInit();	
#include "..\..\..\Projects\ble\BLE_Bridge\Source\BLE_Bridge.h" //SBP_START_DEVICE_EVT
		extern uint8 BLE_Bridge_TaskID;
		osal_start_reload_timer( BLE_Bridge_TaskID, SBP_SCAN_KEY_EVT, 20 );
#endif
		return events ^ HAL_KEY_EVENT;
	}
}

从这些代码来看并没有涉及蓝牙相关的操作,那么蓝牙部分是如何被执行起来的?

重点是调用什么函数可以产生类似的效果?我现在蓝牙会突然不广播,但是进入休眠状态再打开就正常了。想在处理模仿这样的操作

是中断事件会触发一个OSAL message,在x_ProcessOSALMsg处理函数中,会判断是什么事件,然后会做对应的操作

唤醒后执行中断服务程序:

 if (valid)

  {

    osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);///在这里

  }

蓝牙通信专门有一个定时器!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top