DA14585 -从睡梦中醒来只做一次广告

了解更多常见问题教程

15个员额/0个新员额
最后发表
MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
DA14585 -从睡梦中醒来只做一次广告

嗨,对话框的团队,

我正在使用SDk文件夹中misc文件夹中的“ble_app_Nonnon”示例制作自定义板。我的项目要求如下。

  • 无论何时,只要没有ble或其他活动,请进入睡眠模式(ARCH_EXT_sleep_ON)。
  • 当外部传感器给出数据时,对话芯片将在引脚变化中断时唤醒,并使用定时器0开始解码来自传感器的数据。
  • 解码数据并在广告字符串上更新它。
  • 使用'user_app_adv_start()'启动广告,并启动一个简单的计时器,该计时器将在6秒内过期。在此之前,广告数据将被广告。当app_easy定时器到期时,使用'app_easy_gap_advertise_stop()'停止广告,这将使芯片进入休眠状态。
  • 停止播发之前,将启用唤醒引脚,以便在下一个数据准备就绪时将芯片从睡眠中唤醒。

我已经在调试模式下完成了以上步骤。当我在RAM上运行我的程序并断开调试器时,当前消耗减少到2.4µA。当外部中断发生时,电流上升到50µA左右,在2.4µA到50µA之间振荡。(我想这是由于广告内部之间的睡眠)。所以我认为以上的概念是可行的。

但我被两个问题困住了。

1) 在睡眠模式下(调试器断开状态),当我的芯片广告时,我认为它只广告一次。因为我在BLE扫描仪应用程序上检查它,我注意到RSSI值只更新了一次。它只传送一次吗?。如果发射一次,为什么电流在2.4µA到50µA之间振荡6秒?

2)上述条件工作了一段时间,突然电流增加到350µa,然后就没有广告了。我的程序停止了吗?

请注意,只有当我断开调试器时,才会出现上述两种情况。

是什么导致了睡眠中的这两个问题?

问候,

做记号

设备:
PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

当在睡眠模式下执行任何类型的测量时,你不应该在调试模式下运行固件。否则,设备无法进入休眠模式,功耗将大幅增加。为此,我的建议是解除调试器的连接,因为这样可以防止系统进入睡眠状态。另外,一个非常重要的提示是,如果你在自定义板中使用SPI Flash,你应该关闭它。

您可以尝试进一步调试它吗?请在调试模式下运行它-在这一步中,功耗并不重要。您提到过,在第一次发布广告后,会发布一次广告…fw会做什么?WDOG是启用还是禁用的?我建议您启用它,否则,如果fw在某个地方出现故障,您将不会收到通知。如果您完全确定fw正在按预期运行(未发生WDOG或NMI),请使用SmartSnippets工具箱的Power Profiler检查它是否一次未发布广告。

谢谢,PM_Dialog

MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
你好,下午对话,

你好,下午对话,

当在调试模式下运行时,代码正确地发布并且固件不会在任何地方卡住。我在调试模式下运行了一个多小时的代码,它工作得很好。当我断开调试器并运行它时,问题(正如在第一篇文章中提到的)就会出现。

我还有一个疑问。“misc”文件夹中的示例代码“ble_app_uncon”是否支持扩展睡眠模式?因为它在调试模式下连接时工作正常。但当我断开调试器时,问题开始出现。

我只做6秒广告,然后停止。但它只做一次广告但在整个6秒内,电流消耗是振荡的。这意味着它在广告间隔之间醒来,但为什么没有数据包被传输。?

问候,

做记号

PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

默认情况下,SDK6.0.12的ble_app_Nonnon项目不支持睡眠模式。但是,您可以更改睡眠模式配置。由于它是一个自定义代码和自定义板,是否可以共享您所做的更改,以便在睡眠模式下配置它?开始调查路由原因的另一个选项可能是开始切换GPIO或打印一些调试消息,因为固件仅在非调试模式下卡住。在调试模式下,我假设您启用了WDOG。。

谢谢,PM_Dialog

MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
嗨PM_Dialog,

嗨PM_Dialog,

我的固件不会卡住。在整个6秒的持续时间里,它只传输一个广告。但在调试模式下,它在6秒的持续时间内传输4到5次。为什么它在非调试模式下只传输一次?睡眠方式影响语音广告吗?

对于睡眠模式,我做了以下更改。

静态常量睡眠\u状态\u t应用程序\u默认睡眠\u模式=ARCH\u EXT\u sleep\u ON;

我在6秒钟后停止了广告,我的芯片进入长时间睡眠。

