嗨对话小组,
我正在使用SDK文件夹中的“BLE_APP_NONCONN”示例的自定义板。我的项目要求如下。
- 当没有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 Toolbox的电源分布程序检查它是否未广告一次。
谢谢,PM_DIALOG.
嗨pm_dialog,
在调试模式下运行时,代码正常通告,固件不会卡住任何地方。我在调试模式下运行了一小时的代码,它可以正常工作。当我断开调试器并运行它时,问题(如第一个帖子中所述)发生。
我确实有别的疑问。您的示例代码在“MISC”文件夹中的“BLE_APP_NONCONN”是否支持扩展睡眠模式?因为在调试模式下连接时它正常工作。但是当我断开调试器时,问题就开始了。
我在做6秒钟的广告,然后停止。但是它只做了一次广告但是在整个6秒内,电流消耗会有振荡。这意味着它在广告间隔之间唤醒,但为什么没有数据包被传输。?
问候,
马克
嗨,马克,
SDK6.0.12的ble_app_nonconn项目默认不支持睡眠模式。但是,您可以更改睡眠模式配置。由于它是一个自定义代码和自定义板,是否有可能共享您所做的更改,以便在睡眠模式下配置它?另一个开始调查路由原因的选项可能是开始切换GPIO或打印一些调试消息,因为固件只有在非调试模式下才会卡住。在调试模式下,我假设您已经启用了WDOG。
谢谢,PM_DIALOG.
嗨pm_dialog,
我的固件不会卡住。在整个6秒的时间内,它只发送一个广告。但在调试模式下,它发送4到5次,持续时间为6秒。为什么它在非调试模式下只传输一次?睡眠模式是否影响了ble广告?
对于睡眠模式,我已经进行了以下更改。
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()”。我重复这些步骤6秒,我在我的应用程序中获得多堆广告点击。每次当我调用'user_app_adv_start()'我在我的应用程序中只有1个点击,直到我停止广告并再次调用它。
为什么'user_app_adv_start()'只广告数据一次?
请您可以分享我的标志数据的示例代码,用于在外部中断上唤醒并修改广告字符串并传输并睡眠。
问候,
马克
嗨,马克,
让我检查一下,我会回复你。
谢谢,PM_DIALOG.
嗨,马克,
arch_main.c是SDK文件,强烈建议不要修改任何SDK文件。所有的修改都应该在应用层中,在以user_开头的字段中完成。所有其他文件作为SDK相关的,如果其中任何一个被修改,我们不能保证应用程序将正确工作。SDK应该按照dialog提供的方式使用,不需要任何其他修改。
关于你的源代码,我不能编译它,因为我得到两个错误。请参阅下面的diff文件如何停止不可连接的广告,把设备在睡眠模式和唤醒它。我的建议是开始ble_app_sleepmode的SDK的例子,其中包含广告数据更新。如何构建应用程序以及如何更新信标数据取决于您。请按照SDK的ble_app_sleepmode示例中的步骤操作。
谢谢,PM_DIALOG.
嗨pm_dialog,
1)你编译我的代码时,你得到了什么样的错误?
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