您好,支持人员,
简短的版本是,我可以清除BLE\u BASETIMECNT而不搞砸BLE核心吗?我注意到在reg#u blecore.h中有#define BLEŠu BASETIMECNTŠu RESET 0x00000000,我假设这是一个可以用来清除计数的位掩码。这可能吗?
我的设计目前的功能如下:在设备通电时,我通过调用db初始化回调函数中的arch\u ble\u ext\u wakeup\u on()立即将其休眠。最终用户可以按下一个按钮,打开设备,它开始广告等。。。我的应用程序的一部分要求是公布自标记被激活以来经过的时间(用按钮中断从睡眠中唤醒)。问题是调用lld\u evt\u time\u get()会报告自通电以来的总时间。我想做的是在设备唤醒后立即清除BLE\u BASETIMECNT寄存器。任何帮助或建议将不胜感激。谢谢。
设备:
嗨,戴夫,
BLE\u BASETIMECNT寄存器没有复位位,而且每次580进入休眠状态时,该寄存器都为零,并且该值通过函数lld\u sleep\u compensate\u func\u patched()进行补偿,该函数从低功耗时钟获取经过的时间。关于您的实现,您可以使用内核计时器来计数,并将内核计时器精度设置为标记所需的精度,当时间流逝时,在计时器处理程序中增加一个计数器。另一个尝试的想法是用lld\u evt\u time\u get测量时间,并保留上一次唤醒的值。在下一次唤醒中,您可以通过减去当前和上一次唤醒来计算间隔。
谢谢你的对话
我试过使用内核计时器,但并不准确。我在15个小时内损失了大约20秒,计时器设置为每60秒过期一次。我是否可以调用一个阻塞函数来阻塞ble内核,直到它完全运行?现在,我正在更新广告数据,当设备唤醒时,然后每分钟更新一次。问题是,正如您所提到的,当BLE\ U BASETIMECNT寄存器在唤醒后立即读取时,它读取为0。我想尝试一下你提到的第二种方法,但是我认为除非ble核心是完全活动的,否则它不会起作用(至少我现在的代码是这样)。
嗨,戴夫,
我不知道你说的阻塞功能是什么意思,直到核心完全运行,如果你说的是BLE定时器,在SDK5中,在设置计时器的过程中,sw检查ble核心是否处于活动状态,如果处于活动状态,则直接使用keèu timerèu set设置计时器。如果未处于活动状态,则向核心发送消息,当核心处于活动状态时,则提供设置ble计时器的消息。没有等待函数在内核唤醒时使进程处于等待状态。现在关于第二个方法,您可以尝试调用lld\u evt\u time\u get in the user\u on \u ble\u powered callback,以确保内核处于活动状态。
谢谢你的对话
我在ble-powered上为用户\u创建了一个回调,得到了一个结果,当我调用lld\u evt\u time\u get()时,它还没有用低功耗时钟的时间计数更新。
嗨,戴夫,
你的意思是你得到零?
在5.0.2.1SDK中(例如在模板中),如果放置下面的代码段,UART只返回零?
枚举arch\u main\u loop\u callback\u ret user\u on \u ble\u powered(void)
{
arch_set_pxact_gpio();
拱门放置(“on-”);
arch_printf(“%i-”,lld_evt_time_get());
拱形放置(“\n\r”);
回到睡眠状态;
}
谢谢你的对话
您使用的是内部RCX时钟还是外部XTAL32?
我两个都试过了,好像没什么区别。
嗨,戴夫,
你能再试一次在一个新的模板项目或一个新的例子,如barebone项目?
谢谢你的对话