微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 无线和射频 > TI蓝牙设计交流 > 如何使CC2541 keyfob 在init時延遲或睡眠一秒鐘

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

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

不好意思

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

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

网站地图

Top