4个职位/ 0个新职位
最后发表
wuhanpin
离线
最后看到:1年8个月前
加入:2015-07-20 08:21
如何在DA14583上实现持续的计时

嗨。
我的SDK是5.0.3,我想在DA14583上实现计时,和手机端同步UTC后,实现计时。我调用了lld_evt_time_get()获取系统0.625节我们拍,但是我不知道具体在什么时候溢出。想请问,实现这样的功能,有没有参考的案例或者指导,谢谢。

设备:
Qinjiny_Dialog
离线
最后看到:2个月2周以前
工作人员
加入:2016-11-01 05:47
lld_evt_time_get (

lld_evt_time_get()会提供一个27位的32个单位时间值,单位如你所说的是0.625。23.3小时左右会溢出。DA的芯片本身没有RTC的实现案例,这些计时一般都只适合短时间使用,在时间比较长的场景里需要在非易失性储存里建立相关时间变量来确保睡眠后时间不会丢失,并且需要定期和其他设备配合实现时间同步来确保准确。大部分的清债信托公司实现需要借助外部芯片或者设备

wuhanpin
离线
最后看到:1年8个月前
加入:2015-07-20 08:21
你好,

你好,
我在你们的SDK里面发现了__INLINE bool lld_evt_time_cmp (uint32_t time1, uint32_t time2);这个里面是time1——time2 > 3193600我想知道这个时间比较有什么意义。3193600 是什么?

Static uint64_t msystime __attribute__((section("retention_mem_area0")) = 0;
Static uint32_t last_time __attribute__((section("retention_mem_area0")) = 0;

/**********************************************************
164年空白set_msystime ()
165年{
167 uint32_t cur = lld_evt_time_get();

173 if (cur > BLE_BASETIMECNT_MASK) {
174年返回;
175}
176
177 if (cur_> = last_time) / /当前时间
178年{
179 msystime += (cur_last_time); / /当前时间
180}
其他181
182年{
183 if (last_time <= 8000) {
184 //last_time = 1600;
185 / /返回;
186}
if (last_time >= (BLE_BASETIMECNT_MASK - 3200)){/ /输出>
188 msystime += (BLE_BASETIMECNT_MASK - last_time); / /输出
189 msystime += cur;
190}
191年其他{
192}
193 //pr_err("MAX_TIME %d %llu %d\n", cur, msystime, last_time);
194}
195 / / msysdaybase + = (((cur - last_time) > > 3) * 5);
196 last_time = cur;
197
198 //printf("ms: %u time: %llu\n\r", ms, msystime);
199}

/**********************************************************
296无效system_time_proc(空白)
297年{
298年set_msystime ();
303}
305}
306
/**********************************************************
308 static void systick_isr(void)
309年{
310年system_time_proc ();
311}
312年 /**********************************************************
313年空白init_sys_time ()
314年{
315年systick_register_callback (systick_isr);
316 systick_start (5000 1);
317}

我是通过上面在systick中断里面定时5 ms取一次内核时间来实现长时间的定时统计,但是长时间休眠下去以后,出现时间变大许多。
我们项目已经进入生产阶段,但就是卡在这个问题上,能否帮忙解决,谢谢?

Qinjiny_Dialog
离线
最后看到:2个月2周以前
工作人员
加入:2016-11-01 05:47
如果你【长时间休眠】【频繁睡眠/唤醒】并且【独立计时】的话

如果你【长时间休眠】【频繁睡眠/唤醒】并且【独立计时】的话,DA14580是很难实现RTC的,最好的解决办法还是外部晶振

首先systick时间记在BASETIMECNT寄存器里,一共27位,23.3小时左右就溢出了,你的程序需要去手动重置它避免这个情况发生。设备睡下时systick依然工作,但是会记录在另一个寄存器里,醒来后再补偿回BASETIMECNT(参考函数lld_sleep_compensate_func_patched())。但是这样依旧会在睡眠和唤醒过程中产生小的误差,次数多了也就很大了。

可以的话尽量在每次连接过程中从连接的主机那边同步一下时间