问候,

做记号

PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

不确定发生了什么,因为它是一个自定义板/代码。你能在user_app_adv_start()和user_app_adv_nonconn_complete()中使用arch_printf()吗?还有,你能把能量分析器的截图发给我吗?当附加和取消附加调试器时。

谢谢,PM_Dialog

MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
你好

你好

我没有在我的自定义板上打印消息的选项。我正在使用万用表测量电流消耗。

我认为问题在于当我准备再次发布广告时调用user_app_adv_start()函数。

我附上以下代码供您参考。

void user\u app\u adv\u start(void){struct gapm\u start\u advision\u cmd*cmd=app\u easy\u gap\u non\u connectable\u advision\u get\u active()//存储初始广告数据和长度初始广告数据//存储初始扫描响应数据和长度initial_scan_rsp_len=cmd->info.host.scan_rsp_data_len;memcpy(initial_scan_rsp_data,cmd->info.host.scan_rsp_data,initial_scan_rsp_len)//更改//初始化数据_init();//加载广告数据和长度cmd->info.host.adv_data_len(cmd->info.host.adv_data,user_adv_data,user_adv_len)//Load scan response data and length cmd->info.host.scan_rsp_data_len=user_scan_rsp_data_len;memcpy(cmd->info.host.scan_rsp_data,user_scan_rsp_data,user_scan_rsp_data_len)//arch_set_extended_sleep_sleep(真);app_轻松_gap_不可连接启动)//计划下一次广告数据更新app_adv_data_update_timer_used=app_easy_timer(app_adv_data_update_TO,adv_data_update_timer_cb);}静态无效数据_init(){//加载初始广告数据和长度user_adv_data_len=initial_adv_data_len memcpy(user_adv_data,init data,init)//加载初始扫描响应数据和长度用户扫描rsp数据长度=初始扫描rsp数据长度;memcpy(用户扫描rsp数据,初始扫描rsp数据,用户扫描rsp数据长度);//加载预定义数据用户扫描rsp数据长度=数据长度;用户扫描rsp数据长度=扫描rsp数据长度;用户扫描rsp数据长度=数据长度[14] (2)txBuffer[2];用户[2]用户[15]数据[15]=txBuffer[3];用户[16]=txBuffer[4]txBuffer[4];用户[17]数据[17]=txBuffer[5];用户[5]用户[5]用户[5]数据[5];用户[5]用户[5]数据[5]用户[5]数据[5]TXBuBuBuBuBuBuffer[5];用户[5];用户[5]用户[5]用户[5]数据[5]用户[5]数据[5]用户[5]数据[5]用户[5]数据[5]数据[5]数据[5]数据[5];用户[5]数据[18]数据[18]数据[18]数据[18]数据[18]===TXBuBuBuBuBuBuBuBuBuBubu数据[18]==TXxBuBuBuBuBuBuBuBuBuBuBuBuBu数据[15]==0{user\u adv\u data[15]=0xff;}如果(用户数据[16]==0){user数据[16]=0xff;}如果(用户数据[17]==0){user数据[17]=0xff;}如果(用户数据[18]==0){user数据[18]=0xff;}如果(用户数据[19]==0){user数据[19]=0xff;}

MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
嗨PM_Dialog,

嗨PM_Dialog,

按照你的建议,我打开了GPIOperiph_init ()然后在睡觉前把它拉高arch_goto_sleep (sleep_mode)在arch_main.c。附上了示波器输出的截图。我面临的问题是,当我调用user_app_adv_start()时,芯片只传输一次数据。我通过查看android BLE扫描仪应用程序上的RSSI值确认了这一点。我也附上了样本代码。

我有紧急的产品,我已经改变了广告间隔200毫秒,管理广告数据通过调用“user_app_adv_start()的1秒后,我停止和广告功能齐全我打电话' user_app_adv_start()”。每次当我调用'user_app_adv_start()'时,我的应用只获得1次点击,直到我停止广告并再次调用它。

为什么'user_app_adv_start()'只发布一次数据?

你能分享我一个信标数据的样本代码,它在外部中断中醒来,修改广告字符串,传输它,然后进入睡眠。

问候,

做记号

附件:
PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

让我查一下,然后给你答复。

谢谢,PM_Dialog

PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

arch_main.c是SDK文件,强烈建议不要修改任何SDK文件。所有的修改都应该在应用层中完成,在以用户名称开始的字段中。所有其他与SDK相关的文件,如果其中任何文件被修改,我们无法保证应用程序将正常工作。SDK应该使用,因为它是由dialog提供的,没有任何其他修改。

关于你的源代码,我不能编译它,因为我得到了一些错误。请参阅下面的差异文件,了解如何停止不可连接的广告,将设备置于睡眠模式并将其唤醒。我的建议是从包含广告数据更新的SDK的ble_app_睡眠模式示例开始。如何构建应用程序以及如何更新信标数据取决于您。请按照SDK的ble_app_睡眠模式示例中的步骤操作。

/projects/target_apps/ble_examples/ble_app_sleepmode/src/config/user_callback_config.h b/projects/target_apps/ble_examples/ble_app_sleepmode/src/config/user_callback_config.h索引e61bd1b.. .eab8 100644——060 /项目/ target_apps / ble_examples / ble_app_sleepmode / src / config / user_callback_config.h + + + b /项目/ target_apps / ble_examples ble_app_sleepmode / src / config / user_callback_config.h @@ -54年8 + 54岁8 @@静态常量struct app_callbacks user_app_callbacks = {.app_on_update_params_rejected =零,.app_on_update_params_complete = NULL, .app_on_set_dev_config_complete = default_app_on_set_dev_config_complete - .app_on_adv_nonconn_complete = NULL, - .app_on_adv_undirect_complete = user_app_adv_undirect_complete, + .app_on_adv_nonconn_complete = user_app_adv_nonconn_complete, + .app_on_adv_undirect_complete =零,.app_on_adv_direct_complete = NULL, .app_on_db_init_complete = default_app_on_db_init_complete .app_on_scanning_completed = NULL, diff - git /项目/ target_apps / ble_examples / ble_app_sleepmode / src / user_sleepmode.c b /项目/ target_apps / ble_examples / ble_app_sleepmode / src / user_sleepmode.c指数c4b605e . .bf18b3c 100644——/项目/ target_apps / ble_examples / ble_app_sleepmode / src / user_sleepmode.c + + + b /项目/ target_apps / ble_examples / ble_app_sleepmode / src / user_sleepmode.c @@ -240年8 + 240,10 @@空白user_app_adv_start(空白)/ /安排接下来的广告数据更新app_adv_data_update_timer_used = app_easy_timer (APP_ADV_DATA_UPDATE_TO,adv_data_update_timer_cb);- struct gapm_start_advertise_cmd* cmd;- CMD = app_easy_gap_undirected_advertise_get_active();+// struct gapm_start_advertise_cmd* cmd;+// CMD = app_easy_gap_undirected_advertise_get_active(); + + struct gapm_start_advertise_cmd *cmd = app_easy_gap_non_connectable_advertise_get_active(); // Add manufacturer data to initial advertising or scan response data, if there is enough space app_add_ad_struct(cmd, &mnf_data, sizeof(struct mnf_specific_data_ad_structure), 1); @@ -249,7 +251,8 @@ void user_app_adv_start(void) // Set extended sleep with OTP copy during advertising arch_set_extended_sleep(true); - app_easy_gap_undirected_advertise_start(); + //app_easy_gap_undirected_advertise_start(); + app_easy_gap_non_connectable_advertise_start(); } void user_app_connection(uint8_t connection_idx, struct gapc_connection_req_ind const *param) @@ -312,11 +315,13 @@ static void app_button_press_cb(void) */ static void app_wakeup_cb(void) { - // If state is not idle, ignore the message - if (ke_state_get(TASK_APP) == APP_CONNECTABLE) - { - user_app_adv_start(); - } +// // If state is not idle, ignore the message +// if (ke_state_get(TASK_APP) == APP_CONNECTABLE) +// { +// user_app_adv_start(); +// } + + user_app_adv_start(); } /** @@ -335,9 +340,9 @@ static void app_button_enable(void) 40); // debouncing time = 0 } -void user_app_adv_undirect_complete(uint8_t status) +void user_app_adv_nonconn_complete(uint8_t status) { - // Disable wakeup for BLE and timer events. Only external (GPIO) wakeup events can wakeup processor. + // Disable wakeup for BLE and timer events. Only external (GPIO) wakeup events can wakeup processor. if (status == GAP_ERR_CANCELED) { arch_ble_ext_wakeup_on(); @@ -347,6 +352,18 @@ void user_app_adv_undirect_complete(uint8_t status) } } +//void user_app_adv_undirect_complete(uint8_t status) +//{ +// // Disable wakeup for BLE and timer events. Only external (GPIO) wakeup events can wakeup processor. +// if (status == GAP_ERR_CANCELED) +// { +// arch_ble_ext_wakeup_on(); + +// // Configure wakeup button +// app_button_enable(); +// } +//} + void user_app_disconnect(struct gapc_disconnect_ind const *param) { // Cancel the parameter update request timer diff --git a/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.h b/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.h index 8c33892..acae900 100644 --- a/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.h +++ b/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.h @@ -116,7 +116,7 @@ void user_app_connection(uint8_t connection_idx, * @return void **************************************************************************************** */ -void user_app_adv_undirect_complete(uint8_t status); +//void user_app_adv_undirect_complete(uint8_t status); /** **************************************************************************************** @@ -141,6 +141,8 @@ void user_catch_rest_hndl(ke_msg_id_t const msgid, void const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id); + +void user_app_adv_nonconn_complete(uint8_t status); /// @} APP

谢谢,PM_Dialog

MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
嗨PM_Dialog,

嗨PM_Dialog,

1) 当你编译我的代码时,你会遇到什么样的错误?。

2)我修改了你的arch_main.c文件,因为,当我的传感器发送一个中断,我必须等待大约20毫秒获得数据,但如果我不等待,我的代码将回到睡眠,我将错过数据。这就是为什么我修改arch_main.c文件,直到我得到数据,然后让芯片休眠。如何延长芯片的唤醒时间。对此你能提出一个建议吗?

