Hi.我的SDK是5.0.3,我想在DA14583上实现计时,和手机端同步UTC后,实现计时。我调用了lld_evt_time_get()获取系统0.625us节拍,但是我不知道具体在什么时候溢出。想请问,实现这样的功能,有没有参考的案例或者指导,谢谢。
lld_evt_time_get()会提供一个27位的32uint时间值,单位如你所说的是0.625us。23.3小时左右会溢出。DA的芯片本身没有RTC的实现案例,这些计时一般都只适合短时间使用,在时间比较长的场景里需要在非易失性储存里建立相关时间变量来确保睡眠后时间不会丢失,并且需要定期和其他设备配合实现时间同步来确保准确。大部分的RTC实现需要借助外部芯片或者设备
Hi,我在你们的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 void set_msystime()165 {167 uint32_t cur = lld_evt_time_get();
173 if (cur > BLE_BASETIMECNT_MASK) {174 return;175 }176177 if (cur >= last_time)178 {179 msystime += (cur - last_time);180 }181 else182 {183 if (last_time <= 8000) {184 //last_time = 1600;185 //return;186 }187 else if (last_time >= (BLE_BASETIMECNT_MASK - 3200)) {188 msystime += (BLE_BASETIMECNT_MASK - last_time);189 msystime += cur;190 }191 else {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;197198 //printf("ms: %u time: %llu\n\r", ms, msystime);199 }
/**********************************************************296 void system_time_proc(void)297 {298 set_msystime();303 }305 }306/**********************************************************308 static void systick_isr(void)309 {310 system_time_proc();311 }312/**********************************************************313 void init_sys_time()314 {315 systick_register_callback(systick_isr);316 systick_start(5000, 1);317 }
我是通过上面在 systick中断里面 定时5ms 取一次内核时间 来实现长时间的定时统计,但是长时间休眠下去以后,出现时间变大许多。我们项目已经进入生产阶段,但就是卡在这个问题上,能否帮忙解决,谢谢?
如果你【长时间休眠】【频繁睡眠/唤醒】并且【独立计时】的话,DA14580是很难实现RTC的,最好的解决办法还是外部晶振
首先systick 时间记在BASETIMECNT 寄存器里,一共27位,23.3小时左右就溢出了,你的程序需要去手动重置它避免这个情况发生。设备睡下时systick依然工作,但是会记录在另一个寄存器里,醒来后再补偿回BASETIMECNT(参考函数lld_sleep_compensate_func_patched())。但是这样依旧会在睡眠和唤醒过程中产生小的误差,次数多了也就很大了。
可以的话尽量在每次连接过程中从连接的主机那边同步一下时间
lld_evt_time_get()会提供一个27位的32uint时间值,单位如你所说的是0.625us。23.3小时左右会溢出。DA的芯片本身没有RTC的实现案例,这些计时一般都只适合短时间使用,在时间比较长的场景里需要在非易失性储存里建立相关时间变量来确保睡眠后时间不会丢失,并且需要定期和其他设备配合实现时间同步来确保准确。大部分的RTC实现需要借助外部芯片或者设备
Hi,
我在你们的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 void set_msystime()
165 {
167 uint32_t cur = lld_evt_time_get();
173 if (cur > BLE_BASETIMECNT_MASK) {
174 return;
175 }
176
177 if (cur >= last_time)
178 {
179 msystime += (cur - last_time);
180 }
181 else
182 {
183 if (last_time <= 8000) {
184 //last_time = 1600;
185 //return;
186 }
187 else if (last_time >= (BLE_BASETIMECNT_MASK - 3200)) {
188 msystime += (BLE_BASETIMECNT_MASK - last_time);
189 msystime += cur;
190 }
191 else {
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 void system_time_proc(void)
297 {
298 set_msystime();
303 }
305 }
306
/**********************************************************
308 static void systick_isr(void)
309 {
310 system_time_proc();
311 }
312/**********************************************************
313 void init_sys_time()
314 {
315 systick_register_callback(systick_isr);
316 systick_start(5000, 1);
317 }
我是通过上面在 systick中断里面 定时5ms 取一次内核时间 来实现长时间的定时统计,但是长时间休眠下去以后,出现时间变大许多。
我们项目已经进入生产阶段,但就是卡在这个问题上,能否帮忙解决,谢谢?
如果你【长时间休眠】【频繁睡眠/唤醒】并且【独立计时】的话,DA14580是很难实现RTC的,最好的解决办法还是外部晶振
首先systick 时间记在BASETIMECNT 寄存器里,一共27位,23.3小时左右就溢出了,你的程序需要去手动重置它避免这个情况发生。设备睡下时systick依然工作,但是会记录在另一个寄存器里,醒来后再补偿回BASETIMECNT(参考函数lld_sleep_compensate_func_patched())。但是这样依旧会在睡眠和唤醒过程中产生小的误差,次数多了也就很大了。
可以的话尽量在每次连接过程中从连接的主机那边同步一下时间