This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

如何使CC2541 keyfob 在init時延遲或睡眠一秒鐘

Other Parts Discussed in Thread: CC2541

不好意思

我硬體使用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,

      说的应该是用汇编的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;
      }
    }

x 出现错误。请重试或与管理员联系。