你好
我有一个关于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);
# define (CFG_POR_WAKEUP_DEEP_SLEEP) && !define (CFG_EXT_INT_WAKEUP_DEEP_SLEEP)
//配置por的按钮
GPIO_EnablePorPin(GPIO_BUTTON_PORT, GPIO_BUTTON_PIN, GPIO_POR_PIN_POLARITY_LOW, GPIO_GetPorTime());
//设置深度睡眠- POR唤醒
ARCH_SET_DEEP_SLEEP(FALSE);
其他#
// 没做什么。
//系统最终将进入所选择的Extended sleep状态。
//如果将相应的GPIO配置为唤醒中断,则按按钮按下将唤醒系统。
#万一
}
但是文档说明在从深睡眠中恢复时,设备将始终通过全面启动。如果这是正确的,#if编译器指令的变化是什么?cfg_ext_int_wakeup_deep_sleep switch会导致不同的行为吗?
在同一主题上,可以在不刻录OTP的情况下调试深度睡眠唤醒 - 我正在尝试在提交测试设备之前测试我的代码,虽然设备醒来确定它不会恢复广告期待。
我已经在ble_app_peripheral上建立了这个项目,使用了从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.
****************************************************************************************
* /
静态孔隙app_wakeup_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
}
如果(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.
****************************************************************************************
* /
静态孔隙app_button_press_cb(空白)
{
如果(GetBits16 (SYS_STAT_REG PER_IS_DOWN))
{
periph_init ();
app_wakeup_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 ();
}
}
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托比,
当DA14585配置为深度睡眠模式时,根据选择的选项,只有唤醒控制器或POR电路保持打开状态。如前所述,SysRAM阻塞,没有保留任何内容,因此您将无法附加调试器。如果您想从深度睡眠中醒来,您的代码必须在OTP中,以便复制到SysRAM中,然后执行。因此,你无法从深度睡眠模式中唤醒你的设备。在DA14585 SDK中,有一个选项可以使用OTP拷贝将设备配置为扩展睡眠模式。在这种模式下,如果设备从OTP启动,只有32kB (block 4)的SysRAM保持打开状态,那么就有一个OTP副本。所以,为了不从OTP启动而唤醒,我建议你配置你的设备为扩展睡眠模式或扩展睡眠模式与OTP拷贝。否则,在深度睡眠模式下,系统ram将被关闭,您将无法醒来。在我上一篇文章中纠正的一点是,使用CFG_DEVELOPMENT_DEBUG和深度睡眠配置时,系统ram是关闭的,因此您将无法醒来。
谢谢,PM_DIALOG.