DA14585 - 仅在睡眠中宣传一次

⚠️
嗨,...感谢您来论坛。令人兴奋的消息!我们现在正在迁至我们的新论坛平台,将提供更好的功能,并包含在主对话框网站中。所有帖子和帐户都已迁移。我们现在只接受新论坛上的流量 - 请发布任何新线程//www.wsdof.com/support。我们将在未来几天修复错误/优化搜索和标记。
15个帖子/ 0新
最后一篇
markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
DA14585 - 仅在睡眠中宣传一次

嗨对话小组,

I am working on a custom board with the 'ble_app_nonconn' example in the misc folder in SDk folder. My project requirement is as follows.

  • 每当没有BLE或其他活动时都会进入睡眠模式(ARCH_EXT_SLEEP_ON)。
  • 当外部传感器提供数据时,对话框芯片将唤醒引脚更改中断并使用计时器0开始从传感器中解码数据。
  • 解码数据并在广告字符串上更新它。
  • 使用'user_app_adv_start()'启动广告,并启动一个易于计时器,将在6秒内过期。直到那时广告数据被宣传。当App_easy Timer到期时,使用'app_easy_gap_advertise_stop()'停止广告,这将使芯片睡眠。
  • 在停止广告之前,将启用唤醒引脚以在下一个数据准备就绪时从睡眠中唤醒芯片。

我在调试模式下填写上述步骤。当我在RAM上运行我的程序并断开调试器时,电流消耗会降低到2.4μA。当外部中断发生时,电流上升到大约50μA,振荡在2.4μA至50μA之间。(我猜这是由于广告Internvals之间的睡眠)。所以我认为上面的概念可以很好地工作。

但我陷入了两个问题。

1)在睡眠模式(调试器断开条件)时,当我的芯片广告时,我认为它仅广告一次。因为我在BLE扫描仪应用上检查它,我注意到RSSI值只会更新一次。它只会传播一次?如果它正在发送一次,那么为什么当前振荡在2.4μA到50μA之间的6秒持续时间?

2)上述条件有效期为一段时间和突然间,电流增加到350μA,然后根本没有广告。我的节目停止了吗?

请注意,仅当我断开调试器时,才会出现上述两个条件。

什么可能导致这两个问题在睡眠期间?

问候,

标记

设备:
PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

在睡眠模式下执行任何类型的测量时,您不应以调试模式运行固件。否则,该设备无法进入睡眠模式,并且功耗将大大增加。为此,我的建议将成为调试器未连接,因为这可以防止系统睡眠。此外,非常重要的提示是,如果您在您的自定义板中使用SPI Flash,则应将其供电。

Can you please try to debug it furthermore? Please run it in debug mode - power consumption is not important in this step. You mentioned that is advertising once… After the first advertising what does the fw do? The WDOG is enabled or disabled? I would suggest you to have it enabled, otherwise you will not be notified if the fw stucks somewhere. If you are completely sure that the fw is running as expected (no WDOG occurred or NMI), please use the Power Profiler of SmartSnippets Toolbox to check that it is not advertising once.

谢谢,PM_DIALOG.

markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
HI PM_Dialog,

HI PM_Dialog,

在调试模式下运行时,代码正常通告,固件不会卡住任何地方。我在调试模式下运行了一小时的代码,它可以正常工作。当我断开调试器并运行它时,问题(如第一个帖子中所述)发生。

I do have another doubt. Does your example code 'ble_app_nonconn' in the 'misc' folder support extended sleep mode?. Because it works properly when connected in debugging mode. But when i disconnect the debugger the problem starts.

我是广告6秒钟并停止它。但它仅广告一次,但整个6秒内的当前消耗量有振荡。这意味着它在广告间隔之间唤醒,但为什么不发送数据包。?

问候,

标记

PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

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

谢谢,PM_DIALOG.

markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
嗨pm_dialog,

嗨pm_dialog,

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

For sleep mode i have made the following changes.

static const sleep_state_t app_default_sleep_mode = arch_ext_sleep_on;

I stopped the advertisement after 6 seconds and my chip goes into extended sleep.

问候,

标记

PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

不确定发生了什么,因为它是自定义板/代码。您能否请在user_app_adv_start()和user_app_adv_nonconn_complete()中使用Arch_Printf()在user_app_adv_nonconn_complete()中?另外,请你发给我一个电力分布器的屏幕截图吗?当调试器附加并取消连接时。

