嗨,对话框的团队,
我工作在一个自定义板与'ble_app_nonconn'的例子在misc文件夹在SDk文件夹。我的项目要求如下。
- 每当没有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之间振荡。(我想这是由于广告内部之间的睡眠)。所以我认为以上的概念是可行的。
但我被两个问题困住了。
1)在睡眠模式(调试器断开条件)时,当我的芯片广告时,我认为它仅广告一次。因为我在BLE扫描仪应用上检查它,我注意到RSSI值只会更新一次。它只会传播一次?如果它正在发送一次,那么为什么当前振荡在2.4μA到50μA之间的6秒持续时间?
2)上述条件工作了一段时间,突然电流增加到350µa,然后就没有广告了。我的程序停止了吗?
请注意,只有当我断开调试器时,才会出现上述两种情况。
什么可能导致这两个问题在睡眠期间?
问候,
标记
设备:
嗨马克,
当在睡眠模式下执行任何类型的测量时,你不应该在调试模式下运行固件。否则,设备无法进入休眠模式,功耗将大幅增加。为此,我的建议是解除调试器的连接,因为这样可以防止系统进入睡眠状态。另外,一个非常重要的提示是,如果你在自定义板中使用SPI Flash,你应该关闭它。
你能试着进一步调试它吗?请在调试模式下运行-在这个步骤中功耗并不重要。你说过这是一次广告,第一次广告之后fw做什么?WDOG是否已启用?我建议你启用它,否则如果fw在某个地方卡住了,你将不会收到通知。如果你完全确定fw按照预期运行(没有发生WDOG或NMI),请使用SmartSnippets工具箱的功率分析器来检查它是否没有发布一次。
谢谢,PM_Dialog
嗨PM_Dialog,
当在调试模式下运行时,代码正确地发布并且固件不会在任何地方卡住。我在调试模式下运行了一个多小时的代码,它工作得很好。当我断开调试器并运行它时,问题(正如在第一篇文章中提到的)就会出现。
我还有一个疑问。你的示例代码'ble_app_nonconn'在'misc'文件夹支持扩展睡眠模式?因为它在调试模式连接时工作正常。但是当我断开调试器时,问题开始了。
我是广告6秒钟并停止它。但它仅广告一次,但整个6秒内的当前消耗量有振荡。这意味着它在广告间隔之间唤醒,但为什么不发送数据包。?
问候,
标记
嗨马克,
SDK6.0.12的BLE_APP_NONCONN项目默认情况下不支持睡眠模式。但是,您可以更改睡眠模式配置。由于它是自定义代码和自定义板,因此可以共享您在睡眠模式下配置的更改吗?启动调查哪个是路由原因的另一个选项可能是开始切换GPIO或打印一些调试消息,因为仅在非调试模式下卡住的固件gests。在调试模式下,我假设您已启用WDog ..
谢谢,PM_Dialog
嗨PM_Dialog,
我的固件不会被卡住。它仅在整个6秒持续时间传输单个广告。但是在调试模式下,它会在6秒持续时间传输4到5次。为什么它只在非调试模式中传输一次?是影响BLE广告的睡眠模式吗?
对于睡眠模式,我做了以下更改。
我在6秒后停止了广告,我的芯片进入了长时间睡眠。
问候,
标记
嗨马克,
不确定发生了什么,因为它是一个自定义板/代码。你能在user_app_adv_start()和user_app_adv_nonconn_complete()中使用arch_printf()吗?还有,你能把能量分析器的截图发给我吗?当附加和取消附加调试器时。
谢谢,PM_Dialog
你好 ,
我没有选择打印消息在我的自定义板。我正在用万用表测量电流消耗。
我认为问题在于在我准备好宣传的时候调用user_app_adv_start()函数。
我已经附上下面的代码进行推荐。
嗨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()'只发布一次数据?
你能分享我一个信标数据的样本代码,它在外部中断中醒来,修改广告字符串,传输它,然后进入睡眠。
问候,
标记
嗨马克,
让我检查一下,我会回复你。
谢谢,PM_Dialog
嗨马克,
ARCH_MAIN.c是SDK文件,强烈建议不要修改任何SDK文件。所有修改都应在应用程序层中完成,以user_开头的文件中。作为SDK的所有其他文件相关,如果其中任何一个都被修改,我们无法保证应用程序将正常工作。SDK应使用,因为它由对话框提供,而无需任何其他修改。
关于你的源代码,我无法编译它,因为我几乎没有错误。请参阅下面的差异文件,了解如何停止不可连接的广告,将设备放在睡眠模式下并唤醒。我的建议是从包含广告数据更新的SDK的BLE_APP_SLEEPMODE示例开始。您如何建立应用程序以及如何更新信标数据取决于您。请按照SDK的BLE_APP_SLEEPMODE示例中的步骤操作。
谢谢,PM_Dialog
嗨PM_Dialog,
当你编译我的代码时,你会得到什么样的错误?
2)我修改了你的arch_main.c文件,因为,当我的传感器发送一个中断,我必须等待大约20毫秒获得数据,但如果我不等待,我的代码将回到睡眠,我将错过数据。这就是为什么我修改arch_main.c文件,直到我得到数据,然后让芯片休眠。如何延长芯片的唤醒时间。对此你能提出一个建议吗?
3)当我开始我的广告,我添加到arch_main.c的大部分代码内容不会执行,因为我在主循环中检查条件,我不会执行它,而我是广告。为什么这会影响你的sdk和广告序列?
4)当我收到中断时,直到我从传感器处理数据时,我就不会启动广告。在我收到数据后,我将开始广告,我相信我的代码都不会在广告期间运行。那么为什么这对SDK给出了任何问题?
谢谢,
标记
嗨PM_Dialog,
请支持我以上几点。正如你所建议的,我已经在ble_examples中开始了睡眠模式项目的工作。我最大的疑问是,当我的外部传感器给出一个中断,并在20毫秒后才给出数据时,我必须如何防止芯片在我从睡眠中醒来后的20毫秒内进入睡眠状态。
问候,
标记
嗨马克,
请从Keil IDE中找到带有错误的日志文件。指出您正在使用的SDK版本将非常有帮助。不确定SDK版本,但我们强烈建议使用最新版本(SDK6.0.12)。
谢谢,PM_Dialog
嗨PM_Dialog,
在添加外部32kHz晶体振荡器后,该问题被整理出来。
似乎ble_app_sleepmode代码没有32Khz晶体是不稳定的。但你们的数据表上说这个32Khz是可选的,这很容易让人误解。请更正数据表,否则可能会误导他人。我花了3-4个月的时间在这个问题上,没有任何线索,这是由于外部晶体。
无论如何,感谢您的在线支持。
问候,
标记
嗨马克,
很高兴你把它修好了。这是我们在之前的电话会议上讨论的内容。也谢谢你的暗示。
问候,pm_dialog