3) 当我开始发布广告时,我添加到arch_main.c的大部分代码内容将不会执行,因为我正在检查主循环中的条件,并且在发布广告时不会执行它。为什么这会影响sdk和广告序列?。

4)当我得到一个中断,直到我处理我的传感器的数据,我不会开始广告。在我得到数据后,我将开始广告,我确信我的代码不会在广告期间运行。为什么这会给sdk带来问题呢?

谢谢,

做记号

MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20
嗨PM_Dialog,

嗨PM_Dialog,

请支持我以上几点。正如你所建议的,我已经在ble_examples中开始了睡眠模式项目的工作。我最大的疑问是,当我的外部传感器给出一个中断,并在20毫秒后才给出数据时,我必须如何防止芯片在我从睡眠中醒来后的20毫秒内进入睡眠状态。

问候,

做记号

PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

请查看随附的带有Keil IDE错误的日志文件。指出您正在使用的SDK版本将非常有帮助。不确定SDK版本,但强烈建议使用最新版本(SDK6.0.12)。

  • 删除所有未使用的代码行。这使得遍历代码和理解实现变得困难。
  • 所有的修改和开发都应该在APPLICATION层完成。不应修改任何SDK。如果您修改SDK文件,我们无法提供任何支持。
  • 请从SDK文件中删除所有代码段,如arch_main.c中的代码段。
  • 所有应用程序层文件都以“用户”开头。
  • 请向我提供一个工作项目,将其添加到projects\target\u apps\misc SDK目录下,并指明SDK版本。
  • 为了开始调试它,我应该在上述路径下复制粘贴项目,打开它并编译它。
  • 记住,你有一个自定义板,所以我将尝试复制的问题,在我们的专业发展板。
  • 当处于睡眠模式时,设备将在广告间隔(或可连接广告的连接间隔)之间进入睡眠模式。所有外围域(包括I2C)都已断电。当传感器有数据要发送时,您应该首先唤醒设备,而不是唤醒控制器。
  • 我的建议是在ble_app_sleepmode示例中开始开发。我已经为您提供了一个带有所需更改的diff文件。
  • 应该启用WDOG,否则如果应用程序卡住,您将不会收到通知。
  • 如果您运行SDK的默认ble_app_睡眠模式示例,您是否能够停止广告并将设备置于睡眠模式?

谢谢,PM_Dialog

附件:
MarkDsylva_2277
离线
最后看到:1周6天前
加入:2019-06-19 04:20

嗨PM_Dialog,

这个问题在我们添加了外部32Khz晶体振荡器后得到了解决。

似乎ble_app_sleepmode代码没有32Khz晶体是不稳定的。但你们的数据表上说这个32Khz是可选的,这很容易让人误解。请更正数据表,否则可能会误导他人。我花了3-4个月的时间在这个问题上,没有任何线索,这是由于外部晶体。

无论如何,感谢您的在线支持。

问候,

做记号

PM_Dialog
离线
最后看到:48分钟21秒前
工作人员
加入:2018-02-08 11:03
嗨,马克,

嗨,马克,

很高兴你让它工作了。这就是我们之前的电话会议讨论的内容。谢谢你的提示。

问候,PM_Dialog