你好
我在DA14585 / 6上围绕深度睡眠实现有所了解。
SDK包含以下功能:
静态孔隙put_system_into_deep_sleep(空白)
{
# define (CFG_EXT_INT_WAKEUP_DEEP_SLEEP) && !define (CFG_POR_WAKEUP_DEEP_SLEEP)
//配置唤醒中断的按钮
app_button_enable ();
gpio_setinactive(gpio_led_port,gpio_led_pin);
//设置深度睡眠-外部中断唤醒
arch_set_deep_sleep(真正的);
#elif定义(cfg_por_wakeup_deep_sleep)&&!定义(cfg_ext_int_wakeup_deep_sleep)
//配置POR按钮
gpio_enableporpin(gpio_button_port,gpio_button_pin,gpio_por_pin_polarity_low,gpio_getportime());
//设置深睡眠 - 醒来
arch_set_deep_sleep(假);
#别的
/ /什么都不做。
//系统最终将输入所选的扩展睡眠状态。
//如果相应的GPIO被配置为唤醒中断,则按下一个按钮将唤醒系统。
# endif
}
但文档表明,当从深度睡眠中恢复时,设备总是要经历一次全面启动。如果这是正确的,那么# If编译器指令会发生什么变化?CFG_EXT_INT_WAKEUP_DEEP_SLEEP开关会导致不同的行为吗?
在同样的主题上,是否有可能在没有烧录OTP的情况下调试深度睡眠唤醒——我试图在提交到测试设备之前测试我的代码,尽管设备唤醒OK,但它没有像我预期的那样恢复广告。
我在BLE_APP_PERITELAL上基于此项目,其中还使用BLE_APP_SLEEPMODE和PROX_REPORTER使用的提取物。
谢谢!
嗨boydy1989,
#if编译器指令检查CFG_EXT_INT_WAKEUP_DEEP_SLEEP和CFG_POR_WAKEUP_DEEP_SLEEP是否未定义。如果该条件为真,则设备将从外部中断中唤醒,否则将从Power-on-Reset (POR)按钮唤醒。通过定义这两个标签定义,您可以选择芯片将如何从深度睡眠中唤醒,因此定义CFG_EXT_INT_WAKEUP_DEEP_SLEEP将在您的应用程序中导致前面提到的不同行为。为了从深度睡眠中醒来,您的代码必须在OTP中,以便复制到SysRAM中,然后执行。根据DA14585/586 SDK 6软件平台参考(UM-B-079)用户手册文档,SysRAM被阻塞,没有保留任何东西,所以您将无法附加调试器。但是,SDK中有一个选项可以在开发模式下运行代码,该模式模拟深度睡眠,SysRAM没有关闭。为了在开发模式下运行代码,请在da1458x_config_basic.h头文件中定义CFG_DEVELOPMENT_DEBUG。
谢谢,PM_Dialog
谢谢你的澄清!
我刚刚尝试了这个CFG_DEBUG开关,但我仍然有一个问题-设备似乎从外部中断复位OK,但它没有像预期的那样开始发布。
我的代码主要是从示例中复制的。
/ **
****************************************************************************************
* @brief处理设备退出深度睡眠时发送的APP_WAKEUP_MSG。按下按钮触发。
* @return无效
****************************************************************************************
*/
静态void app_wakeup_cb(void)
{
if(getBits16(sys_stat_reg,per_is_down))
{
periph_init();
}
if(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();
}
//如果state不是空闲的,忽略消息
if (ke_state_get(TASK_APP) == APP_CONNECTABLE)
{
user_app_adv_start ();
}
}
/ **
****************************************************************************************
* @brief按钮按回调函数。在Wkupct驱动程序中注册。
* @return无效
****************************************************************************************
*/
静态void app_button_press_cb(void)
{
if(getBits16(sys_stat_reg,per_is_down))
{
periph_init();
app_wakeup_cb();
}
if(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();
}
}
空白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_极性(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, WKUPCT_PIN_POLARITY_LOW), //极性低
1, // 1事件
0);//恢复时间= 0
}
你能给点建议吗?
再次感谢!
嗨jun-ichi tobe,
当DA14585配置为在深度休眠模式下仅配置唤醒控制器或POR电路,根据所选选项,仍然接通。如前所述,Sysram块关闭,没有保留任何内容,因此您将无法安装调试器。如果要从深度睡眠唤醒,则代码必须位于OTP中,以便将其复制到SYSRAM中,并在此之后执行。因此,您无法从深度睡眠模式唤醒您的设备。在DA14585 SDK中,可以选择使用OTP副本在扩展睡眠模式下配置设备。在此模式下,如果OTP的设备靴子和SysRAM的仅32KB(框4)保持开启,则存在OTP副本。因此,为了在不从OTP启动的情况下唤醒,我建议您将设备配置为扩展睡眠模式或使用OTP副本的扩展睡眠模式。否则,在深度睡眠模式下,Sysram已关闭,您将无法唤醒。我之前的帖子中的更正是使用CFG_DEVELVELMMENT_DEBUG和深度睡眠配置,SYSRAM已关闭,因此您无法唤醒。
谢谢,PM_Dialog