你好,
我在设置扩展睡眠模式(没有opt副本)时遇到了麻烦。我们正在使用自定义14586板。
在arch_main.c中,在过程int main (void)(第139行)
如果我替换sleep_mode=rwip_power_down();(第176行)睡眠模式=激活模式;它每秒钟连续传输一次数据,没有问题。
但是如果我离开sleep_mode = rwip_power_down(),数据包就不会得到更新。初始化后,数据包更新一次,然后每一秒发送一次相同的数据包。
Adv_data_update_timer_cb使用APP_ADV_DATA_UPDATE_TO调度,不改变,保持为100
cfg_max_sleep_duration_periodic_wakeup_ms留在500。
.intv_min和.intv_max的尝试值687.5和3000
应用程序默认睡眠模式设置为ARCH\u EXT\u sleep\u ON
所有ARCH_SET_EXTEDDE_SLEEP调用都会调用参数FALSE(ARCH_SET_EXTEDDE_SLEEP(FALSE))。
app_easy_gap_non_connectable_advertise_start ();用过的。
SysCLK改为16MHz。
定时器0和systick用于设置MNF_数据的某些值。
我有两个问题,
1)数据包没有得到更新
2)查看Smartsnippets的当前水平,以及从开发板的测试点6,我认为它不会进入睡眠模式。(在CRO上,基极电压为100mV,当传输时,它进入400mV。
请问我可以得到一些帮助吗?我从BLE_APP_SLEEPMODE开始项目并修改以满足我们的需求。
谢谢你!
设备:
嗨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:睡眠模式电流测量。
谢谢,下午好
感谢您的及时回复。我不想要一个连接的状态,并想滥用系统无限期地传输一个数据包曾经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示例中,设备为已定义的时间量APP_ADC_DATA_UPDATE_TO通告,其中默认值为30 s。当设备处于发布状态时,它的睡眠模式被设置为带有OTP拷贝的扩展睡眠(OTP拷贝在系统以DEVELOPMENT_DEBUG模式运行时被模拟)。在上述超时过期后,如果设备没有进入连接状态,则停止发布,因此执行app_easy_gap_advertise_stop()的adv_data_update_timer_cb()。这意味着制造商特定数据不会更新,设备将进入扩展睡眠模式等待外部事件以退出休眠状态。
我在Adv_Data_update_Timer_CB()中发表了评论的app_easy_gap_advertise_stop(),并用app_add_data_update_timer_used = app_easy_timer替换(app_addata_update_to,avd_data_update_timer_cb);并将app_add_data_update_to设置为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_extended_sleep调用都是使用参数false(arch_set_extended_sleep(false))调用的。最初的例子是arch_set_延长了睡眠时间(真)
有关DA14585/6产品系列的睡眠模式的更多信息,请阅读教程4:睡眠模式电流测量。
这是我究竟使用的。我尝试了两种方式。1)使用SmartSnippets将代码放在闪光灯中,以便不需要连接JTAG。2)在Keil_5按下调试并让程序运行,然后从调试中出来。两次正确仍然很高。
非常感谢你的帮助。
请注意,如果我可以上传更大的文件或者您专门想查看某个文件,我可以向您发送完整的项目设置,我可以上传那个。
嗨anushiya,
谢谢您的详细反馈。
您正在使用哪个SDK版本?我使用的是最新版本SDK6.0。10我可以找到sleep_mode=rwip_power_down();在arch_main.c文件的第195行中。在while(1)循环中,如果将rwip_power_down()替换为mode_active,则设备似乎永远不会进入睡眠模式。
您可以将设备配置为广播或使用非连接广告。当一个设备充当广播器时,这意味着它只能支持非连接广告。请按照以下步骤将您的设备配置为广播设备。我在SDK6.0.10的ble_app_sleepmode示例中完成了这些步骤
如果您发现任何答案有用,请将其标记为“已接受”。
谢谢,下午好
谢谢你的帮助。你的建议帮助我将设备设置为广播模式。但仍然存在以下两个问题。
1) mnf_data_update()仍然未被调用,并且
2) smartsnippets显示0.5mA,在传输期间出现峰值(删除调试模式),这意味着未调用睡眠模式。
(使用示波器,通过主板上的测试点匹配smartsnippets值)
我正在使用SDK 6.0.4.326。
i定义了user_app_adv_non_connectable_complete(uint8_t)
空白user_app_adv_non_connectable_complete (uint8_t状态)
{
//I查看状态,计划下一个传输数据包
app_add_data_update_timer_used = app_easy_timer(app_add_data_update_to,avd_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产品系列的SDK的最新版本,即SDK6.0.10。SDK6.0.10的ble_app_睡眠模式示例用于我为您提供的步骤,以便将您的in设备设置为广播模式。每次完成不可连接的广告时,都会触发用户_app_adv_non_connectable_complete()。因此,您在该函数中设置了一个计时器,当计时器过期时,将执行adv_data_update_timer_cb。请遵循SDK的ble_app_sleepmode示例中有关将设备配置为广播模式的指导原则。我建议你只做我提供给你的修改。不可连接的广告将停止每个应用程序的ADV_DATA_UPDATE_TO,并触发ADV_DATA_UPDATE_timer_cb()。检查用户\u app\u adv\u start()。一旦计时器过期,航班上的制造商特定数据将更新,广告将停止,设备将进入延长睡眠模式。制造数据存储在保留RAM中,因此当按下按钮唤醒芯片时,广告日期将被更新。如果要在设备播发广告时更新制造商数据,应设置第二个计时器。因此,您将有一个计时器来停止广告,第二个计时器来更新制造的特定数据。
谢谢,下午好
谢谢。我将升级到6.0.10
>因此,当按下按钮唤醒芯片时,广告日期将被更新。
我想要一个周期性的唤醒,而不是一个按钮按下唤醒。没有外界的互动。
>如果您想在设备被添加时更新制造商数据,则应设置第二个计时器。因此,您将有一个计时器来停止添加和第二计时器以更新制造的特定数据。
我不需要这个。醒来,传送,更新,睡眠对我来说很好。
所以在完整的函数中,如果我提到的那样,如果我提到的那样好吗?
谢谢你!
你好,
我下载了SDK 6.0.10.511,并进行了建议的更改。
空白user_app_on_adv_nonconn_complete (uint8_t状态)
{
//安排下一个广告数据更新
app_add_data_update_timer_used = app_easy_timer(app_add_data_update_to,avd_data_update_timer_cb);
}
void user_app_on_adv_nonconn_complete(uint8_t状态);
.app_on_adv_nonn_complete=NULL,
作为
.app_on_adv_ nonconn _complete = user_app_adv_ nonconn _complete,
(就像在SDK6.0.4.326中一样)
案件GAPM_取消:
{
如果(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,
让我查一下,我会尽快给你答复。
谢谢,下午好
请问有什么最新消息吗?
请在一个干净的SDK ble_app_sleepmode示例中尝试以下步骤。
如果您想拥有非可连接的广告,您应该执行以下操作:
1.修改user_app_adv_start()以发布不可连接的包
2在user_callback_config.h中,将user_app_adv_undirective_从移动到complete。应用程序打开,无方向完成。应用程序已完成
之后,广告数据的适当数据应该由1个App_adv_data_update_to秒更新。
谢谢,下午好
感谢您的回复。尝试此操作后,MNF_数据将得到更新。但是smartsnippets仍然说消耗2.5mA(Keil环境在下载代码后关闭)。这不意味着它不会进入睡眠模式。我在上一条消息中附加了相同的波形。
嗨anushiya,
如果您发现以前的答案有用,请将其标记为“已接受”。
请说明您为测量睡眠电流而遵循的步骤>注意,设备在广告间隔之间进入睡眠模式。
谢谢,下午好
在您提供的解决方案中,我有一个问题:
在步骤2中,您在user_callback_config.h中请求,移动user_app_adv_undirect_complete。app_on_adv_undirect_complete到。app_on_adv_nonconn_complete。
需要做的行动。app_on_adv_undirect_complete和。app_on_adv_nonconn_complete将不同不是吗?我有
内部用户应用程序高级不可连接功能完成并分配给。app_on_adv_noncn_complete=用户_app_adv_non_connectable_complete并将其从最后一行删除
但这并不起。我可以知道为什么会吗?
关于测量电流,我用了两种方法。
1) 使用smartsnippets和混合连接(JTAG和com端口)。(使用booter下载代码后,我也尝试从开发板上移除JTAG跳线)。正确的电流为0.5mA(峰值电流为5mA,平均电流为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:睡眠模式电流测量为了检验如何测量睡眠电流。
谢谢,下午好
嗨,很抱歉耽误了回来。我仍然困惑不解,试图恢复理智。
>这个。应用程序在非直接应用程序上,并完成。app_on_adv_nonn_complete是两个完全不同的回调函数,它取决于您使用的广告过程。
这是我的问题也是如此。当他们完全是两个不同的函数时,您将让我向“2.在user_callback_config.h中,移动user_app_adv_undirect_complete。app_on_adv_undirect_complete。app_on_adv_nonconn_complete”当像这样移动并替换“user_app_adv_undirect_complete”,我有一些问题。现在我有“app_on_adv_undirect_complete。app_od_adv_nonconn_complete”with“user_app_adv_undirect_complete”它有效。但是,当我创建“user_app_adv_nonnectable_complete”时,它不起作用。
但如果我把它作为最后一行
有用。
我的主要担忧是,似乎似乎在传播中仍然没有睡觉。
>请注意,如果您不停止广告,设备将永远不会进入永久睡眠状态,但它将在广告间隔期间进入睡眠状态。
是的,设备从设备通电时继续传输(广播)。所以我希望它在广告间隔之间睡眠。
使用“UM-B-049DA1458X入门使用开发套件 - Pro_v1.1.pdf”来衡量当前我使用的电流。Page 29技术而不是教程教程4:睡眠模式电流测量因为我需要测量14586个子板电流消耗,同时运行示例代码“ble_app_sleepmode”并使用相同的示例代码“ble_app_sleepmode”来测量自定义板上的当前消耗。
目前在CRO中均测量250mV,其解释为2.5mA。(之前附加的图片)。SmartSnippets Toolbox Power Profiler还测量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是与适当的二进制图像,只要你使用这个芯片。
谢谢,下午好
>你能说明你最后是如何配置你的设备的吗?您将其作为外围模式并使用不可连接的广告,或者将其设置为广播模式?
使用non-connectable广告。(我正在将我们的代码从6.0.4.326中的ble_app_example移到新的SDK 6.0.10.511中的ble_app_sleepmode示例中。我们的板有一个外部RAM(因为我们也从DA14585切换到DA14586,并且CS配置为高)。希望这是一条正确的路。
“外围模式”是什么意思。有一个我缺少的设置吗?我上面接受的答案有3个步骤,我在ble_app_sleepmode examp上做了它们。
正如我在2019-07-02 09:43星期二问的那样,我仍然不明白为什么“.app_on adv_non_complete”和“.app_on adv_unddirective_complete”被要求指向同一件事,建议采取什么行动“.app_on adv_non_complete”而不是复制与“.app_on adv_unddirective_complete”相同的功能在user\u callback\u config.h中的“user\u app\u adv\u undirect\u complete”?
嗨anushiya,
当不可连接的广告完成时,将触发.app_on_adv_nonn_complete回调。但是,在无向广告完成后,将触发.app_on_adv_unddirect_complete。在.app_on_adv_nonn_complete中,当使用不可连接的广告时,您应该放置自己想要执行的回调。例如,如果停止广告,设备进入永久睡眠模式,则可以使用以下功能:
void user_app_non_conn_complete(uint8_t状态)
{
//禁用BLE和计时器事件的唤醒。只有外部(GPIO)唤醒事件才能唤醒处理器。
if (status == = GAP_ERR_CANCELED) / /取消
{
arch_ble_ext_wakeup_on ();
//配置唤醒按钮
app_button_enable();
}
}
谢谢,下午好
>在.app_on_adv_nonn_complete中,当使用不可连接的广告时,您应该放置自己想要执行的回调。
我完全同意。这就是为什么我在以下问题之前问:
我有
内部用户应用程序高级不可连接功能完成并分配给。app_on_adv_noncn_complete=用户_app_adv_non_connectable_complete并将其从最后一行删除
但这并不起。我可以知道为什么会吗?
嗨anushiya,
为延迟道歉。由于您停止了不可连接的广告并配置了。app_on_adv_nonconn_complete = user_app_adv_non_connectable_complete,应该触发user_app_adv_non_connectable_complete。您能否在调试模式下运行代码,步骤,并尝试在设备停止广告后找到代码的位置?哪个函数被触发?
谢谢,下午好