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.

CC2640R2F 停止廣播失敗

Other Parts Discussed in Thread: CC2640R2F

Hi TI team,

開發環璄為:simplelink_cc2640r2_sdk_4_10_00_10

使用範例為:examples\rtos\CC2640R2_LAUNCHXL\blestack\simple_peripheral_oad_offchip

目前做的實驗為開機5秒後停止廣播, 以下是在simple_peripheral_oad_offchip.c  做的程式變動部份:

static Clock_Struct stopAdvClock;

static void stopAdv_clockHandler(UArg arg)
{

    uint8_t adv_enable = 0;

    GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t),  &adv_enable);

}

static void SimplePeripheral_init(void)
{

 .....

    Util_constructClock(&stopAdvClock, stopAdv_clockHandler,
                                        5000, 0, FALSE, FALSE);

    Util_startClock(&stopAdvClock);

}

為什麼在5秒後, 執行GAPRole_SetParameter 來關閉ADV, 機子就當機不再廣播了..

開了終端機印出debug string, 5秒後會印出">>>STACK ASSERT" 字串,

請問該如何修正用法? 謝謝.

  • 关闭广播使用下面代码试试:     
    uint8_t advertEnabled = FALSE; GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);

    你在主程序中关闭广播是在5秒延时之前还是之后,程序执行到GAPRole_SetParamete后肯定立即就停止了

  • SimplePeripheral_init () 裡預設的程式一開始即開始廣播,
    我只設置了一個5秒後的clock, 去關閉廣播,
    但始終回應STACK Assert.

    順帶一提, 程式是download在 CC2640R2F EVB上做驗證的.
  • 初始化中本来就有个5秒的延时

    // Create one-shot clock for internal periodic events.
      Util_constructClock(&clkPeriodic, SimplePeripheral_clockHandler,
                                   SP_PERIODIC_EVT_PERIOD, 0, false, (UArg)&argPeriodic);
    

    // How often to perform periodic event (in ms) #define SP_PERIODIC_EVT_PERIOD 5000

    按照你的操作5秒后就将广播关闭了,不会再广播。

    关于终端打印STACK Assert,请看这里:

    // Open the display if the app has not already done so
      if ( !dispHandle )
      {
        dispHandle = Display_open(Display_Type_ANY, NULL);
      }
    
      Display_print0(dispHandle, 0, 0, ">>>STACK ASSERT");

  • Hi Keven,
    謝謝您的回覆.

    但那個clkPeriodic 是在case GAPROLE_CONNECTED 被連線後才會被呼叫Util_startClock(&periodicClock)啟動5秒延遲clock, 此clock 裡的callback handler做的程序也不是關閉ADV.

    simple_peripheral_oad_offchip 這範例在一上電話即會自動開始廣播, 我單純只是加個5秒延遲的clock想驗證GAPROLE_ADVERT_ENABLED 是可以用GAPRole_SetParameter來關閉它, 但始終不成功.

    是否還有其他建議或程式有需要修正的地方? 謝謝.
  • 如果你仅是想验证 GAPRole_SetParameter是否可以关闭广播,进行以下修改就行了:
    uint8_t advertEnabled = FALSE;
    GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);
    还是你想关闭广播之后过段时间再打开?
  • 您好,

    我是想做動態廣播的功能, 要切換廣播名稱的流程, 是要先關閉廣播, 然後再update Adv data, 之後再開啟廣播,本來想實驗這樣的流程是否可行.

    所以先設了一個開機5秒後關閉adv的動作 , 沒想到就assert了.

  • 使用uint8_t advertEnabled = FALSE;
    GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);
    可以关闭广播,也没有发生STACK ASSERT
  • 請問您執行的方式, 也是設置一個5秒的clock後, 在clock callback handler裡呼叫關閉廣播嗎?
    謝謝
  •  你使用的範例是否為C:\ti\simplelink_cc2640r2_sdk_4_10_00_10\examples\rtos\CC2640R2_LAUNCHXL\blestack\simple_peripheral_oad_offchip ?

    在此範例下的GAPRole_SetParameter ( ) API代入的參數數量只有3個, 不像你用的4個參數設定.

    如下

    能否幫忙在同個環境下, 試做看看GAPRole_SetParameter 的api是可以成功關閉ADV ? 謝謝.

  • 我是在simple_broadcaster例程中测的,simple_peripheral_oad_offchip是OAD升级的例程,下载的时候还要烧录bim文件,建议你用simple_broadcaster或者simple_peripheral例程来改,将uint8_t initialAdvertEnable = TRUE;中的true改为FALSE就可以关闭广播了
  • Hi Kevin,

    我新增了一個APP event, 例如SBP_CHANGE_ADV_EVT,
    程式一開始啟動了一個5秒延遲的clock, 當進入clock的callback function後, 去送出SBP_CHANGE_ADV_EVT, 接著在case SBP_CHANGE_ADV_EVT裡才去呼叫GAPRole_SetParameter()的API, 即不會stack assert.

    試問, 為什麼在clock的callback function裡不能直接使用GAPRole_SetParameter()API, 而需要再包一層app event的方式才不會當機呢?
  • 看下关于它们的说明:
    // Create one-shot clock for internal periodic events.
    Util_constructClock(&clkPeriodic, SimplePeripheral_clockHandler,
    SP_PERIODIC_EVT_PERIOD, 0, false, (UArg)&argPeriodic);

    * @fn Util_constructClock
    *
    * @brief Initialize a TIRTOS Clock instance.
    *
    * @param pClock - pointer to clock instance structure.
    * @param clockCB - callback function upon clock expiration.
    * @param clockDuration - longevity of clock timer in milliseconds
    * @param clockPeriod - if set to a value other than 0, the first
    * expiry is determined by clockDuration. All
    * subsequent expiries use the clockPeriod value.
    * @param startFlag - TRUE to start immediately, FALSE to wait.
    * @param arg - argument passed to callback function.
    *
    * @return Clock_Handle - a handle to the clock instance.
    */
    Clock_Handle Util_constructClock(Clock_Struct *pClock,
    Clock_FuncPtr clockCB,
    uint32_t clockDuration,
    uint32_t clockPeriod,
    uint8_t startFlag,
    UArg arg)