[BLE(低功耗蓝牙)] BlueNRG-1又要低功耗又要计时器怎么办?

littleshrimp   2018-1-27 22:29 楼主
挑战赛里需要使用BlueNRG-1发送时间到手机,单位是毫秒
计时的我们一搬是通过定时器来实现,BlueNRG-1有2个multifunctions timers (MFT)和一个RTC定时器可供选择
低功耗方面BlueNRG-1有4种工作模式RUNNING、CPU_HALT、WAKETIMER和NOTIMER
image001.jpg
RUNNING为运行模式功耗最高,CPU_HALT模式下只有CPU停止工作,WAKETIMERT和NOTIMER模式下CPU和所有外设均停止工作(蓝牙除外)
不同的是WAKETIMERT在蓝牙处于广播或连接的时候可以使用一个叫VTimer的定时器唤醒
image002.jpg
更多低功耗信息可以参考官方应用笔记AN4820: BlueNRG-1 and BlueNRG-2 low power modes
http://www.st.com/content/ccc/resource/technical/document/application_note/group0/17/f2/d8/23/03/01/47/a9/DM00263007/files/DM00263007.pdf/jcr:content/translations/en.DM00263007.pdf
通常情况为了降低整体工作电流我们会在空闲时进入WAKETIMERT或NOTIMER模式,遗憾的是这两种模式下所有外设都被关闭,不仅仅关闭MFT,RTC定时器也无法正常工作
这时候定时工作只能考虑那个用于唤醒的VTimer定时器,还好这个定时器提供了很多我们想要的功能,在bluenrg1_stack.h头文件里有控制VTimer的函数
可以选择4个(0~3)用于唤醒BlueNRG-1的VTimer计数器,和传统定时器类似,超时唤醒在定时器设置的指定时间到达后被触发
例如我们可以设置VTimer分别间隔5s和7s被重复唤醒,同时还可以执行唤醒后的回调函数void HAL_VTimerTimeoutCallback(uint8_t timerNum); timerNum对应4个超时计数器的其中一个
intHAL_VTimerStart_ms(uint8_t timerNum, int32_t msRelTimeout);用于让VTimer定时器的timerNum计数器在msRelTimeout毫秒后唤醒BlueNRG-1
voidHAL_VTimer_Stop(uint8_t timerNum);用于关闭VTimer定时器的timerNum计数器的超时唤醒功能
有了超时唤醒我们可以在VTimerTimeoutCallback中断里对一个变量进行计数,例如1秒钟唤醒一次时计数单位为1秒
不过这会存在一个问题,超时时间设长了时间精度不够,设短了频繁唤醒会增加电流消耗
好在VTimer很够意思,除了超时唤醒它还提供更多我们想要的功能
函数uint32_t HAL_VTimerGetCurrentTime_sysT32(void);用来于返回VTimer计数器的当前计数数值
int32_tHAL_VTimerDiff_ms_sysT32(uint32_t sysTime1, uint32_t sysTime2);用于返回2个数值对应的时间差,单位为毫秒
我们可以在需要计时的时候通过HAL_VTimerGetCurrentTime_sysT32获得当前计数,保存然后在需要获得时间时再获得一次当前计数
然后通过HAL_VTimerDiff_ms_sysT32计数当前与第一次计数之间的时间差
HAL_VTimerDiff_ms_sysT32反回一个int32的数值
int32对应的值为-2147483648~2147483647
测试发现409.6个sysTime会对应1个毫秒,所以HAL_VTimerDiff_ms_sysT32最大可以返回不超过87.3分钟的时间差

虾扯蛋,蛋扯虾,虾扯蛋扯虾

回复评论 (22)

这个背后就是 Watchdog Timer 吧. 确实,RTC在低功耗模式下都不能用,比较惨。 ---------------------------------------------------------------------------------- 研究下,可能不是用WDG。手册提到有两个BLE Timer,没有说细节。 wakeup.PNG 搞清楚实现要去分析 HAL VTimer 函数的代码了。 本帖最后由 cruelfox 于 2018-1-28 00:16 编辑
点赞  2018-1-27 23:15
外设功能都整合完毕了,也正在纠结这个定时怎么搞。看了版主littleshrimp虾扯蛋的这篇,省了我不少时间,哈哈,谢谢littleshrimp分享。低功耗这块,没有工具,指标没法给出。
点赞  2018-1-28 18:50
谢谢楼主,整合到现在的代码中
点赞  2018-1-29 09:09
楼主您好,想问一下您,我是在主函数初始化您所说的HAL_VTimerStart_ms,但是初始化之后,就会死在此处。您能指点一下吗?
点赞  2018-1-29 09:46
引用: tang187 发表于 2018-1-29 09:46
楼主您好,想问一下您,我是在主函数初始化您所说的HAL_VTimerStart_ms,但是初始化之后,就会死在此处。您 ...

