你好,
我在设置扩展睡眠模式(没有opt副本)时遇到了麻烦。我们正在使用自定义14586板。
在arch_main.c中,在过程int main (void)(第139行)
如果我更换SLEEP_MODE = rwip_power_down();与SLEEP_MODE = mode_active(线176);它不断地传输数据毫无问题每隔一秒。
但是如果我离开sleep\u mode=rwip\u power\u down(),数据包就不会更新。初始化后,数据包更新一次,然后每隔一秒钟发送一次相同的数据包。
Adv_data_update_timer_cb使用APP_ADV_DATA_UPDATE_TO调度,不改变,保持为100
CFG_MAX_SLEEP_DURATION_PERIODIC_WAKEUP_MS为500。
尝试值687.5和3000 .intv_min和.intv_max
app_default_sleep_mode设置为ARCH_EXT_SLEEP_ON
所有的arch_set_extended_sleep调用都带有参数false (arch_set_extended_sleep(false))。
app_easy_gap_non_connectable_advertise_start ();使用。
SysCLK更改为16MHz。
定时器0和SYSTICK用于设置MNF_DATA的某些值。
我有两个问题,
1)数据包没有得到更新
2)从智能片段的当前关卡和开发板的测试点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:睡眠模式电流测量。
谢谢,PM_Dialog
感谢您的及时回复。我不想要一个连接的状态,并想滥用系统无限期地传输一个数据包曾经x秒。
>您不应该修改arch_main.c文件,因为它是与SDK相关的文件。
我没有在这里改变任何东西。只是为了让它继续传输,我临时替换了sleep_mode=rwip_power_down();(第176行)显示arch_main.c的休眠模式=激活模式,并确认其持续传输。
>用户配置.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调用调用参数错误(arch_set_extended_sleep(假))。原始的exaple有arch_set_extended_sleep(真)
有关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_睡眠模式示例中执行了这些步骤
如果你发现任何有用的答案,请标记为“接受”。
谢谢,PM_Dialog
感谢您的帮助。你的建议帮我把设备上的广播模式。但仍然有以下两个问题。
1)mnf_data_update()仍然不被调用和
2)smartsnippets表示0.5毫安与期间传输时间的尖峰(与调试模式移除)意味着睡眠模式不被调用。
(使用示波器,经由测试点在母板上的smartsnippets值匹配)
我使用的是SDK 6.0.4.326。
i定义了user_app_adv_non_connectable_complete(uint8_t)
无效用户\u应用\u高级\u不可连接\u完成(uint8\t状态)
{
// irespective的状态,安排下一个传送数据包
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”
应用程序\默认\睡眠\模式=拱门\外部\睡眠\开启
嗨anushiya,
我想让你知道SDK6.0.4是一个非常老的版本,它目前不受支持。为此,我强烈建议您下载并使用DA14585/6产品系列的最新版本SDK,即SDK6.0.10。SDK6.0.10的ble_app_sleep模式示例用于我为您提供的步骤,以便将您的in设备设置为广播模式。每次非连接的发布完成时都会触发user_app_adv_non_connectable_complete()。因此,您在这个函数中设置了一个计时器,当计时器到期时,将执行adv_data_update_timer_cb。在SDK的ble_app_sleepmode示例中,请遵循将设备配置为广播模式的指导方针。我建议你只做我提供给你的修改不可连接的广告将停止每个APP_ADV_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
>因此,当芯片与按钮按压唤醒时,adverting日期将被更新。
我想要一个周期性的唤醒,而不是一个按钮按下唤醒。没有外界的互动。
>如果你想在设备发布时更新制造商数据,你应该设置第二个定时器。所以你将有一个定时器停止广告和第二个定时器更新制造的具体数据。
我不需要这个。醒来,传送,更新,睡眠对我来说很好。
所以在完整的函数中,如果我提到的那样,如果我提到的那样好吗?
谢谢你。
你好,
我下载了SDK 6.0.10.511,并做了你建议的更改。
无效用户应用程序打开未完成(uint8状态)
{
//安排下一次广告数据更新
app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb);
}
空白user_app_on_adv_nonconn_complete (uint8_t状态);
.app_on_adv_nonconn_complete = NULL,
作为
.app_on_adv_ nonconn _complete = user_app_adv_ nonconn _complete,
(类似于SDK6.0.4.326)
案例GAPM_CANCEL:
{
如果(参数->状态!=间隙错误-无错误)
{
断言错误(0);
}
......
}
所以必须注释掉app_easy_gap_advertise_stop();在静态void adv_data_update_timer_cb()
然后它不断传播。但仍然是同样的问题。
1) MNF_数据未更新,这意味着原始数据的最后两个字节在一段时间内为0000,并更新一次至0100,然后保持不变。
[{“时间戳”:“2019-06-13T07:14:09Z”,“类型”:“未知”,“mac”:“80EACA70005”,“bleName”:“rssi”:-39,“原始数据”:“03030A1811072F2A93A6BDD84152AC0B10992EC6FEED05FFCDAB0100”}]
2)电流消耗2.5毫安(请见附图)。
嗨anushiya,
让我查一下,我会尽快给你答复。
谢谢,PM_Dialog
请问有什么最新消息吗?
请在SDK的干净ble_app_睡眠模式示例中尝试以下步骤。
如果你想有非连接广告,你应该做以下事情:
1修改用户_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_TO秒更新1。
谢谢,PM_Dialog
感谢您的答复。尝试这样的MNF_DATA正在得到更新。但smartsnippets仍表示,消费2.5毫安(凯尔环境下来后加载代码关闭)。难道这不是意味着它不会进入睡眠模式。我得到附着在我以前的消息相同的波型。
嗨anushiya,
如果您发现以前的答案有用,请将其标记为“已接受”。
能否请您说明您其次才能测量休眠电流的方法>请注意,设备进入广告间隔之间休眠模式。
谢谢,PM_Dialog
在您提供的解决方案,我有一个问题:
在步骤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将是不同的,不是吗?我有
里面user_app_adv_non_connectable_complete funtions和分配。app_on_adv_nonconn_complete = user_app_adv_non_connectable_complete和从最后一行除去它
但这并没有奏效。我能知道为什么吗?
关于测量电流,我用两种方法测量。
1)使用smartsnippets和混合连接(JTAG和COM端口)。(使用引导器我试图开发板上除去所述JTAG跳线以及下载代码后)。得出正确的是0.5毫安(Peack电流5mA电流,电流大道0.5mA)即可
2) 使用测试点TP6和相应的跨接线激活放大器(预计电流太小)。示波器上的测量值是智能代码段中接收到的值的100倍。
如果代码是放DA14586进入睡眠模式时,我想到的电流在微安范围。
我下载了一个新版本的6.0.10.511,提取了代码,只更改了你上面提到的3项。
嗨anushiya,
这个。应用程序在非直接应用程序上,并完成。app_on_adv_nonn_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_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-049 DA1458x Getting started with Development Kit - pro_v1 .pdf”第29页的技术,而不是教程教程4:睡眠模式电流测量因为我需要在运行样本代码“ble_app_sleepmode”时测量14586子板的当前消耗,并使用相同的样本代码“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_nonn_complete”中建议采取什么操作,而不是复制与“.app_on adv_undirect_complete”相同的函数
嗨anushiya,
请您说明您如何最终配置设备?您将其作为外围模式并使用不可连接的广告,或者将其设置为广播模式?
关于您的第二个问题,是的,您应该为DA14586设备构建一个项目,只要您使用该芯片,闪存就会带有适当的二进制图像。
谢谢,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_sleepmode例子中做了它们。
当我问于星期二,2019年7月2日09:43,我还是不明白,为什么“.app_on_adv_nonconn_complete”和“ app_on_adv_undirect_complete”问点什么recomended行动采取“.app_on_adv_nonconn_complete”同样的事情而不是仅仅在user_callback_config.h复制相同的功能“ app_on_adv_undirect_complete”到‘user_app_adv_undirect_complete’?
嗨anushiya,
完成非连接的广告时,.app_on_adv_nonconn_complete回调将打击。然而,西港岛线.app_on_adv_undirect_complete广告undirect完成时触发。在.app_on_adv_nonconn_complete你应该把你想要使用的非连接的广告时要执行自己的回调。例如,你可以使用下面的函数,如果停止广告和设备进入永久休眠模式:
void user_app_non_conn_complete(uint8_t状态)
{
//禁用唤醒的BLE和定时器事件。只有外部(GPIO)唤醒事件可以唤醒处理器。
if (status == = GAP_ERR_CANCELED) / /取消
{
arch_ble_ext_wakeup_on ();
//配置唤醒按钮
app_button_enable();
}
}
谢谢,PM_Dialog
>在.app_on_adv_nonconn_complete你应该把你自己的回调你想使用非连接的广告时执行。
我完全同意。这就是为什么我下面问过:
我有
里面user_app_adv_non_connectable_complete funtions和分配。app_on_adv_nonconn_complete = user_app_adv_non_connectable_complete和从最后一行除去它
但这并没有奏效。我能知道为什么吗?
嗨anushiya,
很抱歉耽搁了。因为你停止了不可连接的广告并且你配置了。App_on_adv_nonconn_complete = user_app_adv_non_connectable_complete,则应该触发user_app_adv_non_connectable_complete。你能不能在调试模式下运行代码,并试着在设备停止广告后找到代码去了哪里?触发了哪个函数?
谢谢,PM_Dialog