你好
我在DA14585 / 6上围绕深度睡眠实现有所了解。
SDK包含以下功能:
静态void put_system_into_deep_sleep(void)
{
#if定义(cfg_ext_int_wakeup_deep_sleep)&&!定义(cfg_por_wakeup_deep_sleep)
//配置唤醒中断的按钮
app_button_enable();
gpio_setinactive(gpio_led_port,gpio_led_pin);
//设置深睡眠 - 外部中断唤醒
ARCH_SET_DEEP_SLEEP(TRUE);
#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(FALSE);
#别的
// 没做什么。
//系统最终将输入所选的扩展睡眠状态。
//如果将相应的GPIO配置为唤醒中断,则按按钮按下将唤醒系统。
#万一
}
但是文档说明在从深睡眠中恢复时,设备将始终通过全面启动。如果这是正确的,#if编译器指令的变化是什么?cfg_ext_int_wakeup_deep_sleep switch会导致不同的行为吗?
关于同一主题的,是可以调试在所有深度睡眠唤醒,而无需刻录OTP - 我想提交到测试设备之前测试我的代码,虽然设备醒来,因为我确定没有恢复广告期待。
我在BLE_APP_PERITELAL上基于此项目,其中还使用BLE_APP_SLEEPMODE和PROX_REPORTER使用的提取物。
谢谢!
嗨Boydy1989,
#if编译器指令检查cfg_ext_int_wakeup_deep_sleep是否没有定义cfg_por_wakeup_deep_sleep。如果该条件为真,则设备将从外部中断唤醒,否则它将从上电复位(POR)按钮唤醒。通过定义这两个Hashtag定义,您可以选择芯片如何从深度睡眠唤醒,因此定义CFG_EXT_INT_WAKESUP_DEEP_SLEEP将如上所述在您的应用程序中导致不同的行为。为了从深度睡眠中唤醒,您的代码必须在OTP中,以便将其复制到Sysram,并在执行之后进行。根据DA14585 / 586 SDK 6软件平台参考(UM-B-079)用户手册文档,SYSRAM块关闭,没有保留,因此您将无法安装调试器。但是,SDK中有一个选项可以在仿真深度睡眠中的开发模式下运行代码,并且没有关闭SYSRAM。要在开发模式下运行代码,请在da1458x_config_basic.h标题文件中定义CFG_DEVELLE_DEBUG。
谢谢,PM_DIALOG.
谢谢你的澄清!
我刚刚尝试过这个CFG_Debug开关,我仍然存在问题 - 设备出现在外部中断的情况下重置OK,但它不会按预期开始广告。
我的代码为这些,主要从示例复制。
/ **
****************************************************************************************
* @brief处理app_wakeup_msg当设备退出深度睡眠时发送。按按钮触发。
* @return void.
****************************************************************************************
* /
静态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();
}
//如果状态不空闲,请忽略该消息
if(ke_state_get(task_app)== app_connectable)
{
user_app_adv_start();
}
}
/ **
****************************************************************************************
* @brief按钮按回调函数。在Wkupct驱动程序中注册。
* @return void.
****************************************************************************************
* /
静态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();
}
}
void app_button_enable(void)
{
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_polarity(gpio_button_port,gpio_button_pin,wkupct_pin_polarity_low),//极性低
1,// 1事件
0);// debouncing time = 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.