找回密码
 立即注册

微信扫码登录

查看: 411|回复: 6

[BLE SDK] tl_ble_sdk suspend模式休眠唤醒后广播不生效

[复制链接]

9

主题

15

回帖

179

积分

荣耀黄金

积分
179
发表于 2026-7-17 16:40:50 | 显示全部楼层 |阅读模式 来自 广东广州
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: TL3218
SDK及版本: V4.0.4.6

请教下,tl_ble_sdk中MCU进入suspend休眠模式,当MCU唤醒后重新启动BLE广播不生效,NRF Connect搜索不到广播。
1、仅启动了BLE peripheral角色;进入suspend休眠会前断开BLE连接、以及停止了BLE 广播。
2、通过api 设置suspend休眠:cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_PAD | PM_WAKEUP_TIMER, platform_timer_get_first_tick());
3、gpio唤醒后重新启动BLE 广播,但是在NRF Connect搜索不到广播。
4、手动关机(设备上有关机按键),关机后MCU是进入deepsleep retention休眠模式;这时再开机唤醒启动BLE广播是ok的。
5、以下是我工程的休眠配置代码
#define PLATFORM_SLEEP_WAKEUP_TIME       TRACKER_SEC_TO_US(3)

void platform_power_management_poll(uint8_t cansleep, uint8_t deepsleep)
{
#if __has_include("tl_common.h")
#if (BLE_APP_PM_ENABLE)
    if (tlkapi_debug_isBusy() || !cansleep) {
        blc_pm_setSleepMask(PM_SLEEP_DISABLE);
        return ;
    } else {
        if (deepsleep) {
            blc_pm_setDeepsleepRetentionEnable(PM_DeepRetn_Enable);
        } else {
            blc_pm_setDeepsleepRetentionEnable(PM_DeepRetn_Disable);
        }

        platform_gpio_set_sleep_wakeup();
        blc_pm_setSleepMask(PM_SLEEP_LEG_ADV | PM_SLEEP_LEG_SCAN | PM_SLEEP_ACL_PERIPHR | PM_SLEEP_ACL_CENTRAL);
        if (!platform_ota_is_working()) {
            if (blc_ll_isBleTaskIdle()) {
                platform_timer_wakeup_start(PLATFORM_SLEEP_WAKEUP_TIME);
                if (deepsleep) {
                    cpu_sleep_wakeup(DEEPSLEEP_MODE_RET_SRAM_LOW96K, PM_WAKEUP_PAD | PM_WAKEUP_TIMER, platform_timer_get_first_tick());
                } else {
                    cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_PAD | PM_WAKEUP_TIMER, platform_timer_get_first_tick());
                }
            } else {
                blc_pm_setWakeupSource(PM_WAKEUP_PAD);
            }
        } else {
            bls_pm_setManualLatency(0);
        }
    }
#endif
#endif
}

0

主题

37

回帖

152

积分

版主

积分
152
发表于 2026-7-30 16:13:16 | 显示全部楼层 来自 上海
你在睡眠唤醒后做一下RF的初始化,参考main.c中的处理,应该就可以了

9

主题

15

回帖

179

积分

荣耀黄金

积分
179
 楼主| 发表于 2026-7-31 19:03:40 | 显示全部楼层 来自 广东广州
TL_HWJ 发表于 2026-7-30 16:13
你在睡眠唤醒后做一下RF的初始化,参考main.c中的处理,应该就可以了

不是RF初始化的问题,在acl_peripheral_demo上做测试,使用TL3218开发板C1T335A20_V1_3 TL3218x-EVK64D 2024-09-09测试,app_config.h配置:
#define BLE_APP_PM_ENABLE             1
#define PM_DEEPSLEEP_RETENTION_ENABLE 0
两个按键,一个按键控制关闭广播,一个按键开启广播;重新开启广播后,不允许进入休眠,此时无法在NRF Connect上扫描到广播。若重启开启广播后,并且允许进入休眠则广播正常。
按键控制key_change_proc内:
key_type = CONSUMER_KEY;
u16 consumer_key;
if (key0 == CR_VOL_UP) {        //volume up
consumer_key = MKEY_VOL_UP;
tlkapi_send_string_data(APP_KEY_LOG_EN, "[UI][KEY] send Vol +", 0, 0);
uaer_app_ble_start();
} else if (key0 == CR_VOL_DN) { //volume down
consumer_key = MKEY_VOL_DN;
tlkapi_send_string_data(APP_KEY_LOG_EN, "[UI][KEY] send Vol -", 0, 0);
user_app_ble_stop();
}
其中:
static uint8_t adv_on = FALSE;
void user_app_ble_stop(void)
{
    blc_ll_setAdvEnable(BLC_ADV_DISABLE);
    adv_on = FALSE;
}