谢谢,PM_DIALOG.

markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
你好 ,

你好 ,

I dont have an option to print messages in my custom board. I am using a multimeter to measure the current consumption.

我认为问题在于在我准备好宣传的时候调用user_app_adv_start()函数。

我已经附上下面的代码进行推荐。

void user_app_adv_start(void) { struct gapm_start_advertise_cmd *cmd = app_easy_gap_non_connectable_advertise_get_active(); // Store initial advertising data and length initial_adv_data_len = cmd->info.host.adv_data_len; memcpy(initial_adv_data, cmd->info.host.adv_data, initial_adv_data_len); // Store initial scan response data and length initial_scan_rsp_data_len = cmd->info.host.scan_rsp_data_len; memcpy(initial_scan_rsp_data, cmd->info.host.scan_rsp_data, initial_scan_rsp_data_len); //changed // Initialize data data_init(); // Load advertising data and length cmd->info.host.adv_data_len = user_adv_data_len; memcpy(cmd->info.host.adv_data, user_adv_data, user_adv_data_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(true); app_easy_gap_non_connectable_advertise_start(); //Schedule the next advertising data update app_adv_data_update_timer_used = app_easy_timer(APP_ADV_DATA_UPDATE_TO, adv_data_update_timer_cb); } static void data_init() { // Load initial advertising data and length user_adv_data_len = initial_adv_data_len; memcpy(user_adv_data, initial_adv_data, user_adv_data_len); // Load initial scan response data and length user_scan_rsp_data_len = initial_scan_rsp_data_len; memcpy(user_scan_rsp_data, initial_scan_rsp_data, user_scan_rsp_data_len); //load predefined data user_adv_data_len = ADV_DATA_LEN ; user_scan_rsp_data_len = SCAN_RSP_DATA_LEN ; user_adv_data[12] = 7; user_adv_data[13] = txBuffer[1]; user_adv_data[14] = txBuffer[2]; user_adv_data[15] = txBuffer[3]; user_adv_data[16] = txBuffer[4]; user_adv_data[17] = txBuffer[5]; user_adv_data[18] = txBuffer[6]; user_adv_data[19] = txBuffer[9]; if(user_adv_data[13]==0){ user_adv_data[13]=0xff; } if(user_adv_data[14]==0){ user_adv_data[14]=0xff; } if(user_adv_data[15]==0){ user_adv_data[15]=0xff; } if(user_adv_data[16]==0){ user_adv_data[16]=0xff; } if(user_adv_data[17]==0){ user_adv_data[17]=0xff; } if(user_adv_data[18]==0){ user_adv_data[18]=0xff; } if(user_adv_data[19]==0){ user_adv_data[19]=0xff; } }

markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
嗨pm_dialog,

嗨pm_dialog,

正如你建议的那样,我拉下了一个gpioperiph_init()然后在睡前睡觉之前把它拉高Arch_Goto_Sleep(Sleep_Mode)在Arch_Main.cn。我附上了示波器输出的屏幕截图。我面临的问题是,当我调用user_app_adv_start()时,芯片仅发送一次数据。我通过查看Android中的BLE Scanner应用程序上的RSSI值来确认这一点。我也附上了示例代码。

正如我对我的产品的紧急演示一样,我已经改变了广告间隔到200ms和以某种方式通过调用'user_app_adv_start()'和1秒后我停止它以及在我打电话的广告完整功能之后宣传数据。user_app_adv_start()'再次。我在我的应用中重复了6秒钟,我正在获得多面广告命中。每次我打电话'user_app_adv_start()',我在我的应用程序中只有1个点击,直到我停止广告并再次调用它。

为什么'user_app_adv_start()'只广告数据一次?

请您可以分享我的标志数据的示例代码,用于在外部中断上唤醒并修改广告字符串并传输并睡眠。

问候,

标记

Attachment:
PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

让我检查一下,我会回复你。

谢谢,PM_DIALOG.

PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

ARCH_MAIN.c是SDK文件,强烈建议不要修改任何SDK文件。所有修改都应在应用程序层中完成,以user_开头的文件中。作为SDK的所有其他文件相关,如果其中任何一个都被修改,我们无法保证应用程序将正常工作。SDK应使用,因为它由对话框提供,而无需任何其他修改。

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

diff --git a/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 index e61bd1b..060eab8 100644 --- a/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 @@ -54,8 +54,8 @@ static const struct app_callbacks user_app_callbacks = { .app_on_update_params_rejected = NULL, .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 = NULL, .app_on_adv_direct_complete = NULL, .app_on_db_init_complete = default_app_on_db_init_complete, .app_on_scanning_completed = NULL, diff --git a/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.c b/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.c index c4b605e..bf18b3c 100644 --- a/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.c +++ b/projects/target_apps/ble_examples/ble_app_sleepmode/src/user_sleepmode.c @@ -240,8 +240,10 @@ void user_app_adv_start(void) // Schedule the next advertising data update 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.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
嗨pm_dialog,

嗨pm_dialog,

1) What kind of errors are u getting when u compile my code?.

2)我修改了你的Arch_main.c文件,因为当我的传感器发送中断时,我必须等待大约20ms来获取数据,但如果我不等待我的代码将恢复入睡,我会错过数据。这就是为什么我修改了ARCH_MAIN.c文件等待我的数据,然后将芯片放入睡眠状态。如何延长芯片的唤醒时间?你能建议一个想法吗?