是执行HAL_VTimerStart_ms函数后卡在HAL_VTimerStart_ms里不能正常返回吗?
timerNum和msRelTimeout分别设的多少?
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2018-1-29 11:33
引用: littleshrimp 发表于 2018-1-29 11:33
是执行HAL_VTimerStart_ms函数后卡在HAL_VTimerStart_ms里不能正常返回吗?
timerNum和msRelTimeout分别 ...

                 if(HAL_VTimerStart_ms(1, 10000) == 1)
    {
        printf("HAL_VTimerStart_ms  Fail \r\n");
    }
    printf("HAL_VTimerStart_ms  OK\r\n");
这样的
点赞  2018-1-29 11:49
引用: tang187 发表于 2018-1-29 11:49
if(HAL_VTimerStart_ms(1, 10000) == 1)
    {
        printf("HAL_VTimerStart_ms  Fail \r\n");
...

调试时代码卡在哪个位置?
这个例程里有HAL_VTimerStart_ms的使用
在main.c的sleep_timer函数中
你可以试试
STMicroelectronics\BlueNRG-1_2 DK 2.5.0\Project\BlueNRG1_Periph_Examples\Micro\Sleep_Test
虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2018-1-29 11:56
引用: littleshrimp 发表于 2018-1-29 11:56
调试时代码卡在哪个位置?
这个例程里有HAL_VTimerStart_ms的使用
在main.c的sleep_timer函数中
你可 ...

三克油,我试一下
点赞  2018-1-29 15:50
引用: littleshrimp 发表于 2018-1-29 11:56 调试时代码卡在哪个位置? 这个例程里有HAL_VTimerStart_ms的使用 在main.c的sleep_timer函数中 你可 ...
使用这种模式开启Beacon广播之后,就会唤醒呀。 本帖最后由 tang187 于 2018-1-29 21:47 编辑
点赞  2018-1-29 21:37
引用: tang187 发表于 2018-1-29 21:37
使用这种模式开启Beacon广播之后,就会唤醒呀。

蓝牙发送数据时会唤醒处理器 可以通过关闭广播解决这个问题
点赞  2018-1-29 22:44
为什么我在睡眠模式下开启这个定时器 但是回调函数没有响应
点赞  2018-9-13 15:14
引用: sfd123654 发表于 2018-9-13 15:14
为什么我在睡眠模式下开启这个定时器 但是回调函数没有响应

可以参考一下这个文件HAL_VTimerTimeoutCallback在626行
VTimer配置可以搜索APPL_TIMER可看对应代码

demo_application.c (24.82 KB)
(下载次数: 17, 2018-9-14 18:14 上传)


虾扯蛋,蛋扯虾,虾扯蛋扯虾
点赞  2018-9-14 18:14
大虾,能帮忙看下我的这个关于VTimer的定时问题吗。https://bbs.eeworld.com.cn/thread-1060688-1-1.html。感谢了····
点赞  2018-11-20 14:55

请问 虾神,请问BlueNRG 的系统时间是哪个接口?

点赞  2020-5-27 10:49
引用: IrisArtz- 发表于 2020-5-27 10:49
请问 虾神,请问BlueNRG 的系统时间是哪个接口?

系统时间哪个接口?你是说RTC吗?
点赞  2020-5-27 12:46
引用: littleshrimp 发表于 2020-5-27 12:46 系统时间哪个接口?你是说RTC吗?

是的,RTC计时的接口在那里,长时间会有溢出吗。。?求教

点赞  2020-5-27 13:18
引用: IrisArtz- 发表于 2020-5-27 13:18
是的,RTC计时的接口在那里,长时间会有溢出吗。。?求教

文档和例程里都有介绍 你先看看
点赞  2020-5-27 13:21
请问虾神,"可以选择4个(0~3)用于唤醒BlueNRG-1的VTimer计数器"  那么如果我的代码中需要超过4个计时器,该如何处理呢?
点赞  2020-5-28 09:11
引用: IrisArtz- 发表于 2020-5-28 09:11
请问虾神,"可以选择4个(0~3)用于唤醒BlueNRG-1的VTimer计数器"  那么如果我的代码中需要超过4个计时器, ...

怎么会用到这么多?什么需求?能用现有的扩展吗?
点赞  2020-5-28 12:30
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复