void uaer_app_ble_start(void)
{
    blc_ll_setAdvEnable(BLC_ADV_DISABLE);
    blc_ll_setAdvData(tbl_advData, sizeof(tbl_advData));
    blc_ll_setScanRspData(tbl_scanRsp, sizeof(tbl_scanRsp));
    blc_ll_setAdvParam(ADV_INTERVAL_200MS, ADV_INTERVAL_200MS, ADV_TYPE_CONNECTABLE_UNDIRECTED, OWN_ADDRESS_PUBLIC, 0, NULL, BLT_ENABLE_ADV_ALL, ADV_FP_NONE);
    blc_ll_setAdvEnable(BLC_ADV_ENABLE);
    adv_on = TRUE;
}

休眠:
void app_process_power_management(void)
{
#if (BLE_APP_PM_ENABLE)
    //Log needs to be output ASAP, and UART invalid after suspend. So Log disable sleep.
    //User tasks can go into suspend, but no deep sleep. So we use manual latency.
    if (tlkapi_debug_isBusy() || adv_on) {
        blc_pm_setSleepMask(PM_SLEEP_DISABLE);
    } else {
        int user_task_flg = 0;

        blc_pm_setSleepMask(PM_SLEEP_LEG_ADV | PM_SLEEP_ACL_PERIPHR);

    #if (BLE_OTA_SERVER_ENABLE)
        user_task_flg |= ota_is_working;
    #endif

    #if (UI_KEYBOARD_ENABLE)
        user_task_flg |= user_task_flg || scan_pin_need || key_not_released;
    #endif
        blc_pm_setDeepsleepRetentionEnable(PM_DeepRetn_Disable);
        if (blc_ll_isBleTaskIdle()) {
            cpu_sleep_wakeup(SUSPEND_MODE, PM_WAKEUP_PAD, 0);
        }

        else if (user_task_flg) {
            bls_pm_setManualLatency(0);
        }
    }
#endif
}

9

主题

15

回帖

179

积分

荣耀黄金

积分
179
 楼主| 发表于 2026-7-31 19:05:28 | 显示全部楼层 来自 广东广州
TL_HWJ 发表于 2026-7-30 16:13
你在睡眠唤醒后做一下RF的初始化,参考main.c中的处理,应该就可以了

需要suspend模式唤醒后不再进入休眠

9

主题

15

回帖

179

积分

荣耀黄金

积分
179
 楼主| 发表于 5 天前 | 显示全部楼层 来自 广东广州
这是我基于acl_peripheral_demo示例上修改测试的代码,修改的点不多。第一开启PM休眠管理、关闭深度休眠;第二两个按键 一个按键关闭广播、一个按键开启广播;第三开启广播后blc_pm_setSleepMask(PM_SLEEP_DISABLE);关闭休眠

acl_peripheral_demo.zip

31.9 KB, 下载次数: 1

基于acl_peripheral_demo修改测试的代码

0

主题

76

回帖

253

积分

版主

积分
253
发表于 4 天前 | 显示全部楼层 来自 上海
进入 suspend 休眠期间射频模块断电,寄存器配置丢失;因此唤醒、链路重连之后需要重载 RF 相关配置。

参考附件图片:
2026-08-07_17-37-26.png

9

主题

15

回帖

179

积分

荣耀黄金

积分
179
 楼主| 发表于 昨天 17:21 | 显示全部楼层 来自 广东广州
TL_ZRL 发表于 2026-8-7 17:39
进入 suspend 休眠期间射频模块断电,寄存器配置丢失;因此唤醒、链路重连之后需要重载 RF 相关配置。

参 ...

按照您截图方式添加rf初始化,实际测试按键唤醒后,NRF Connect上依旧是扫描不到广播的,您可以实际试下。改动内容不多,如附件。 image.png
image.png

acl_peripheral_demo.zip

31.91 KB, 下载次数: 0

添加了rf_drv_ble_init的demo工程

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Telink forum ( 沪ICP备17008231号-1 )

GMT+8, 2026-8-11 09:28 , Processed in 0.104865 second(s), 26 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表