3) When I start my advertising, most of the code content that I added to arch_main.c will not execute because I am checking for conditions in the main loop and I will not execute it while I am advertising. Why is that affecting your sdk and advertising sequences?.

4)当我收到中断时,直到我从传感器处理数据时,我就不会启动广告。在我收到数据后,我将开始广告,我相信我的代码都不会在广告期间运行。那么为什么这对SDK给出了任何问题?

谢谢,

标记

markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20
嗨pm_dialog,

嗨pm_dialog,

请支持上面的积分。正如您所建议的那样,我已经开始在BLE_Examples的SleepMode项目上工作。我最大的怀疑是当我的外部传感器给出中断并仅在20ms后提供数据时,我如何在从睡眠中醒来后,我如何防止芯片进入睡眠。

问候,

标记

PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

Please find attached a log file with the errors from the Keil IDE. It would be very helpful to indicate the SDK version that you are using. Not sure about the SDK version but we strongly recommend using the latest version (SDK6.0.12).

  • 删除所有未使用的代码行。这使得难以通过代码并理解实现。
  • 所有修改和开发都应在应用层中完成。没有一个SDK应该修改。如果修改SDK文件,我们无法提供任何支持。
  • 请在ARCH_MAIN.c中删除SDK文件中的所有代码片段。
  • All the application layer files start with “ user_ “.
  • 请为我提供一个工作项目,将其添加到Projects \ target_apps \ misc sdk目录下,并指出SDK版本。
  • 为了开始调试它,我应该在上述路径下复制粘贴项目,打开它并编译它。
  • 请记住,您有一个定制董事会,所以我会尝试在我们的专业开发板上复制这个问题。
  • When in sleep mode, the device will go into sleep mode between advertising intervals (or connection intervals in case of connectable advertising). All the peripheral domains, including the I2C are powered down. When the sensor has data to send, you should wake up the device first thought the wake-up controller.
  • 我的建议是在BLE_APP_SLEEPMODE示例中开始开发。我为您提供了差异文件,需要更改。
  • 应该启用WDOG,否则如果应用程序卡住,则不会通知您。
  • If you run the default ble_app_sleepmode example of the SDK, are you able to stop advertising and put the device into sleep mode?

谢谢,PM_DIALOG.

Attachment:
markdsylva_2277.
Offline
最后一次露面:2个月2周前
Joined:2019-06-19 04:20

嗨pm_dialog,

在添加外部32kHz晶体振荡器后,该问题被整理出来。

似乎BLE_APP_SLEEPMODE代码在没有32kHz水晶的情况下不稳定。但是你的数据表说,这32kHz是可选的,这是非常误导的。请纠正数据表,也可以误导别人。我在这个问题上花了3-4个月,没有任何内容,没有任何内容。

Any way, thank you for your online support.

问候,

标记

PM_DIALOG.
Offline
最后一次露面:1天8小时前
Staff
Joined:2018-02-08 11:03
嗨马克,

嗨马克,

很高兴你找到了工作。这是铁饼sed over our previous conference calls. Thanks for your indication too.

问候,pm_dialog