嗨对话小组,
我工作在一个自定义板与'ble_app_nonconn'的例子在misc文件夹在SDk文件夹。我的项目要求如下。
- 每当没有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之间。(我猜这是由于广告Internvals之间的睡眠)。所以我认为上面的概念可以很好地工作。
但我陷入了两个问题。
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次。为什么它在非调试模式下只传输一次?睡眠方式影响语音广告吗?
对于睡眠模式,我做了以下更改。
我在6秒后停止了广告,我的芯片进入了长时间睡眠。
问候,
标记
嗨,马克,
不确定发生了什么,因为它是自定义板/代码。您能否请在user_app_adv_start()和user_app_adv_nonconn_complete()中使用Arch_Printf()在user_app_adv_nonconn_complete()中?另外,请你发给我一个电力分布器的屏幕截图吗?当调试器附加并取消连接时。
谢谢,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值来确认这一点。我也附上了示例代码。
我有紧急的产品,我已经改变了广告间隔200毫秒,管理广告数据通过调用“user_app_adv_start()的1秒后,我停止和广告功能齐全我打电话' user_app_adv_start()”。每次当我调用'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文件,因为当我的传感器发送中断时,我必须等待大约20ms来获取数据,但如果我不等待我的代码将恢复入睡,我会错过数据。这就是为什么我修改了ARCH_MAIN.c文件等待我的数据,然后将芯片放入睡眠状态。如何延长芯片的唤醒时间?你能建议一个想法吗?
3)当我开始我的广告,我添加到arch_main.c的大部分代码内容不会执行,因为我在主循环中检查条件,我不会执行它,而我是广告。为什么这会影响你的sdk和广告序列?
4)当我得到一个中断,直到我处理我的传感器的数据,我不会开始广告。在我得到数据后,我将开始广告,我确信我的代码不会在广告期间运行。为什么这会给sdk带来问题呢?
谢谢,
标记
嗨pm_dialog,
请支持上面的积分。正如您所建议的那样,我已经开始在BLE_Examples的SleepMode项目上工作。我最大的怀疑是当我的外部传感器给出中断并仅在20ms后提供数据时,我如何在从睡眠中醒来后,我如何防止芯片进入睡眠。
问候,
标记
嗨,马克,
请从Keil IDE中找到带有错误的日志文件。指出您正在使用的SDK版本将非常有帮助。不确定SDK版本,但我们强烈建议使用最新版本(SDK6.0.12)。
谢谢,PM_DIALOG.
嗨pm_dialog,
这个问题在我们添加了外部32Khz晶体振荡器后得到了解决。
似乎BLE_APP_SLEEPMODE代码在没有32kHz水晶的情况下不稳定。但是你的数据表说,这32kHz是可选的,这是非常误导的。请纠正数据表,也可以误导别人。我在这个问题上花了3-4个月,没有任何内容,没有任何内容。
无论如何,感谢您的在线支持。
问候,
标记
嗨,马克,
很高兴你把它修好了。这是我们在之前的电话会议上讨论的内容。也谢谢你的暗示。
问候,PM_Dialog