你好,
我们使用的是SDK 5.0.4,我正在查看user_sleepmode示例。
它看起来像程序侦听到两个案例中的按钮单击中断。
第一种情况是在连接期间。开始听,user_app_set_button_event.
被调用并执行:
wkupct_register_callback(user_app_button_press_cb);
wkupct_enable_irq (WKUPCT_PIN_SELECT (GPIO_BUTTON_PORT GPIO_BUTTON_PIN),
wkupct_pin_polarity(gpio_button_port,gpio_button_pin,next_event),//极性
1, // 1事件
10);
并且倾听是停止的user_app_disable_button
这电话wkupct_disable_irq ();
.
聆听回调(user_app_button_press_cb.
)也称user_app_set_button_event.
要保持按钮单击按钮(实际上它侦听在按钮模式下切换,通过选择右“Next_Event”)。
第二种情况是当程序停止广告(10秒后)。当user_app_add_undirect_complete.
被称为状态GAP_ERR_CANCELED.
(即它是一个故意的广告停止)它叫:
arch_ble_ext_wakeup_on ();
//配置唤醒按钮
app_button_enable ();
的目的arch_ble_ext_wakeup_on
是:“让BLE核心进入永久睡眠。只有外部事件才能唤醒它。”.它只是将内部标志设置为true。
然后,app_button_enable
呼叫:
app_easy_wakeup_set (app_wakeup_cb);
wkupct_register_callback (app_button_press_cb);
wkupct_enable_irq(wkupct_pin_select(gpio_button_port,gpio_button_pin),//选择pin(gpio_button_port,gpio_button_pin)
wkupct_pin_polarization (GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, wkupct_pin_polarization _low), //极性低
1, // 1事件
40);
即它拯救了app_wakeup_cb
除了将来召唤app_easy_wakeup.
,并对第一种情况运行类似的代码,以便开始侦听按钮中断。
当中断发生时,app_button_press_cb.
被调用并执行:
if(getBits16(sys_stat_reg,per_is_down))
{
periph_init ();
}
...
如果我理解正确,在深度睡眠期间必须在外部唤醒中调用此代码(在使用延长睡眠时调用它是有害的吗?)。
然后,App_Button_Press_CB继续调用:
如果(arch_ble_ext_wakeup_get ())
{
arch_set_sleep_mode (app_default_sleep_mode);
arch_ble_force_wakeup ();
ARCH_BLE_EXT_WAKEUP_OFF();
app_easy_wakeup ();
}
i.e. it checks that the external-wakeup-flag is on, initializes the sleep-mode (app_default_sleep_mode is deep-sleep), wakes up the BLE, turn off the external-wakeup flag (i.e. timers and BLE events can now wake up too) and callsapp_easy_wakeup()
(呼叫app_wakeup_cb
正如我之前解释的那样)。
第二种情况下机制有哪些优点?我们可以避免呼唤arch_ble_ext_wakeup_on ()
这样我们就不需要重新配置睡眠模式并重新唤醒BLE。打电话有什么意义arch_ble_ext_wakeup_on ()
如果程序没有任何定时器并且不通告(即,定时器和BLE事件无法唤醒该程序不管怎样-所以只有外部唤醒才能做到)。
如果我们使用,该计划会在深睡眠期间消耗更少的电力arch_ble_ext_wakeup_on
?
第二个案子怎么就没起作用了wkupct_disable_irq()
?之后要睡觉吗arch_ble_ext_wakeup_on
也就是说你不用打电话了wkupct_disable_irq()
在你醒来之后?
谢谢,
奥伦佐莫
你好,奥伦,
很抱歉没有及时回答你的问题……
你好,信用证,
谢谢你提供的信息。
我们现在注意到CFG_MAX_SLEEP_DOURATION_EXTERNAL_WAKEUP_MS参数 - 该
rwip_sleep ()
功能非常复杂,但我们理解你的解释。我们希望模块尽可能长时间保持深度睡眠,不要每10秒醒来一次。我们不关心轮询UART——在我们的用例中,一旦模块被烧毁,它将永远不会连接到UART。
是否可以增加CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS参数?如果是,最大值是多少?
我想我们应该用
arch_ble_ext_wakeup_on
当我们想要深度睡眠直到外部醒来。然而,在某些情况下,我们只是想要长时间的深度睡眠(几小时,几天)-我们通过创建一个周期计时器KE_TIMER_DELAY_MAX-1
和一个计数器。我们可以每300秒醒来一次,但不想每10秒醒来一次……问候,
奥伦佐莫
注:
我们不太关心不精确的时间——如果我们把计时器设置为1小时,我们就不关心它是在50分钟后还是70分钟后醒来。20%的精确度对于我们的用例来说已经足够好了。
你好,奥伦,
是的,您可以修改值CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS从1秒到最大23.3小时(值将被分配在秒)。当arch_ble_ext_wakeup_on调用它将抑制此值将BLE放入永久睡眠中,这对于睡眠持续时间的任何值相同。但是,如果arch_ble_ext_wakeup_off被调用,那么Sleep_Duration的值将生效。
为您的第二个要求,我还没有完全理解用例。你能详细说明这种情况吗?
但是,你可以通过改变上面提到的定义来延长睡眠时间。这将控制BLE的苏醒时间。但是,可以通过调用ARCH_BLE_EXT_WAKE_ON()要在外部事件上唤醒(或者),您还可以使用计时器作为唤醒机制,而不是外部事件。
注意:BLE事件的睡眠过程(假设10s)由智能算法管理,该算法将决定是否让BLE进入睡眠状态。当我们在某个随机时间唤醒BLE时,该算法将检查返回睡眠或保持清醒等待下一个正常事件(比如广告)是否有效,根据这个决定,这可能会消耗比我们预期更多的能量。请在安排叫醒时考虑这一点
问候,
LC.
你好LC,
例如,当我们有传感器(按钮)并且我们想要深度睡眠,直到外部事件发生或直到1小时过去(自从我们开始睡觉),那么第二个要求是。
我们决不能叫
arch_ble_ext_wakeup_on
在这种情况下,如果没有外部事件发生,我们需要一个计时器在1小时后唤醒。app_easy_timer
不应该用上面的值调用KE_TIMER_DELAY_MAX-1
(5分钟)所以我们使用定时器KE_TIMER_DELAY_MAX-1
和初始化为12的倒计时计数器。当timer-callback被调用时,我们将计数器减少1,然后:
-如果计数器大于0,我们重新创建计时器(延时
KE_TIMER_DELAY_MAX-1
也就是5分钟)。-如果计数器是0,我们知道12*5min = 1小时已经过去。
如果在这两者之间发生了外部事件,我们就取消计时器。
我觉得这个技巧应该是内置的
app_easy_timer
如果使用大延迟(在V5.0.4中实施)app_easy_timer
调用assert_error(delay,即不允许延迟大延迟)。
您是否知道默认的10秒唤醒(由于
CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS
)也发生在以前的SDK版本中?具体而言,我想了解3.0.4和3.0.8版本。我们将增加值到23.3小时,但我们已经有很多模块已经与以前的SDK燃烧。问候,
奥伦佐莫
你好,信用证,
23小时为82800000毫秒。
MAX_SLEEP_DURATION_EXTERNAL_WAKEUP
被定义为MS_TO_SLOTS_CONVERT (CFG_MAX_SLEEP_DURATION_EXTERNAL_WAKEUP_MS)
和ms_to_slots_convert(x)
宏给(int)((1000 * x) / 625)
.乘以1000会产生一个编译警告:“整型运算结果超出范围”(尽管最终值除以625后在这个范围内)。
一个快速的解决办法是将宏改为:
(int)((1000 * (long long)x) / 625)
.只是想让你知道…
问候,
奥伦佐莫
你好,奥伦,
截至目前,我们建议的是使用计时器并重新启动时间,直到您达到所需的时间。因为这是最好的方法,也有助于您的调试。
注意:我们不建议更改值MAX_SLEEP_DURATION_EXTERNAL_WAKEUP因为它有效地改变了SDK实现。它在以前的3.0.4和3.0.8中也是如此。
我们将考虑您的建议,将其作为默认选项app_easy_timer。但是,截至目前它不可用作默认功能。
此外,感谢您建议更改宏。我会检查出来并升级以进行更正。
问候,
Leepeng