TI中文支持网
TI专业的中文技术问题咨询交流网站

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" 字串,

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

Kevin Qiu1:

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

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

Erin Chen:

回复 Kevin Qiu1:

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

順帶一提, 程式是download在 CC2640R2F EVB上做驗證的.

Kevin Qiu1:

回复 Erin Chen:

初始化中本来就有个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_PERIOD5000

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

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

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

回复 Kevin Qiu1:

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來關閉它, 但始終不成功.

是否還有其他建議或程式有需要修正的地方? 謝謝.

Kevin Qiu1:

回复 Erin Chen:

如果你仅是想验证GAPRole_SetParameter是否可以关闭广播,进行以下修改就行了:uint8_t advertEnabled = FALSE;GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);
还是你想关闭广播之后过段时间再打开?

Erin Chen:

回复 Kevin Qiu1:

您好,

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

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

Kevin Qiu1:

回复 Erin Chen:

使用uint8_t advertEnabled = FALSE;
GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &advertEnabled, NULL);
可以关闭广播,也没有发生STACK ASSERT

Erin Chen:

回复 Kevin Qiu1:

請問您執行的方式, 也是設置一個5秒的clock後, 在clock callback handler裡呼叫關閉廣播嗎?
謝謝

Erin Chen:

回复 Kevin Qiu1:

 你使用的範例是否為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 ? 謝謝.

Kevin Qiu1:

回复 Erin Chen:

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

赞(0)
未经允许不得转载:TI中文支持网 » CC2640R2F 停止廣播失敗
分享到: 更多 (0)