6006|8

51

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

BlueNRG-系列带睡眠的RTC参考设计 [复制链接]

 背景:BlueNRG系列带硬件RTC,但很不幸,在睡眠的时候,这部分是关掉的。如果此时使用会造成时间不准。
但是很多时候,我们又需要计时功能。怎么解决呢?

方案1:
使用HAL_VTimerTimeoutCallback,不断轮询。(一定程度上可以解决计时问题,但是如果不清楚会容易造成时间不准,误差。)
       因为VTime 接口uint32_t HAL_VTimerAcc_sysT32_ms(uint32_t sysTime, int32_t msTime)  本身就不是精确的,有省去一些tick。


方案2:
使用我原创的RTC代码计时(代码见附件),下面可能凑合着一些英文,大家凑合着看。


说说重点哈:VTime时钟是32K时钟x分频和y倍频得到的, (x可能是25,y可能是2, 或者x=50,y=4),并且睡眠也在计时。





The RTC Demo can  accurate  timing.
              Features:
1.      It include RTC time and Unix timestamp(Number of seconds passed  since 1970-01-01 00:00:00 GMT).
a.      uint32_t get_unix_timestamp(void);
b.      sysTime_t get_date(void);
2.      It base on VTimer(internal time), so  sleep do not effect timing.
3.      It can sync system time by RTC time and by Unix timestamp.
a.      bool sync_time_by_sec(uint32_t timestamp);
b.      bool sync_time_by_rtc(uint16_t year,uint8_t month,uint8_t day,
                                                                                      uint8_t hour,uint8_t minute,uint8_t second);
E[url=]xplain[/url]:
              internal time units is about 2.4114us (1000000/409600)
              409600 ticks is 1s(Relatively accurate)
              internal time will overflow [url=]per[/url] 5242879 ms[87 min]).
Use caution:
              It must be called periodically in a period  of internal time tick (called period < internal time tick period [87 min])
Usage examples:
              while(1) {
    /* BlueNRG-1 stack tick */
    refresh_sys_time();// or get_unix_timestamp();
    BTLE_StackTick();
    BlueNRG_Sleep(SLEEPMODE_WAKETIMER, wakeup_source, wakeup_level);
}


改天我有时间,再发布带软件定时器功能(结合睡眠),消息队列,批量数据透传参考设计。。。。。。敬请关注!
代码仅供参考,目前我测试了一天多,感觉还是挺准的。



sys_time.h

1.63 KB, 下载次数: 22

sys_time.c

5.07 KB, 下载次数: 35

最新回复

 It must be called periodically in a period  of internal time tick (called period < internal time tick period [87 min]  这个意思是 超过87分钟 功能就失效了吗?  如果我要长时间计时系统跑的秒数,该咋办呢?有什么好的建议吗?     详情 回复 发表于 2020-5-27 18:02

赞赏

1

查看全部赞赏

点赞 关注(1)
 
 

回复
举报

51

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
这个排版大家凑合着看,主要是看代码。代码才是重点
 
 
 

回复

9792

帖子

24

TA的资源

版主

板凳
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 
 
 

回复

1903

帖子

0

TA的资源

版主

4
 
很牛X的帖子了
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

5
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(中级)

6
 

看完了以后还有一点问题

 

1. It must be called periodically in a period  of internal time tick (called period < internal time tick period [87 min]

这是不是意味着我只能用sleepmode_waketimer,而不能用sleepmode_notimer, 并且在while loop前加上HAL_VTimerStart_ms(0, 87min);?

2. 想问一下409600是哪里来的? 我在databook里面没有找到多少tick是1s。

3. 如果我想每次wakeup的时候save time,我是应该在get_unix_timestamp();后加一个function判断wakeupsource,如果不是timeout的话call一个get_date然后save time吗?这个思路对吗?

 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

7
 
andiliu 发表于 2019-7-5 03:24 看完了以后还有一点问题   1. It must be called periodically in a period  of ...

1. 是的,只能是sleepmode_waketimer,BLE协议栈和应用公用virtual timer ,只要你调用时BlueNRG_Sleep(SLEEPMODE_WAKETIMER, xx, xx, xx);是这样,就能保证你的32K时钟没有关,就可以。

2.409600从哪来,我实际是猜的,但验证过。准确的倍频分频,我不特别清楚芯片硬件上怎么做的,但是,BLE协议栈是基于时间片的,32.768KHz最终要变成312.5us,  625us等。代码中有两个宏

#define FROM_SYS_TIME_TO_US(sys)     ((uint16_t)(sys*2.4414))

#define FROM_US_TO_SYS_TIME(us)      ((uint16_t)(us/2.4414)+1)

这里的2.4414是估算的值,芯片内部基于32.768KHz倍频和分频产生,

1秒除于2.4414=409601.048xxxxx.   所以我猜,系统的准确频率是: 1000000000/409600=2.44140625

所以应该是409600Hz /32768 =  12.5.   可能是25倍频,然后2分频,或者其他。

3. 不用save time,每次调用就可以更新时间,get_unix_timestamp本身就会刷新时间。

4. 实际代码可以参考GitHub工程:

链接已隐藏,如需查看请登录或者注册

 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(初级)

8
 
lucienkuang 发表于 2020-3-24 15:37 1. 是的,只能是sleepmode_waketimer,BLE协议栈和应用公用virtual timer ,只要你调用时BlueNRG_Sleep(S ...

 It must be called periodically in a period  of internal time tick (called period < internal time tick period [87 min] 

这个意思是 超过87分钟 功能就失效了吗?  如果我要长时间计时系统跑的秒数,该咋办呢?有什么好的建议吗?

 

 
 
 

回复

51

帖子

0

TA的资源

一粒金砂(中级)

9
 

这个计时可以记100年,建议参考这个

链接已隐藏,如需查看请登录或者注册
代码,然后基于这个时间进行扩展,定时比方说定时1min中检查是否超时

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表