|
查看: 320|回复: 10

[BLE SDK] 心率测量时,mcu不进入deep-retention sleep 模式的问题

[复制链接]

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
发表于 2026-8-17 17:56:33 | 显示全部楼层 |阅读模式 来自 广东深圳
Information
说明:   建议参照本版块置顶帖内容输入必要信息
芯片型号: TL7218
SDK及版本: V4.0.4.5
3d61a9ae-c499-4b2a-b67d-bf830fc7d429.png bc28e0b5-d485-4235-aa5f-ab336cca2051.png
在7218平台上,移植天易合芯HX3697心率模块的驱动、算法包,功能ok, 但是功耗有问题,没有按照代码设定 进入 deep-sleep。

如上图所示:  hx3697 驱动 代码需要用两个timer, 一个40ms的用作 AGC 调光; 另一个280ms的用作 读取 PPG -FIFO 数据 并且跑 算法;
从图上看,40ms的timer没有问题, 320ms的timer,执行完成后 mcu 有200ms的时间内 一直处于 suspend 状态(板子电流2ma左右); 按照代码里面的设定,idle 时间超过20ms,就应该进入 deep sleep 的。

3d61a9ae-c499-4b2a-b67d-bf830fc7d429.png
bc28e0b5-d485-4235-aa5f-ab336cca2051.png

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
 楼主| 发表于 2026-8-17 18:07:56 | 显示全部楼层 来自 广东深圳
上面文字描叙有一个错误:  ppg timer  是 280ms; hx3697 原本代码是320, 我在调试的时候改为了280;
另外:代码中所用的为 free rtos 的 timer

0

主题

8

回帖

52

积分

不屈白银

积分
52
发表于 2026-8-18 14:18:15 | 显示全部楼层 来自 上海
1. 贴一下 app_process_power_management 这个函数
2. 有没有配置GPIO PAD唤醒
3. 把PM关掉看一下整板底电流是2mA左右吗?

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
 楼主| 发表于 2026-8-18 19:55:11 | 显示全部楼层 来自 广东深圳
pm.png

IO 中断有两个:  
     1、IO_PA6   g-Sensor 中断
     2、IO_PA5   充电中断。
pm.png

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
 楼主| 发表于 2026-8-19 09:29:32 | 显示全部楼层 来自 广东深圳
    #if defined(__CW_COMMON__)
    else if (1 || cw_heap_is_being_used() || bsp_service_is_busy()) {        // Taylor.Le, __CW_COMMON__ cw-heap没有释放、或者 bsp-busy 时,禁止 deep-sleep
        blc_pm_setSleepMask(PM_SLEEP_DISABLE);
    }
    #endif
刚刚试了一下, 把上面代码改为 if (1 || ...) 后,测量得的待机电流就是2毫安左右

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
 楼主| 发表于 2026-8-19 09:56:59 | 显示全部楼层 来自 广东深圳
5d2ecec0-f34c-45a8-b5a7-addebafffa06.png

这张测量电流的图片:   当 OS timer 响应完成后,系统有131毫秒的 suspend 状态,直到一次蓝牙广播的时间到达后,才进入 deep sleep 模式; 按照代码设置,超过20ms就应该进入deep sleep;
5d2ecec0-f34c-45a8-b5a7-addebafffa06.png

0

主题

8

回帖

52

积分

不屈白银

积分
52
发表于 2026-8-19 11:25:13 | 显示全部楼层 来自 上海
Taylor.Le 发表于 2026-8-19 09:56
这张测量电流的图片:   当 OS timer 响应完成后,系统有131毫秒的 suspend 状态,直到一次蓝牙广播的时 ...

中间那段没有进休眠的时间,确认下 PA6  和 PA5  是不是一直处于唤醒的状态,假设你设置的高电平唤醒,是不是这俩IO一直处于高电平状态,这也会导致一直进不了休眠。

另外,也可以在 app_process_power_management 这个函数中所有 blc_pm_setSleepMask(PM_SLEEP_DISABLE); 的地方加log或者IO翻转,来进一步确认是哪个条件触发了不进休眠。

0

主题

8

回帖

52

积分

不屈白银

积分
52
发表于 2026-8-19 11:37:35 | 显示全部楼层 来自 上海
Taylor.Le 发表于 2026-8-19 09:56
这张测量电流的图片:   当 OS timer 响应完成后,系统有131毫秒的 suspend 状态,直到一次蓝牙广播的时 ...

这里的131ms应该是没进休眠,不是进了suspend状态, 可以在 user_set_flag_suspend_exit 这个函数中加log或者IO翻转来确认是不是进suspend状态了,进入suspend唤醒后会调用这个回调函数

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
 楼主| 发表于 2026-8-19 15:21:27 | 显示全部楼层 来自 广东深圳
ac21cee1-cc6d-4ed8-80bc-3457ac99d209.png 9ee8c103-fd58-4057-86cb-a7c20b548ea2.png 4dc0a6c9-fd92-4f02-902b-24ab247706f7.png

在开发板上执行 acl_peripheral_demo 这个工程,  修改:
1、 蓝牙广播间隔为 500ms;
2、 DeepsleepRetentionThreshold 为 20ms;  
3、 在 ble_task  函数中启动一个 320ms 的 os timer。
从测量的板子电流图上看, 每次ble广播之后, 系统可以进入 低功耗模式;  但是 os timer 响应完成后,系统进不了低功耗。
ac21cee1-cc6d-4ed8-80bc-3457ac99d209.png
9ee8c103-fd58-4057-86cb-a7c20b548ea2.png
4dc0a6c9-fd92-4f02-902b-24ab247706f7.png

2

主题

6

回帖

36

积分

英勇黄铜

积分
36
 楼主| 发表于 2026-8-19 15:24:26 | 显示全部楼层 来自 广东深圳
开发板型号: bb67fd55-c409-4f34-b772-4b873f65ccbe.png
bb67fd55-c409-4f34-b772-4b873f65ccbe.png

本版积分规则

关注公众号
Telink forum

相关侵权、举报、投诉及建议等,请发 E-mail:forum@telink-semi.com

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.|沪ICP备17008231号-1 |沪公网安备31011502403548号

在本版发帖返回顶部