你好,
我在设置延长睡眠模式时遇到问题(没有OPT copy)。我们使用的是定制的14586板。
在arch_main.c中,在过程int main (void)(第139行)
如果我替换sleep_mode = rwip_power_down();(第176行)leep_mode = mode_active;它每隔一秒连续地传输数据而没有问题。
但是如果我离开sleep_mode = rwip_power_down(),数据包就不会得到更新。初始化后,数据包更新一次,然后每一秒发送一次相同的数据包。
Adv_data_update_timer_cb使用APP_ADV_DATA_UPDATE_TO调度,不改变,保持为100
CFG\u最大睡眠时间\u周期性唤醒时间\u MS保持在500。
尝试的值687.5和3000 for .intv_min和.intv_max
app_default_sleep_mode被设置为ARCH_EXT_SLEEP_ON
使用参数false调用所有arch\u set\u extended\u sleep调用(arch\u set\u extended\u sleep(false))。
已使用app_easy_gap_non_connectable_advertive_start()。
SysCLK改为16MHz。
用于设置MNF_DATA的某些值的定时器0和Systick。
我有两个问题,
1)数据包没有得到更新
2) 从smartsnippets的当前级别和开发板的测试点6来看,我认为它不会进入睡眠模式。(CRO上的基本电压为100mv,传输时为400mV。
我能在这方面得到一些帮助吗?我从你的ble_应用程序_睡眠模式开始了这个项目,并根据我们的需要进行了修改。
谢谢你!
设备:
嗨anushiya,
为了在没有OTP镜像的扩展睡眠模式下设置DA14586,您所要做的只是将user_config.h中的app_default_sleep_mode变量设置为ARCH_EXT_SLEEP_ON。您不应该修改arch_main.c文件,因为它是SDK相关文件。在SDK的ble_app_sleepmode示例中,设备发布一个定义的时间量APP_ADV_DATA_UPDATE_TO,默认值为30秒。当设备处于发布状态时,它的睡眠模式被设置为带有OTP拷贝的扩展睡眠(OTP拷贝在系统以DEVELOPMENT_DEBUG模式运行时被模拟)。在上述超时过期后,如果设备没有进入连接状态,则停止发布,因此执行app_easy_gap_advertise_stop()的adv_data_update_timer_cb()。这意味着制造商特定的数据将不会更新,设备将进入扩展睡眠模式,等待外部事件退出睡眠状态。用户可以按下一个按钮来唤醒设备。按下按钮后,设备将开始在预定的时间内再次发布广告。当设备进入连接状态时,睡眠模式变为无OTP拷贝的扩展睡眠。因此,如果您想更新特定于制造商的数据,您应该在user_app_adv_start()中设置第二个计时器。 For getting more information with the sleep modes in DA14585/6 product family, please read the教程4:睡眠模式电流测量.
谢谢,PM_DIALOG.
感谢您的及时回复。我不想要一个连接的状态,并想滥用系统无限期地传输一个数据包曾经x秒。
>你不应该修改arch_main.c文件,因为它是SDK相关文件。
我没有改变任何东西。为了使它连续传输,我临时替换sleep_mode = rwip_power_down();(第176行)使用sleep_mode = mode_active的arch_main.c,并确认它连续传输。
user_config.h中的> app_default_sleep_mode变量变为ARCH_EXT_SLEEP_ON
我已经完成了这一点
>在SDK的ble_app_sleepmode示例中,设备以30秒的默认值播发app_ADV_DATA_UPDATE_至的定义时间量。当设备处于播发状态时,其睡眠模式设置为OTP copy扩展睡眠(当系统在开发调试模式下运行时模拟OTP副本)。在上述超时过期后,如果设备未进入连接状态,则停止播发,因此执行应用程序的adv_data_update_timer_cb()将停止播发。这意味着制造商特定的数据将不会更新,设备将进入扩展睡眠模式,等待外部事件退出睡眠状态。
我已经在adv_data_update_timer_cb()中注释了app_easy_gap_advision_stop(),并替换为app_adv data_update_timer_used=app_easy_timer(app_adv data_update_TO,adv data_update_timer_cb);并已将APP_ADV_DATA_UPDATE_设置为100
(这就是为什么当我在arch_main.c中更改sleep_mode = mode_active时,它会无限传输)
我不想要一个连接的状态,想要无限期地传输一个数据包在x秒
>用户可以通过按下按钮唤醒设备。按下按钮后,设备将在预定义的时间内再次开始播发。当设备进入已连接状态时,睡眠模式将变为无OTP复制的延长睡眠。因此,如果要更新特定于制造商的数据,应在user_app_adv_start()中设置第二个计时器。
我希望这个设备不需要按按钮。此外,设备将永远不会进入连接状态。我希望设备在一个特定的间隔传输数据包,进入扩展睡眠没有OTP拷贝。这就是为什么我改变了app_easy_gap_undirectional_advertise_start();app_easy_gap_non_connectable_advertise_start ();
此外,所有ARCH_SET_EXTEDDE_SLEEP调用都会调用参数false(ARCH_SET_EXTEDDED_SLEEP(FALSE))。原始exaple有Arch_set_extended_sleep(true)
有关DA14585/6产品系列的睡眠模式的更多信息,请阅读教程4:睡眠模式电流测量.
这正是我所使用的。我尝试了两种方法。1)使用smartsnippets将代码放入flash中,这样就不需要连接JTAG。2) 在Keil_5中,按下debug,让程序运行,然后退出debug。两次的正确率都很高。
非常感谢您的帮助。
请注意,我可以向您发送完整的项目设置,如果我可以上传一个更大的文件,或者如果您特别想看到某个文件,我可以上传。
嗨anushiya,
感谢您的详细反馈。
您使用的是哪个SDK版本?我使用的是SDK6.0的最新版本。10.我可以找到sleep_mode = rwip_power_down();在第195行中,在Arch_main.c文件中。在(1)循环中,如果使用mode_active替换RWIP_POWER_DOWN(),则似乎设备永远不会进入睡眠模式。
您可以将设备配置为广播或使用非连接广告。当一个设备充当广播器时,这意味着它只能支持非连接广告。请按照以下步骤将您的设备配置为广播设备。我在SDK6.0.10的ble_app_sleepmode示例中完成了这些步骤
如果您发现任何答案有用,请将其标记为“已接受”。
谢谢,PM_DIALOG.
感谢您的帮助。您的建议帮助我将设备放在广播模式上。但仍有以下两个问题。
1)MNF_DATA_UPDATE()仍未调用和
2)在传输时间期间显示0.5mA的SmartSnippets,尖刺(随着调试模式删除)暗示不调用睡眠模式。
(使用示波器,通过主板上的测试点与SmartSnippets值匹配)
我正在使用SDK 6.0.4.326。
我将用户应用程序升级不可连接完整(uint8)定义为
空白user_app_adv_non_connectable_complete (uint8_t状态)
{
// irspective状态,安排下一个传输数据包
app_adv_data_update_timer_used=app_easy_timer(app_adv_data_update_TO,adv_data_update_timer_cb);
}
其中APP_ADV_DATA_UPDATE_TO=3000-这不会对广播产生任何影响
对于没有OTP编程,所有的arch_set_extended_sleep调用都带有参数“false”
app_default_sleep_mode = ARCH_EXT_SLEEP_ON
嗨anushiya,
我想让您知道SDK6.0.4是一个非常旧的版本,目前尚未得到支持。为此,我强烈建议您下载并使用最新版本的DA14585 / 6产品系列,即SDK6.0.10。BLE_APP_SLEEP模式示例SDK6.0.10的示例用于步骤我为您提供的步骤,以便在广播模式下设置in设备。每次完成不可连接的广告时,将触发user_app_adv_non_connectable_complete()。因此,您在此函数内设置计时器,当定时器到期时,将执行ADV_DATA_UPDATE_TIMER_CB。请按照SDK的BLE_APP_SLEEPMODE示例,遵循配置设备到广播模式的指南。我建议您只做我提供的修改。不可连接的广告将停止每个app_add_data_update_to,并且将触发adv_data_update_timer_cb()。检查user_app_adv_start()。一旦定时到期,制造商特定数据将在飞行中更新,广告将停止,并且设备将进入扩展睡眠模式。 The manufacture data are stored into the retention RAM, so when the chip wakes up with the button pressing, the adverting date will be updated. If you want to update the manufacturer data while the device is adverting, you should set up a second timer. So you will have a timer to stop adverting and a second timer to update the manufactured specific data.
谢谢,PM_DIALOG.
谢谢你!我会升级到6.0.10
>所以当芯片唤醒按钮按下时,将更新附加日期。
我想要一个周期性的唤醒,而不是一个按钮按下唤醒。没有外界的互动。
>如果要在设备播发广告时更新制造商数据,应设置第二个计时器。因此,您将有一个计时器来停止广告,第二个计时器来更新制造的特定数据。
我不需要这个。醒来,传送,更新,睡眠对我来说很好。
那么在完整的函数中,如果我按照我提到的那样安排时间,可以吗?
谢谢你!
你好,
我下载了SDK 6.0.10.511,并做了您建议的更改。
空白user_app_on_adv_nonconn_complete (uint8_t状态)
{
//安排下一个广告数据更新
app_adv_data_update_timer_used=app_easy_timer(app_adv_data_update_TO,adv_data_update_timer_cb);
}
无效用户应用程序处于未完成状态(uint8状态);
.app_on_adv_nonconn_complete = null,
作为
.app_on_adv_ nonconn _complete = user_app_adv_ nonconn _complete,
(与SDK6.0.4.326类似)
案例GAPM_CANCEL:
{
如果(param - >状态! = GAP_ERR-NO-ERROR)
{
ASSERT_ERROR (0);
}
......
}
所以必须注释掉app_easy_gap_advertise_stop();在静态void adv_data_update_timer_cb()
然后它在不断地传输,但还是一样的问题。
1) MNF_DATA没有更新,意味着原始数据的最后两个字节暂时为0000,更新一次到0100,然后保持不变。
[{“时间戳”:“2019 - 06 - 13 t07:14:09z”、“类型”:“未知”,“mac”:“80 eaca700005”、“bleName”:“”,“rssi”:-39年,“rawData”:“03030”a1811072f2a93a6bdd84152ac0b10992ec6feed05ffcdab0100}]
2)目前的消耗量为2.5mA(请参阅附图。)
嗨anushiya,
让我查一下,我会尽快给你答复。
谢谢,PM_DIALOG.
请问有什么最新消息吗?
请在一个干净的SDK ble_app_sleepmode示例中尝试以下步骤。
如果您希望使用不可连接的广告,则应执行以下操作:
1.修改user_app_adv_start()以发布不可连接的包
2.在user_callback_config.h中,移动user_app_adv_undirect_complete。app_on_adv_undirect_complete到。app_on_adv_nonconn_complete.
在此之后,广告数据的适当性数据应在每个APP_ADV_data_UPDATE_至秒时更新1。
谢谢,PM_DIALOG.
感谢您的答复。尝试了这个,mnf_data正在更新。但是SmartSnippet仍然表示消费2.5mA(在加载代码后关闭Keil环境)。这不是意味着它没有进入睡眠模式。我在我之前的消息中获得了相同的波模式。
嗨anushiya,
如果您认为前面的答案有用,请将其标记为“已接受”。
您可以说明您遵循的程序,以便测量睡眠电流>请注意,设备在广告间隔之间进入睡眠模式。
谢谢,PM_DIALOG.
在您提供的解决方案中,我有一个问题:
在步骤2中,您在user_callback_config.h中请求将user_app_adv_unddirective_complete从.app_on_adv_unddirective_complete移动到.app_on_adv_non_complete。
什么时候需要做什么。应用程序在非直接应用程序上,并完成。应用程序已完成和未完成将有所不同,不是吗?我有
Inside user_app_adv_non_connectable_complete funtions和分配给。app_on_adv_nonconn_complete = user_app_adv_non_connectable_complete并从上行中删除它
但那没用。我可以知道为什么吗?
关于测量电流,我用了两种方法。
1)使用SmartSnippet和混合连接(JTAG和COM端口)。(使用Booter下载代码后,我也尝试从开发板中删除JTAG跳线)。正确绘制为0.5mA(Peack电流5mA和Ave。电流0.5mA)
2)使用测试点TP6和相应的跳线连接激活放大器(期望电流过小)。示波器上的测量值是智能片段中接收值的100倍。
如果代码将DA14586放入睡眠模式,我希望电流在UA范围内。
我下载了一个新版本的6.0.10.511,提取了代码,只更改了你上面提到的3项。
嗨anushiya,
的。app_on_adv_undirect_complete和。app_on_adv_nonconn_complete是两个完全不同的回调函数,它取决于您正在使用的广告过程。
然而,如果你停止广告程序,两者都将被执行
在您的例子中,您使用的是不可连接的广告,因此如果您向被卡住的BLE发送STOP命令,app_on_adv_nonconn_complete将被执行。
静态void adv_data_update_timer_cb()是第3步。请澄清它不起作用的意思是什么?请说明是否触发了静态void adv_data_update_timer_cb()?
需要注意的是,如果你不停止广告,设备将永远不会进入永久休眠,但它会在广告间歇进入休眠状态。为了测量睡眠模式电流,强烈建议不要使用SmartSnippets工具箱。请查看本教程教程4:睡眠模式电流测量为了检验如何测量睡眠电流。
谢谢,PM_DIALOG.
嗨,抱歉延迟回来。我仍然困惑,并试图让我的脑袋。
>。app_on_adv_undirect_complete和。app_on_adv_nonconn_complete是两个完全不同的回调函数,它取决于您正在使用的广告过程。
这也是我的问题。当它们是两个完全不同的函数时,您让我在这样移动时“2.在user\u callback\u config.h中,将user\u app\u adv\u unddirective\u complete从.app\u on\u adv\u unddirective\u complete移动到.app\u on\u adv\u noncon\u complete”,并将“user\u app\u adv\u unddirective\u complete”替换为NULL,我遇到了一些问题。现在我有了“.app_on_adv_unddirective_complete”到“.app_on_adv_noncon_complete”和“user_app_adv_unddirective_complete”,这两个选项都有效。但当我用一行代码创建“用户应用程序非可连接完成”时,它就不起作用了。
但如果我把它作为最后一行
它起作用了。
我主要担心的是,在两次传输之间,它似乎仍然没有休眠。
>请注意,如果您不停止广告,设备将永远不会睡眠,但它将在广告间隔之间睡眠。
是的,从设备通电时起,设备将继续发送(广播)。所以我想让它在广告间隙进入睡眠状态。
为了测量当前的性能,我使用了第29页的“UM-B-049 DA1458x开发工具包入门-Pro_v1.1.pdf”技术,而不是教程教程4:睡眠模式电流测量因为我需要在运行示例代码“ble_app_sleepmode”时测量14586子板电流消耗,并使用相同的示例代码“ble_app_sleepmode”测量自定义电路板上的电流消耗。
目前,CRO中的两个测量值均为250mV,解释为2.5mA(前附图片)。SmartSnippets工具箱电源探查器的测量值也为2.5mA。
在进行测量时,我关闭了Keil开发环境。(从本帖一开始,情况就是如此)
现在我已经更改为SDK 6.0.10.511
谢谢你的帮助
嗨,我注意到当我使用DA14586的子板时,意外地如果我没有将默认的目标选择ble_app_sleepmode_585更改为ble_app_sleepmode_586,那么当前的消耗要高得多。如果目标选择ble_app_sleepmode_586,示波器上的电流测量基层为20mV,当在跳线连接J1之间串联一个安培计时,它显示大约4uA睡眠模式电流和小于1mA的传输电流。
因此,我只剩下一个问题:建议采取什么行动?”App_on_adv_nonconn_complete "而不是仅仅复制相同的函数"。app_on_adv_undirect_complete”
嗨anushiya,
请说明您最终是如何配置设备的?您是将其设置为外围模式并使用不可连接的广告还是将其设置为广播模式?
关于你的第二个问题,是的,你应该为DA14586设备构建一个项目,flash是与适当的二进制图像,只要你使用这个芯片。
谢谢,PM_DIALOG.
>你能说明你最后是如何配置你的设备的吗?你把它设置为外围模式使用非连接广告还是你把它设置为广播模式?
使用non-connectable广告。(我正在将我们的代码从6.0.4.326中的ble_app_example移到新的SDK 6.0.10.511中的ble_app_sleepmode示例中。我们的板有一个外部RAM(因为我们也从DA14585切换到DA14586,并且CS配置为高)。希望这是一条正确的路。
你所说的“外围模式”是什么意思。有没有我错过的场景?上面我接受的答案有3个步骤,我在ble_app_睡眠模式示例中完成了这些步骤。
正如我上周,2019-07-02 09:43,我仍然不明白为什么“.app_on_adv_nonconn_complete”和“。app_od_adv_undirect_complete”要求指向同一件事“.app_on_adv_nonconn_complete的推荐操作是什么而不是将相同的函数复制为“app_op_adv_undirect_complete”,而不是user_callback_config.h中的“user_app_adv_undirect_complete”?
嗨anushiya,
.app_on_adv_nonconn_complete回调将在非连接广告完成时命中。但是,.app_on_adv_undirect_complete wil在未确定的广告完成后触发。在.app_on_adv_nonconn_complete中,您应该在使用不可连接的广告时,您应该在您想要执行的回调。例如,如果您停止广告,设备进入永久睡眠模式,则可以使用以下功能:
无效用户应用程序非连接完成(uint8状态)
{
//禁用BLE和TIMER事件的唤醒。只有外部(GPIO)唤醒事件可以唤醒处理器。
if (status == = GAP_ERR_CANCELED) / /取消
{
arch_ble_ext_wakeup_on ();
//配置唤醒按钮
应用程序按钮启用();
}
}
谢谢,PM_DIALOG.
>在.app_on_adv_nonconn_complete中,您应该在使用不可连接的广告时,您应该将您想要执行的回调。
我完全同意。这就是为什么我在以下之前问:
我有
Inside user_app_adv_non_connectable_complete funtions和分配给。app_on_adv_nonconn_complete = user_app_adv_non_connectable_complete并从上行中删除它
但那没用。我可以知道为什么吗?
嗨anushiya,
对耽搁表示歉意。因为您停止了不可连接的广告,并且配置了。app_on_adv_noncon_complete=用户_app_adv_non_connectable_complete,应触发用户_app_adv_non_connectable_complete。能否请您在调试模式下运行代码,并在设备停止广告后尝试查找代码的位置?哪个功能被触发?
谢谢,PM_DIALOG.