134***172
1.软件版本:GR551x_SDK_V1.7.0
2.MCU型号:GR5515IGND。
问题描述:在进入深度睡眠前,已配置了唤醒条件。hal_pwr_set_wakeup_condition(PWR_WKUP_COND_EXT);
hal_pwr_config_ext_wakeup(PWR_EXTWKUP_PIN0|PWR_EXTWKUP_PIN1|PWR_EXTWKUP_PIN2, PWR_EXTWKUP_TYPE_FALLING);
使用的是用AON_GPIO来唤醒,没有进入深度睡眠前,调试时按按键是可以进入中断的(下降沿触发中断),相关的产品工作没有发现问题,
void EXT2_IRQHandler(void)
{
enter_sleep_flag=0;
hal_aon_gpio_irq_handler();
}
按键的IO口都是AON_GPIO口,
void key_init(void)
{
// app_gpiote_init(param_key, sizeof (param_key) / sizeof (app_gpiote_param_t));
aon_gpio_init_t gpio_key_config = AON_GPIO_DEFAULT_CONFIG;
gpio_key_config.mode = AON_GPIO_MODE_IT_FALLING;
gpio_key_config.pin = POWER_KEY_PIN | INTENSITY_KEY_PIN | MODE_KEY_PIN;
gpio_key_config.pull = AON_GPIO_PULLUP;
hal_aon_gpio_init(&gpio_key_config);
hal_nvic_clear_pending_irq(EXT2_IRQn);
hal_nvic_enable_irq(EXT2_IRQn);
}
但是进入深度睡眠后,hal_pwr_enter_chip_deepsleep(); 按按键唤醒不了,希望帮忙解答,非常感谢!
Darren
在裸机环境中,需要调用SDK提供的,pwr_mgmt_schedule()接口才能实现自动功耗管理以及原地睡眠唤醒,目前hal_pwr_enter_chip_deepsleep()接口只能实现芯片睡眠,但是其他相关的外设寄存器保存,MCU相关寄存器保存,以及睡眠唤醒后的相关恢复动作并没有实现,故不建议使用它
{-}{-}
您好!
GR551x支持ative,deep sleep(也叫sleep),ultra deep sleep模式。
常用的是deep sleep 模式,该模式下,支持RAM retention,同时支持AON_GPIO,sleep timer等唤醒,对于电源管理,不建议基于HAL的example 开发,建议基于APP 的example开发,原因是APP已经默认包含了睡眠管理的机制,这里推荐参考PCS工程。
HAL example路径(不推荐):GR551x_SDK_V1.7.0\projects\peripheral
APP example 路径(推荐):GR551x_SDK_V1.7.0\projects\peripheral_app
关于相关的用法,可以参考如下帖子的答复:
https://developers.goodix.com/zh/bbs/detail/2b6c7b60365841f29757f505b0d2c8e8
开始使用GR551x的低功耗模式
在GR551x 的SDK中,默认支持非RTOS的example以及RTOS 的example,开发者可参考如下关键步骤增加低功耗的功能。
在GR551x SDK 中,默认提供了一个PCS(Power Consumption Service)工程,该示例工程中,已经实现了低功耗,开发者可以用于测量功耗数据。
工程路径:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs
设置模式
active/idle/sleep模式
文件:
GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs\Src\platform\user_periph_setup.c
void app_periph_init(void)
{
…
pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);
}
说明:
这里要特别注意,设置模式之后,并不会马上进入对应的模式,这里只是设置系统想进入的模式,系统会在 pwr_mgmt_schedule()中进行策略判断,根据执行情况,选择进入对应模式的时机点。
以上pwr_mgmt_mode_set()接口,可支持如下参数:
文件:GR551x_SDK_V1.7.0\components\sdk\gr55xx_pwr.h
/**@brief power manager model. */
typedef enum
{
PMR_MGMT_ACTIVE_MODE = 0x0, /**< Full speed state. */
PMR_MGMT_IDLE_MODE, /**< Idle state. */
PMR_MGMT_SLEEP_MODE, /**< Deep sleep state. */
} pwr_mgmt_mode_t;
b. Ultra deep sleep 模式
调用pwr_mgmt_ultra_sleep()接口,该接口调用后,系统会直接进入ultra
deep sleep 模式;
初始化BLE协议栈
文件:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs\Src\user\main.c
ble_stack_init(&s_app_ble_callback, &heaps_table);
说明:
如不使用BLE功能,可不调用该接口。
调用schedule
文件:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs\Src\user\main.c
while (1)
{
pwr_mgmt_schedule();
}
在非RTOS 环境下,必须调用pwr_mgmt_schedule(),方便SDK 调度,切换至对应的模式。
在GR551x SDK 中,默认提供了一个ble_app_template_freertos工程,该示例工程中,默认已加入了低功耗管理的代码。
工程路径:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos
设置模式
文件:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos\Src\platform\user_periph_setup.c
void app_periph_init(void)
{
…
pwr_mgmt_mode_set(PMR_MGMT_SLEEP_MODE);
}
说明:
这里要特别注意,设置模式之后,并不会马上进入对应的模式,这里只是设置系统想进入的模式,系统会在FreeRTOS中tasks.c 文件的prvIdleTask进行策略判断,prvIdleTask中已经默认集成了schedule的接口vPortEnterDeepSleep,该接口的功能与非 RTOS 的pwr_mgmt_schedule()接口功能类似,系统根据执行情况,选择进入对应模式的时机点。
以上pwr_mgmt_mode_set()接口,可支持如下参数:
文件:GR551x_SDK_V1.7.0\components\sdk\gr55xx_pwr.h
/**@brief power manager model. */
typedef enum
{
PMR_MGMT_ACTIVE_MODE = 0x0, /**< Full speed state. */
PMR_MGMT_IDLE_MODE, /**< Idle state. */
PMR_MGMT_SLEEP_MODE, /**< Deep sleep state. */
} pwr_mgmt_mode_t;
文件: GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos\Src\user\main.c
ble_stack_init(&s_app_ble_callback,
&heaps_table); /*<
init ble stack*/
说明:
在FreeRTOS 环境下,必须调用协议栈初始化,否则无法正常使用功耗模式,主要原因是FreeRTOS 有复用BLE协议栈的Timer。
文件:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos\Src\user\main.c
int main(void)
{
app_periph_init(); /*<init user periph .*/
ble_stack_init(&s_app_ble_callback, &heaps_table); /*< init ble stack*/
xTaskCreate(vStartTasks, "create_task", 512, NULL, 0,
NULL); /*< create some demo tasks
via freertos */
vTaskStartScheduler(); /*< freertos run all tasks*/
for (;;); /*< Never perform here */
}
谢谢!
打开微信,使用“扫一扫”即可关注