如何使CC2541 keyfob 在init時延遲或睡眠一秒鐘
不好意思
我硬體使用CC2541 keyfob,軟體使用keyfobproject
我在keyfobdemo.c中的KeyFobApp_Init中加入了PTM模式,判斷P0_4為low時進入PTM模式,程式如下
if (P0_4==0)
{
HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH );
HalUARTWrite(0,"version:1.2" ,11);
HCI_EXT_EnablePTMCmd();
}
我需要在程式判斷if (P0_4==0)前,使程式延遲或是睡眠一秒。
定義POWER_SAVING後,在keyfobdemo.c中的KeyFobApp_Init開頭加入HalSleep(2000);
那請問是2秒鐘後,CC2541 會自己wake up嗎?
還是需要用甚麼參數喚醒???
謝謝你們的指導
一秒你没必要搞那么复杂 用NOP指令 循环1秒
NOP 指令 ?? 可以說明詳細一點嗎??
謝謝
Hi wun,
CC2540蓝牙4.0BLE开发 说的应该是用汇编的nod 计时.
你用halsleep() 有什么问题吗?
定義POWER_SAVING後,在keyfobdemo.c中的KeyFobApp_Init開頭加入HalSleep(2000)
讓CC2541進入睡眠2秒鐘後判斷P0_4是否為Low,Low的話就進入PTM模式,不是Low就維持正常行為
程式如下:
void KeyFobApp_Init( uint8 task_id )
{
keyfobapp_TaskID = task_id;
halSleep(2000);
if (P0_4==0)
{
HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH );
HalUARTWrite(0,"version:1.2" ,11);
HCI_EXT_EnablePTMCmd();
}
osal_start_timerEx( keyfobapp_TaskID, KFD_START_DEVICE_EVT, STARTDELAY );
} //KeyFobApp_Init end
問題1:
那請問是2秒鐘後,CC2541 會自己wake up嗎?
問題2:
當我將P0_4接Low時,CC2541 Keyfob有停止2秒鐘接著進入PTM模式
但當將P0_4接High時,CC2541 Keyfob卻一直沒有進入正常模式,而且一直沒有動作,好像一直處於睡眠模式
請問這是甚麼問題呢?
hi wun,
你这样就是进入PM3了, 这种情况下不会自动唤醒. 只能用IO口通过中断唤醒, 比如说按键.
但是如果你掉哦那个halsleep()之前启动一个timer, 让它2秒种以后发个事件, 比如去查询一下IO口状态之类, 这样是可以保证系统运作正常的.
所以當我使用halsleep()後,可判斷當P0_4 ==1時,不做任何事,然後他就跳出if迴圈,就接著做正常程序 ???
程式判斷如下:
if(P0_4 == 1)
{
//do nothing
}else if(P0_4 ==0) {
HalLedSet( HAL_LED_2, HAL_LED_MODE_FLASH );
HalUARTWrite(0,"version:1.2" ,11);
HCI_EXT_EnablePTMCmd();
}
那除了halsleep()的睡眠函數可使用,是否有其他類似延遲的參數可以使用??
就單純讓CC2541 裝置停止運作一段時間,如:1秒,這段時間不做任何事,只是單純的延遲 ??
延迟一秒的目的是什么?这段程序是针对标准蓝牙测试仪的,接上蓝牙测试仪,如MT8852B,它会自动拉低这个引脚。
由於我們的製具"上電"及"拉低P0_4 "這2個動作是同時的,因此有時可以進入PTM模式,有時則沒辦法
因此上電後,讓程式延遲一秒,接著再去判斷P0_4是否被拉低,以確認每次都可以進入PTM模式
如下:延长n毫秒。初始化调用没什么问题,启动了协议栈,不要调用。会影响协议栈执行。
#define ASM_NOP asm("NOP")
/**************************************************************************************************
* @fn halSleepWait
*
* @brief Perform a blocking wait for the specified number of microseconds.
* Use assumptions about number of clock cycles needed for the various instructions.
* This function assumes a 32 MHz clock.
* NB! This function is highly dependent on architecture and compiler!
*
* input parameters
*
* @param duration - Duration of wait in microseconds.
*
* output parameters
*
* None.
*
* @return None.
**************************************************************************************************
*/
#pragma optimize=none
void halSleepWait(uint16 duration)
{
duration >>= 1;
while (duration-- > 0)
{
ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP;
ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP;
ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP; ASM_NOP;
}
}