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);///在这里
}
蓝牙通信专门有一个定时器!