CN / EN
CN / EN

提问

设计支持

您的项目私密技术问题如需获得一对一支持,请点击下方联系我们。

深度睡眠唤醒问题 GR551x

134***172

2022-10-26 09:11

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(); 按按键唤醒不了,希望帮忙解答,非常感谢!


0收藏

0赞成

Darren

2022-10-26 11:24

在裸机环境中,需要调用SDK提供的,pwr_mgmt_schedule()接口才能实现自动功耗管理以及原地睡眠唤醒,目前hal_pwr_enter_chip_deepsleep()接口只能实现芯片睡眠,但是其他相关的外设寄存器保存,MCU相关寄存器保存,以及睡眠唤醒后的相关恢复动作并没有实现,故不建议使用它

1条评论

1赞成

0收藏

您的评论

{-}{-}

汇顶员工
2022-10-26 09:39

您好!

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

1.

开始使用GR551x的低功耗模式

GR551x SDK中,默认支持非RTOSexample以及RTOS example,开发者可参考如下关键步骤增加低功耗的功能。

1.1 使用非RTOS example

GR551x SDK 中,默认提供了一个PCSPower Consumption Service)工程,该示例工程中,已经实现了低功耗,开发者可以用于测量功耗数据。

工程路径:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_pcs

1.

a.

设置模式

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功能,可不调用该接口。


1.1.3

调用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 调度,切换至对应的模式。


1.2 使用RTOS example

GR551x SDK 中,默认提供了一个ble_app_template_freertos工程,该示例工程中,默认已加入了低功耗管理的代码。

工程路径:GR551x_SDK_V1.7.0\projects\ble\ble_peripheral\ble_app_template_freertos

5.2.1

设置模式

文件: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;


初始化BLE协议栈

文件: 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。


调用schedule

文件: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 */

}

谢谢!



2条评论

0赞成

0收藏

您的评论

登录后可回答问题,请 注册

我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注